ctypes + netapi32.dll = NetSend oder Nicht ?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

Hallo Leute!
Hab mich lange nicht mehr gemeldet,
also dachte ich schreibe ich mal wieder was... :D

Ich hoffe ihr könnt mir helfen, denn verstehen tue ich das nicht.
Zu diesem Code:

Code: Alles auswählen

import ctypes

windll = ctypes.windll.LoadLibrary (r"C:\WINXP\system32\netapi32.dll")

servername = "\\COPPERHEAD"
servername = unicode(servername)
msgname = "COPPERHEAD"
msgname = unicode(msgname)
fromname = "Test"
fromname = unicode(fromname)
buf = "Meine Nachricht"
buf = unicode(buf)

def SendMessage (servername,msgname,fromname,buf):
    buflen = len(buf)*2
    back = windll.NetMessageBufferSend(servername,msgname,fromname,buf,buflen)
    return back

SendMessage(servername,msgname,fromname,buf)

Auf der M$ Seite http://msdn.microsoft.com/de-de/library/bb979101.aspx
steht, dass die Strings alle als UniCode übergeben werden müssen,
daher die Formatierung.
Der Name "COPPERHEAD" ist der meines PC's.
Mein Problem ist, dass der Code keinen Fehler zurückgibt.
Jedoch tut sich auch nichts...
Ich weißt nicht ob die Byte Berechnung ("buflen") der Nachricht
richtig ist.
Dazu stand auf der M$ Seite nur :
Specifies a value that contains the length, in bytes, of the message text pointed to by the buf parameter.
Hoffe ich habe das Problem einigermaßen aufgeschlüsselt.
Ich wollte einfach gern mal versuchen eine .dll zu nutzen.
Mfg Jonas :D
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Probier mal das:

Code: Alles auswählen

from ctypes import windll, c_char_p, c_wchar_p, c_int

netapi = windll.netapi32

servername = u'\\COPPERHEAD'
msgname = u'COPPERHEAD'
fromname = u'Test'
buf = 'Meine Nachricht'

def SendMessage (servername, msgname, fromname, buf):
    back = netapi.NetMessageBufferSend(c_wchar_p(servername), c_wchar_p(msgname),
                                       c_wchar_p(fromname), c_char_p(buf),
                                       c_int(len(buf) + 1))
    return back

print SendMessage(servername, msgname, fromname, buf)
Ich weiß aber nicht, was der Rückgabewert (bei mir 123) bedeuten soll.
MfG
HWK
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

hi HWK!
Danke für die schnell Rückmeldung.
Ich glaube ich weiß was 123 bedeuten soll:
http://support.microsoft.com/kb/136437/de
Wenn das FromName NULL oder das Clientcomputer nicht ist, gibt NetMessageBufferSend Fehler 123 (ungültiger Computername) zurück.
Allerdings weiß ich nicht wie ich damit umzugehen habe...
Mfg Jonas
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!
ERROR_ACCESS_DENIED The user does not have access to the requested information.
ERROR_INVALID_PARAMETER The specified parameter is invalid.
ERROR_NOT_SUPPORTED This network request is not supported.
NERR_NameNotFound The user name could not be found.
NERR_NetworkError A general failure occurred in the network hardware.
Public Public Const ERROR_ACCESS_DENIED = 5&
Public Public Const ERROR_INVALID_PARAMETER = 87& ' dderror
Public Public Const ERROR_NOT_SUPPORTED = 50&

Die NERR-Fehler konnte ich auf die Schnelle nicht raus finden

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

hi Gerold!
Vielen Dank für deine schnelle Antwort..., ABER
ich kann damit leider nichts anfangen, denn ich versteh nicht was die
Zahl mit dem `&` bedeuten soll und wie man diese Fehler abfängt und
ausgibt... :oops:
Wenn du einen Ansatz geben könntest, wäre mir geholfen.
MfG Jonas
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

hey Leute!
Braucht mir nicht mir zu helfen, habe das Problem gelöst.

Code: Alles auswählen

import ctypes

windll = ctypes.windll.LoadLibrary (r"C:\WINXP\system32\netapi32.dll")

servername = None ## Hier musste ein None übergeben werden
msgname=raw_input("Empfaenger:")
msgname = unicode(msgname)
fromname = None ## Und hier auch, es sei denn man will den Absender
## fälschen, dann kann man vorher mit unten genannter Funktion
## NetMessageNameAdd einen Namen hinzufügen und diesen dann
## hier angeben
##fromname = unicode(fromname)
buf = raw_input("Nachricht:")
buf = unicode(buf)

def NameAdd (servername,name):
    back = windll.NetMessageNameAdd(servername,name)
    return back

def NameDel (servername,name):
    back = windll.NetMessageNameDel(servername,name)
    return back

def SendMessage (servername,msgname,fromname,buf):
    buflen = len(buf)*2
    back = windll.NetMessageBufferSend(servername,msgname,fromname,buf,buflen)
    return back

DANKE NOCHMAL AN ALLE :D

~~~ PROBLEM GELÖST ~~~

MfG Jonas
Antworten