Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0536: Nachrichten per API übers Netzwerk senden

 von 

Beschreibung 

Mit diesem Tipp kann man ganz einfach Nachrichten per API übers Netzwerk / Internet senden. Als Empfänger kann man Computername oder IP angeben. Wird eine Arbeitsgruppe angegeben wird an alle PCs in dieser Arbeitsgruppe die Nachricht gesendet.
(XP,2000,NT only!)

Update: Ab Windows 2000 kann nun auch ein Absender angegeben werden.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

NetMessageBufferSend

Download:

Download des Beispielprojektes [2,97 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'--------- Anfang Projektdatei NetSend per API.vbp  ---------
'---- Anfang Formular "Form1" alias NetSend per API.frm  ----
' Steuerelement: Textfeld "Text2"
' Steuerelement: Textfeld "Text1"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Beschriftungsfeld "Label3"
' Steuerelement: Beschriftungsfeld "Label2"
' Steuerelement: Beschriftungsfeld "Label1"
'Autor:  Helge Rex   helge@activevb.de 
'Sendet eine Nachricht über das Netz an andere User
'Hinweis: Tip funktioniert nur unter NT3.5, NT3.51, NT4, 2000, XP und
' neuer.

Option Explicit

'   Die API, mit der die Daten verschickt werden
Private Declare Function NetMessageBufferSend Lib "netapi32.dll" ( _
    lpServerName As Any, _
    lpMsgName As Byte, _
    lpFromName As Any, _
    lpBuf As Byte, _
    ByVal lnBufLen As Long _
) As Long

'   Konstante, die von der API bei Erfolg geliefert wird
'   Im Fehlerfall ist die Rückgabe ungleich NERR_Success. Was dieser
'   Fehler dann bedeutet, ist in der MSDN nachzulesen.
Private Const NERR_Success As Long = 0&
 
Public Function SendMsg(SendTo As String, Message As String) As Long
    '   Diese Funktion übernimmt die eigentliche Arbeit.
    '   Erwartet werden Empfänger und Nachricht.
    '   Der Empfänger kann der Username des Empfängers, ein
    '   Computername, ein Domainname, ein Arbeitsgruppenname oder *
    '   (für beliebige erreichbare Ziele) sein.

    '   Speicher reservieren
    Dim WrittenTo() As Byte     '   enthält den Empfänger der Nachricht
    Dim MSGBuffer() As Byte     '   enthält die zu sendende Nachricht
    
    '   Speicher initialisieren (Strings in WideChar konvertieren)
    WrittenTo = SendTo & vbNullChar
    MSGBuffer = Message & vbNullChar
    
    '   Meldung absetzen (Fehler interessieren nicht wirklich, wir
    '   müssen nur wissen, ob die Nachricht gesendet wurde)
    SendMsg = (NetMessageBufferSend(ByVal 0&, WrittenTo(0), ByVal 0&, _
    MSGBuffer(0), UBound(MSGBuffer)) = NERR_Success)

    '   Zusatz für Windows ab 2000 (nicht NT):
    '   Ab W2K aufwärts ist es möglich, den Absender der Nachricht
    '   anzugeben. Dazu muß der Funktionskopf um einen weiteren
    '   Parameter (Datentyp String) angegeben werden. Dieser Parameter
    '   ist dann analog zu den anderen in WideChar zu konvertieren.
    '   Die Nachricht wird dann so verschickt:
    'SendMsg = (NetMessageBufferSend(ByVal 0&, WrittenTo(0), _
    WrittenBy(0), MSGBuffer(0), UBound(MSGBuffer)) = NERR_Success)
End Function

Private Sub Command1_Click()
    '   Aufruf der Funktion
    Dim Result As Boolean
    Result = SendMsg(Text1, Text2)
    If Result Then
        MsgBox "Die Nachricht wurde verschickt."
    Else
        MsgBox "Die Nachricht konnte nicht verschickt werden."
    End If
End Sub

'----- Ende Formular "Form1" alias NetSend per API.frm  -----
'---------- Ende Projektdatei NetSend per API.vbp  ----------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 36 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Mike Bonitz am 06.08.2008 um 00:34

@Helge:
Die Buddies sind in einer Tabelle in Access gespeichert und werden nacheinander abgefragt, ob sie ereichbar sind.
Dazu verwende ich "SendMsg()": als Message wird ein leerer String ("") gesendet, wodurch die Meldung beim Empfänger nicht angezeigt wird. Das Ergebnis wird im jeweiligen Datensatz der Tabelle gespeichert und angezeigt.

Könnte man vllt. unter "Declare Function" noch eine Funktion einbauen, die die Suche zeitlich begrenzt, z.B. auf 5000 Millisekunden?

Kommentar von Helge Rex am 05.08.2008 um 10:51

@Mike Bonitz:
Der Code dieses Tipps sendet nur Nachrichten, er kann keine Buddylist erstellen oder verwalten.

Ich schlage vor, daß Du in unserem VB6-Forum einen Thread mit Deiner Frage erstellst. Hilfreich ist dabei auch der Code, mit dem die Liste erstellt wird.

Kommentar von Mike Bonitz am 05.08.2008 um 02:23

Ich habe den Code für mein eigenes kleines Popup-Programm (Access 2003) verwendet und es funktioniert sehr gut.

Ich habe darin eine Buddyliste, die beim Starten des Programms und optional in Abständen die Erreichbarkeit der Buddies überprüft.

Nun das Problem:
Wenn Buddies nicht angemeldet sind, sucht die API viel zu lange im Netzwerk (manchmal über 5 Minuten pro Buddy). Angemeldete Buddies werden schon nach Millisekunden gefunden.
Wie kann ich die Suche nach einem Buddy z.B. auf 5 Sekunden begrenzen?

Kommentar von Helge Rex am 23.09.2006 um 15:03

Weil hier immer wieder Rückfragen kommen, die die Funktionsfähigkeit des Codes anzweifeln, wenn ein Absender angegeben wird: Es sind nur Absender gültig, die der lokalen Maschine (wenn lpServername leer bleibt) oder der angegebenen Maschine (wenn lpServername einen Wert enthält) bekannt sind. Soll also eine Nachricht mit dem Absender "Donald Duck" versandt werden, muß auf der Maschine, über die die Nachricht versandt werden soll, ein Konto mit diesem Namen existieren.

Kommentar von Steve am 17.09.2006 um 19:04

bei funtz es nicht...
ich habe WinXP Home SP2 und VB6
er sagt zwar "Name erfolgreich geändert" aber wenn ich mir jezt selber einen nachricht sende, kommt da immer noch "Nachricht von Rechner an Rechner
Hallo"
könnt ihr mir agen was falsch ist?
mfg

Kommentar von Thorben B. am 12.09.2006 um 12:44

Guten Tag alle zusammen!

leider funktioniert die Absenderangabe bei mir nicht. Ich verwende Windows XP mit SP2. Visual Basic (ich verwende die 2005 Express Edition) gibt bei mir mehrere Fehlermeldungen aus. Ich bin allerdings auch noch ein ziemlicher Programmieranfänger und würde mich über jede Hilfestellung sehr freuen. Ist es eventuell möglich, den kompletten Code inklusive Absenderangabe hier noch einmal zu posten? Darüber würde ich mich sehr freuen.

Mit freundlichen Grüßen, Thorben B.

Kommentar von Rene am 12.01.2006 um 21:17

Vielen Dank dafür! Funktioniert unter XP und VB6 sehr gut.
Allerdings vermeide ich die Absenderangabe und schreibe den Absender am Ende der Nachricht in den Text. So kann man die u.g. Probleme auch umgehen :-)

Zum Thema "Prüfen, ob`s ankommt":
Wenn man nur an einen Rechnernamen adressiert, kann man diesen vorher anpingen, um zu sehen, ob er überhaupt online ist.

Mit der "PING"-Function unter http://www.shadoware.de/vb/ping.html kann man das innerhalb weniger Millisekunden vorab prüfen. Einem Offline-Rechner braucht man ja schliesslich keine MSG zu senden :-)

Leider klappt "PING" nicht mit Usernamen, sondern nur mit Rechnernamen (übrigens auch mit www.xyz.de - Zieladressen).

Gruss
Rene

Kommentar von Helge Rex am 28.12.2005 um 18:53

@Gino:
Sofern der Switch diese Ports weiterleitet, wird es auch mit Switch und ohne Internetverbindung funktionieren. Daß Router/Switches, die diese Ports in Internet weiterreichen, falsch konfiguriert sind, brauche ich eigentlich nicht erwähnen, oder doch?


Gruß
Helge

Kommentar von Gino am 28.12.2005 um 17:54

Guten Tag...

Ich hätte eine Frage zu diesem Programm?
Funktioniert es auch in einem Netzwerk welches über einen Switch läuft und über keine Internetverbindung verfügt?

Über eine Antwort würde ich mich sehr freuen

Kommentar von tazzie am 02.12.2005 um 11:36

hi !!!

um das thema aufzugreifen .....

das mit dem absender geht aber nicht ...

die nachricht wird nicht gesendet !!!

hilfe !!!
danke

Kommentar von Helge Rex am 22.09.2005 um 16:49

@Lena:
Diese Frage ist nichts für den Kommentarbereich des Tipps.

Falls Dir einfache Nachrichten reichen, reicht "net send"
Zur genauen Syntax siehe:

net send /?


Gruß
Helge

Kommentar von Lena am 22.09.2005 um 14:32

Hallo. Ich bin noch recht ungeübt im Umgang mit dem Netzwerk. Ich habe mir mir einem Freund ein netzwerk aufgebaut und wir wüssten nun gern wie wir uns Intern Nachrichten senden können. Brauchen wir ein spezielles Programm??Oder hat XP schon was vorgesehen??

Kommentar von Molle am 22.08.2005 um 14:49

Hallo,
ich habe den Code mal nach VB.Net konvertiert und erhalte jetzt eine Fehlermeldung:
In der nachfolgenden Zeile ist eine Declaration "AS ANY" nicht erlaubt.

Private Declare Function NetMessageBufferSend Lib "netapi32.dll" (ByRef lpServerName As Any, ByRef lpMsgName As Byte, ByRef lpFromName As Any, ByRef lpBuf As Byte, ByVal lnBufLen As Integer) As Integer

Wie muß ich das denn unter .NET deklarieren ?

Danke

Kommentar von cyberspeed am 10.07.2005 um 18:32

Hi

komisch bei mir (xp home,sp2) geht * bzw. /domain auch nicht... funktioniert das überhaupt bei irgendjemandem?

ja, das kann man unterbinden... immer vor dem verschicken net .bat datei mit "net name %absender% /add" erstellen und ausführen


mfg cyberspeed

Kommentar von Helge Rex am 29.05.2005 um 11:00

@Juan XH:
Latürnich geht es noch komplizierter, Dein Beispiel zeigt es ja.

Dein Beispiel hat einen wesentlichen Haken: Die Anwendung macht weiter, egal, ob "Net Send" noch arbeitet oder schon fertig ist. Weiterhin werden keinerlei Fehler wahrgenommen. Man könnte Dein Beispiel mit !tipp0148 aufbohren, aber dann kann man ja auch gleich mein Beispiel verwenden, oder?

Kommentar von Juan XH am 29.05.2005 um 10:32

Also ich frage mich ob es noch komplizierter geht,man könnte ja auch gleich zum anderen gehen und im sagen was mann schicken will.Zwar ist meine Lösung nicht so ganz Resourcen freundlich und man erhält keine Bestätigung,dass die Nachricht verschickt wurde,aber sie funktioniert auch,und ist leichter einzubinden (vorallem leichter zu verstehen):

Dim target 'Empfänger
Dim message 'Nachricht
Dim ShellNetApp,cmd
cmd = "net send " & target & " " & message
ShellNetApp = Shell(cmd, vbHide)

Kommentar von Christoph Rust am 30.03.2005 um 13:39

Der Absender funktioniert nur wenn man per NetMessageNameAdd
einen Message-Alias definiert hat. Mit diesem Alias kann man das Absender-Feld füllen.
Welche Absender man wirklich benutzen zu können ohne eine Fehlermeldung zu erhalten kann man mit dem net name in einer Shell sich ansehen, da stehen normalerweise nur der Computername und die UserID.
Warum dass nirgends steht, bei keiner Beschreibung im Internet verstehe ich nicht.

Kommentar von mark am 29.10.2004 um 03:08

der Tipp ist nicht schlecht nur funktionieren 2 Features nicht einmal kommt keine Net send zustande wenn ich '*' als empfänger angebe und auch das ändern des Absenders funktioniert bei mir nicht da kommt auch kein Net send zu stande

Kommentar von Helge Rex am 26.04.2004 um 11:56

Hallo Stefanie,

wenn Du als Empfänger ein * angibst, wird die Nachricht an jeden erreichbaren Empfänger gesendet. Wenn Du als Empfänger den Namen der Arbeitsgruppe oder Domäne angibst, wird die Nachricht an jeden in dieser Arbeitsgruppe oder Domäne gesendet.
Selektiv (also z.B. gleichzeitig an Meier und Müller) geht nicht, diese Funktionalität mußt Du selbst programmieren.


Gruß
Helge

Kommentar von Stefanie Weise am 26.04.2004 um 11:30

Ich habe mal dazu eine Frage.
Gibt es die Möglichkeit mehrere User damit anzusprechen.
Bis jetzt kann man nur einen User die Nachricht senden.

gruß Stefanie

Kommentar von KlausM am 19.04.2004 um 15:32

Das mit dem Absender geht ja noch nicht mal bei XP Home!

Gruß, Klaus

Kommentar von Helge Rex am 02.12.2003 um 17:23

Hallo the_zero,

verwende die Deklaration, die Du hier findest:
http://www.activevb.de/rubriken/apikatalog/deklarationen/netmessagebuffersend.html


Gruß
Helge

Kommentar von the_zero am 02.12.2003 um 13:34

ich habe VB.NET, aber da gibt es die "AS ANY"-Deklaration nicht mehr, wie mach ich das jetzt?

und wie baue ich noch einen absender ein? bitte helft mir

Kommentar von Helge Rex am 24.11.2003 um 14:17

Hallo Stefan,

das kannst Du in der Systemsteuerung bei den Diensten nachschauen (oder in der entsprechenden MMC-Konsole).


Gruß
Helge

Kommentar von Stefan am 23.11.2003 um 22:18

Hallo,

hm, ich steh jetzt glaube ich auf dem Schlauch, wo sehe ich denn ob der Nachrichtendienst läuft und wo kann ich ihn ggf. einschalten? Läuft der nicht immer?

Gruß
Stefan

Kommentar von Helge Rex am 23.11.2003 um 14:18

Hallo Stefan,

Bei Dir ist wahrscheinlich der Nachrichtendienst abgeschaltet. Um Nachrichten empfangen zu können, muß der Nachrichtendienst laufen.
Bitte kontrolliere die bei Dir (und auf dem Zielrechner) laufenden Dienste.


Gruß
Helge

Kommentar von Stefan am 23.11.2003 um 13:34

Hallo,

bei mir funktioniert weder unter Windows XP oder 2000 der Code. Nachricht konnte nicht übermittelt werden. Allerdings funktioniert auch ein Shell Aufruf von Net Send nicht. Ist hier noch eine Einstellung notwendig die ich nicht kenne?

Danke Stefan

Kommentar von Helge Trc am 13.07.2003 um 14:27

@Tina:

Entschuldige bitte, das ist mein Fehler gewesen.

So muß es richtig lauten:

Dim WrittenBy() As Byte



Grüße
Helge Rex


Kommentar von Tina Schuster am 10.07.2003 um 22:27

hi,
bei mir kommt mit deinem Code der Fehler
"keine zuweisung an array möglich"... was könnte falsch sein? bei mir sieht es so im Code aus:


Dim WrittenTo() As Byte
Dim MSGBuffer() As Byte
Dim WrittenBy() As String

WrittenTo = SendTo & vbNullChar
MSGBuffer = Message & vbNullChar
WrittenBy = txtFrom.Text & vbNullChar

Kommentar von Helge Rex am 20.06.2003 um 13:53

Hallo zusammen,

Man kann den Absender ab Windows 2000 angeben.
Man deklariere dazu ein neues ByteArray:

Dim WrittenBy() As String

Dieser Absender kann beliebig gefüllt werden. Beispiel:
WrittenBy = Environ$("USERNAME") & vbNullChar

Um den Absender an die API-Funktion zu übergeben, muß das erste "ByVal 0&" durch "WrittenBy(0)" ersetzt werden (natürlich ohne Anführungszeichen).

Unter NT4 geht das aber nicht. Wird ein Absender angegeben, wird die Nachricht nicht mehr verschickt.

Die API-Funktion kann nicht prüfen, ob die Nachricht angezeigt wurde. Sie liefert die Nachricht ab und hat damit ihr Soll erfüllt. Wenn der Nachrichtendienst beim Empfänger abgeschaltet ist, erhält der Absender eine Erfolgsmeldung, obwohl nix angezeigt wird.

Mit VB.Net habe ich null Erfahrungen. Afaik (= as far as i know) ist jede API-Funktion bereits im Framework enthalten, so daß die Deklaration der API-Funktion weggelassen werden kann. Der Rest sollte gleich sein.


Grüße
Helge Rex

Kommentar von Tina Schuster am 26.05.2003 um 20:28

wie geht das mit dem beliebigen Absender?
mfg
Tina

Kommentar von 2Bios am 23.04.2003 um 09:45

Genausogut kann man auch einen Benutzernamen angeben. Auch den eigenen, wems Spass macht.

Kommentar von Rudi am 20.03.2003 um 14:36

Hinweis: Der Parameter lpFromName muss bei NT4 entweder NULL oder der lokale Rechnername sein. Bei Windows 2000 kann der Absendername frei ausgedacht werden.

Kommentar von Tobias am 07.02.2003 um 15:49

Läuft super, zumindest unter VB6.
Kann mir jemand verraten wie ich das in VB.NET hinkrieg?

Kommentar von Vito am 04.02.2003 um 22:09

Alles gut , bis auf ...
leider ist der Empfänger "*" nicht ok! Das Komando ' net send * BLA' kann nicht also abgesetzt werden.

Kommentar von Manu-soft am 05.01.2003 um 18:01

Der Source funktioniert bei existierenden IPS/Computernamen einwandfrei, jedoch gibt es den Empfänger nicht oder ist er nicht erreichbar hängt das Programm ewig, kann man das irgendwie unterbinden?