Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Net Send ohne Absender (https://www.delphipraxis.net/10302-net-send-ohne-absender.html)

Matze 15. Okt 2003 16:27


Net Send ohne Absender
 
Hi!

Ich verwende den Net Send Code:
Delphi-Quellcode:
Send := 'send ' + Edit1.Text + ' ' + Memo1.Text + '';
    ShellExecute (GetDesktopWindow, 'open', 'net.exe', PChar(Send), nil, SW_HIDE);
wobei send ein string ist.

Jetzt ist es ja normal, dass beim PC folgende Meldung kommt:
Zitat:

Nachricht von ... an ...
Kann ich auch den Absender verheimlichen oder wenigstens verändern (anderer Absender-name eingeben)? :gruebel:

sakura 15. Okt 2003 16:36

Re: Net Send ohne Absender
 
Solange Du das Standart "net send" nutzt, nein ;-) Suche mal im Forum nach Code zur Programmierung des Services ;-)

...:cat:...

Matze 15. Okt 2003 16:46

Re: Net Send ohne Absender
 
OK, danke.
Das ist mir etwas zu kompliziert, ich möchte ja nur an einen User eine kleine nachricht schicken. ;)

Duffy 15. Okt 2003 16:51

Re: Net Send ohne Absender
 
Hallo Matze,
diese Funktionen sollten Dir helfen
Delphi-Quellcode:
//-----------------------------------------------------------------------//

//#######################################################################//
//## Function NetSend:                                                ##//
//#######################################################################//
//##      Datum: Änderung:                                            ##//
//##      ====== =========                                            ##//
//##  10.07.2001 Initial Release                                      ##//
//#######################################################################//
{$HINTS OFF}
function NetSend(Dest, Source, Msg: string): Longint; overload;
type
  TNetMessageBufferSendFunction = function(Servername, Mmsgname, FromName: PWideChar; buf: PWideChar; buflen: Cardinal): longint; stdcall;
var
  NetMessageBufferSend: TNetMessageBufferSendFunction;
  SourceWideChar: PWideChar;
  DestWideChar: PWideChar;
  MessagetextWideChar: PWideChar;
  Handle: THandle;
begin
  Handle := LoadLibrary('NETAPI32.DLL');
  if Handle = 0 then
  begin
    Result := GetLastError;
    Exit;
  end;

  @NetMessageBufferSend := GetProcAddress(Handle, 'NetMessageBufferSend');
  if @NetMessageBufferSend = nil then
  begin
    Result := GetLastError;
    exit;
  end;

  MessagetextWideChar := nil;
  SourceWideChar := nil;
  DestWideChar := nil;
  try
    GetMem(MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1);
    GetMem(DestWideChar, 20 * SizeOf(WideChar) + 1);
    StringToWideChar(Msg, MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1);
    StringToWideChar(Dest, DestWideChar, 20 * SizeOf(WideChar) + 1);
    if Source = '' then
    begin
      Result := NetMessageBufferSend(nil, DestWideChar, nil, MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1)
    end
    else
    begin
      GetMem(SourceWideChar, 20 * SizeOf(WideChar) + 1);
      StringToWideChar(Source, SourceWideChar, 20 * SizeOf(WideChar) + 1);
      Result := NetMessageBufferSend(nil, DestWideChar, SourceWideChar, MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1);
      FreeMem(SourceWideChar);
    end;
  finally
    FreeMem(MessagetextWideChar);
    FreeLibrary(Handle);
  end;
end;
{$HINTS ON}
//-----------------------------------------------------------------------//

//#######################################################################//
//## Function NetSend:                                                ##//
//#######################################################################//
//##      Datum: Änderung:                                            ##//
//##      ====== =========                                            ##//
//##  10.07.2001 Initial Release                                      ##//
//#######################################################################//
function NetSend(Dest, Msg: string): Longint; overload;
begin
  Result := NetSend(Dest, '', Msg);
end;
//-----------------------------------------------------------------------//

//#######################################################################//
//## Function NetSend:                                                ##//
//#######################################################################//
//##      Datum: Änderung:                                            ##//
//##      ====== =========                                            ##//
//##  10.07.2001 Initial Release                                      ##//
//#######################################################################//
function NetSend(Msg: string): Longint; overload;
begin
  Result := NetSend('', '', Msg);
end;
bye

sakura 15. Okt 2003 16:52

Re: Net Send ohne Absender
 
Also das ist doch ganz einfach... Du startest ein neues Delphi-Projekt, kopierst den Code aus folgendem Thread hinein: http://www.delphipraxis.net/internal...ect.php?t=7078

und dann rufst Du die Funktion einfach auf:
Delphi-Quellcode:
  NetMessageBufferSendSubstA('Empfaenger-PC', 'Ist eh egal', 'DerAbsender', 'Die Nachricht');
...:cat:...

Matze 15. Okt 2003 16:54

Re: Net Send ohne Absender
 
Wow!! :thumb:
Vielen, vielen Dank sakura! :D

Matze 15. Okt 2003 16:57

Re: Net Send ohne Absender
 
Es geht!!
Nochmals Danke!

PS: Aber du musst schon zugeben, etwas komplizierter ist diese variante schon. ;)

sakura 15. Okt 2003 16:59

Re: Net Send ohne Absender
 
Zitat:

Zitat von Matze
PS: Aber du musst schon zugeben, etwas komplizierter ist diese variante schon. ;)

Hm, die Suche ist vielleicht kompliziert, aber Copy & Waste ist ja nicht soooo schwer *g*

Matze 15. Okt 2003 17:01

Re: Net Send ohne Absender
 
Ich meinte ja auch den Code. ;)
Ich verstehe dich schon! :thumb:

negaH 15. Okt 2003 19:10

Re: Net Send ohne Absender
 
Ich habe den Code von Duffy schon öffters gesehen, und meine das er wohl eine Pascal Translation eines schlechten C/C++ Sources sein muß. Mit Delphi kann man diese Funktion viel eleganter programieren:

Delphi-Quellcode:

function NetMsgSend(const ServerName, MsgName, FromName, Msg: WideString): Integer;

  function WC(const Name: WideString): PWideChar;
  begin
    if Name = '' then Result := nil
      else Result := PWideChar(Name);
  end;

var
  NetLib: THandle;
  NetMessageBufferSend: function(ServerName, MsgName, FromName: PWideChar;
                           Buffer: PWideChar; BufferLen: DWord): Integer; stdcall = nil;
begin
  Result := -1;
  NetLib := LoadLibrary('NETAPI32.DLL');
  if NetLib <> 0 then
  try
    @NetMessageBufferSend := GetProcAddress(NetLib, 'NetMessageBufferSend');
    if Assigned(NetMessageBufferSend) then
      Result := NetMessageBufferSend(WC(ServerName), WC(MsgName), WC(FromName),
                  Pointer(Msg), Length(Msg) * 2);
  finally
    FreeLibrary(NetLib);
  end;
end;
Gruß hagen

Duffy 15. Okt 2003 19:35

Re: Net Send ohne Absender
 
Hallo Hagen,
stammt aus einer alten Sammlung ... funktioniert aber im Gegesatz zu der anderen Funktion auch mit Auflösung des IP-Adresse.
bye

Duffy 15. Okt 2003 19:39

Re: Net Send ohne Absender
 
Hallo Hagen,
bins nochmal. Hast Du die Funktion auch so getestet?
bye

negaH 15. Okt 2003 19:48

Re: Net Send ohne Absender
 
:) jo hab ich, scheinst aber über die kleine Falle für Copy&Paste Programmierer gestolpert zu sein ;)

Delphi-Quellcode:
var
  NetLib: THandle;
  NetMessageBufferSend: function(ServerName, MsgName, FromName: PWideChar;
                           Buffer: PWideChar; BufferLen: DWord): Integer; stdcall;
ist richtig.

Gruß Hagen

negaH 15. Okt 2003 19:54

Re: Net Send ohne Absender
 
Zitat:

funktioniert aber im Gegesatz zu der anderen Funktion auch mit Auflösung des IP-Adresse.
Das verstehe ich nicht, welche andere Funktion ?
Deine NetSend() funktion sollte fast die gleichen Features ermöglichen wie meine NetSendMsg() function.

Der Unterschied ist das bei meiner Funktion jeder Parameter wahlweise leer=nil='' oder eben gefüllt sein kann. Will man also keinen Absender benutzen muß man NetMsgSend('', '*', '', 'Message'); benutzen.

Gruß Hagen

Duffy 15. Okt 2003 20:00

Re: Net Send ohne Absender
 
Hallo Hagen,
den meinte ich ..
Zitat:

Zitat von sakura
Also das ist doch ganz einfach... Du startest ein neues Delphi-Projekt, kopierst den Code aus folgendem Thread hinein: http://www.delphipraxis.net/internal...ect.php?t=7078

und dann rufst Du die Funktion einfach auf:
Delphi-Quellcode:
  NetMessageBufferSendSubstA('Empfaenger-PC', 'Ist eh egal', 'DerAbsender', 'Die Nachricht');
...:cat:...

bye

Duffy 15. Okt 2003 20:10

Re: Net Send ohne Absender
 
Hallo Hagen,
habe den Code getestet. Dein Code ist schön kompakt. Ich liebe es wenn Code kurz und prägnant ist. :thuimb:
bye

negaH 15. Okt 2003 21:26

Re: Net Send ohne Absender
 
Ich bin mir auch nicht so sicher ob Sakuras Code absolut gleichwertig mit NetMessageBufferSend() ist.

Gruß Hagen

H4ndy 16. Okt 2003 18:03

Re: Net Send ohne Absender
 
Hmm bei mir funzt der Code nicht von Hagen...
Es kommt einfach keine Nachricht an.

Kann jemand mal ein Codebeispiel posten?

Duffy 16. Okt 2003 18:08

Re: Net Send ohne Absender
 
Hallo H4ndy
Code:
NetMsgSend('', '192.168.1.2', '', 'Bingo 1 ...');
Der Empfänger der Nachricht muß gültig sein.
bye

negaH 16. Okt 2003 19:26

Re: Net Send ohne Absender
 
Delphi-Quellcode:
NetMsgSend('', '*', '', 'Bingo 1 ...');
Sollte im LAN auch gehen. Falls denoch keine Nachrichten ankommen, dann liegt das nicht am Code von mir. Überprüfe deine Firewall und ob der Windows Messanger Service aktiv ist.

Bei mir kommen auch keine Nachrichten an weil
1.) die FireWall es absichtlich blockt
2.) der Windows Messagner Dienst manuell deaktiviert wurde

Gruß hagen

Duffy 16. Okt 2003 19:34

Re: Net Send ohne Absender
 
Hallo Hagen,
bei mir funktioniert '*' auch nicht. Die Firewall blockt da bei mir nichts. Ich sitze nicht vor sonder hinter der Feuerwand.
bye
Claus

negaH 16. Okt 2003 19:49

Re: Net Send ohne Absender
 
Zitat:

bei mir funktioniert '*' auch nicht. Die Firewall blockt da bei mir nichts. Ich sitze nicht vor sonder hinter der Feuerwand
Also bei mir funktioniert das, allerdings muß ich die Firewall deaktivieren und den Messanger Dienst aktivieren. Alle Rechner im LAN bekommen dann diese Meldung. Wenn ich meine Firewall aktiviere so wird dieser Traffic geblockt, auch im LAN.
Ich muß aber dazu sagen das ich die Kerio Firewall extra so konfiguriert habe das nur auf sehr wenigen Ports überhaupt was durchkommt. Alle restlichen Ports habe ich so konfiguriert das nichts rein oder raus kann.

Gruß Hagen

Duffy 16. Okt 2003 19:53

Re: Net Send ohne Absender
 
Hallo Hagen,
unter welchem OS hast du gestestet. Sollte der Messanger da tatsächlich eine Rolle spielen?
bye
Claus

negaH 16. Okt 2003 20:05

Re: Net Send ohne Absender
 
Win2k, und hier ein Auszug aus der SDK Hilfe

Zitat:

A message is a buffer of text data sent to a user or application on the network. To receive a message, a user or application must register a message alias in a computer's table of message names. The following aliases are registered by default: "user", "machine", "domain", or "*" (the current domain of the computer).
* ist also ein gültiger Name und steht für einen Broadcast.

Messagner = Nachrichtendienst, das ist der Dienst der für die Popups verantwortlich ist, und er sollte eigentlich immer deaktiviert sein.

Gruß Hagen

NicoDE 16. Okt 2003 20:08

Re: Net Send ohne Absender
 
Bei wem es nicht funktioniert:
Delphi-Quellcode:
ShowMessage(SysErrorMessage(NetMsgSend('', 'domain*', '', 'nerv')));
Dann kann man wenigstens den Problemkreis einschränken.


Gruß Nico

ps: der Nachrichtendienst ist bei Windows Server 2003 standardmäßig deaktiviert

Luckie 16. Okt 2003 20:28

Re: Net Send ohne Absender
 
Also Hagens Funktion:
Delphi-Quellcode:
function NetMsgSend(const ServerName, MsgName, FromName, Msg: WideString): Integer;

  function WC(const Name: WideString): PWideChar;
  begin
    if Name = '' then Result := nil
      else Result := PWideChar(Name);
  end;

var
  NetLib: THandle;
  NetMessageBufferSend: function(ServerName, MsgName, FromName: PWideChar;
                           Buffer: PWideChar; BufferLen: DWord): Integer; stdcall;
begin
  Result := -1;
  NetLib := LoadLibrary('NETAPI32.DLL');
  if NetLib <> 0 then
  try
    @NetMessageBufferSend := GetProcAddress(NetLib, 'NetMessageBufferSend');
    if Assigned(NetMessageBufferSend) then
      Result := NetMessageBufferSend(WC(ServerName), WC(MsgName), WC(FromName),
                  Pointer(Msg), Length(Msg) * 2);
  finally
    FreeLibrary(NetLib);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  NetMsgSend('', 'hal9000', '', 'hallo');
end;
Funktioniert nei mir nur so. Sobald ich einen Absender eintrage oder den Empfänger als IP geht es nicht mehr.

Gebe ich den Empfänger asl IP an oder geben einen anderen Absender an bekomme ich diese fehlermeldung:
Zitat:

Zitat von Projekt1
---------------------------
Project1
---------------------------
Der Nachrichtenalias konnte auf dem Netzwerk nicht gefunden werden
---------------------------
OK
---------------------------

Und wenn ich als Empfänger ein "*" angebe bekomme ich:
Zitat:

Zitat von Projekt1
---------------------------
Project1
---------------------------
Falscher Parameter
---------------------------
OK
---------------------------


negaH 16. Okt 2003 21:54

Re: Net Send ohne Absender
 
Tja, da kann ich euch auch nicht weiter helfen. An meiner Funktion als solches kann es nicht liegen da sie ja nur eine Microsoft Funktion kapselt. Wenn es also nicht funktioniert dann fragt bei MS nach :)

Gruß Hagen

NicoDE 16. Okt 2003 23:34

Re: Net Send ohne Absender
 
Luckie:
NetMessageBufferSend() verhält sich nicht ganz so wie 'net send'. Broadcasts mittels NMBS kenne ich nur in der Form 'DomainName*'. Um den Absender zu ändern (nichts anderes, als den Code auf dem entfernten Rechner auszuführen) benötigt man umfangreiche Rechte (z.B. Domänen-Admin). IP-Adressen hab ich bisher nie benutzt (kannst ja Präfix '\\' und/oder Suffix '*' probieren...).

ps: NMBS wurde im Laufe der Zeit ständig gefixt/erweitert (so schlug NMBS unter WinNT 3.51 _immer_ fehl, wenn man bei FromName nicht NULL übergab...).

H4ndy 17. Okt 2003 15:19

Re: Net Send ohne Absender
 
Zitat:

Zitat von Duffy
Hallo H4ndy
Code:
NetMsgSend('', '192.168.1.2', '', 'Bingo 1 ...');
Der Empfänger der Nachricht muß gültig sein.
bye

Thx, das funzt jetzt bei mir.
Ich hab "ServerName" in der Funktion als Empfänger gedeutet und nicht MsgName.

negaH 17. Okt 2003 15:54

Re: Net Send ohne Absender
 
Zitat:

Ich hab "ServerName" in der Funktion als Empfänger gedeutet und nicht MsgName.
Jo, darüber habe ich auch gegrübelt. Aber Microsoft hat es so deklariert.

Gruß Hagen

H4ndy 17. Okt 2003 19:19

Re: Net Send ohne Absender
 
War ja klar ;) Die wollen wieder nur ihre User verwirren *g*

Tubos 29. Mär 2004 08:30

Re: Net Send ohne Absender
 
Danke für den tollen Code!
(das mit dem NetMsgSend)

Man kann ja bei Net Send auch den Usernamen als Empfänger angeben - zumindest bei uns.
Kann man die Funktion so umbauen, dass es auch mit dem Usernamen funktioniert?

Hanswurst 29. Mär 2004 13:53

Re: Net Send ohne Absender
 
Servus
dumme Frage :
warum wurde mein Thread (NetSend Spoofing) geschlossen , weil "Spoofing" ja soo böse ist und in diesem Thread , in dem es um haargenau das selbe geht , wird Tatkräftig mitgeholfen ?!
worin soll der Unterschied bestehen , ob man schreibt : "Net Send ohne Absender" oder direkter "NetSendSpoofing"

Cu

H4ndy 29. Mär 2004 15:48

Re: Net Send ohne Absender
 
Öhm ich hab nur den Thread hier gesehen *g*
Dafür kann ich ja nix :stupid:

Delphi Star 4. Apr 2004 13:44

Wie jetzt?
 
:wiejetzt: Wohin muss man denn den Code aus folgendem Thread kopieren?
http://www.delphipraxis.net/internal...ect.php?t=7078

Und wohin muss man dann den folgenden Code zum Aufruf der Funktion kopieren?

Code:
NetMessageBufferSendSubstA('Empfaenger-PC', 'Ist eh egal', 'DerAbsender', 'Die Nachricht');

Matze 4. Apr 2004 13:55

Re: Net Send ohne Absender
 
Herzlich willkommen in der DP!

Zu 2.: Das gehört in's OnClick des Senden-Buttons.


Edit: Ich hatte Hezlich anstatt Herzlich geschrieben. :oops:

Matze 4. Apr 2004 13:56

Re: Net Send ohne Absender
 
Zu 1.: Das ist eine ganz normale Funktion, die deklarierst du im private oder public-Bereich und im implementation-Abschnitt gehört der Code dann hin.

Delphi Star 4. Apr 2004 16:11

Kann man seine eigenen Beiträge nur editieren oder auch löschen?

Delphi Star 4. Apr 2004 19:35

Es funzt nicht, aber das Problem liegt bestimmt daran das ich was falsches im private oder public-Bereich geschrieben habe, also kannst du bitte schreiben was da rein muss :?:
Kann man auch irgendwie ne Rückmeldung anzeigen ob die Message erfolgreich angekommen ist :gruebel:

Matze 4. Apr 2004 20:22

Re: Net Send ohne Absender
 
Löschen kannst du deine Beiträge nicht, wo kämen wir denn dahin!

Es wäre sinnvill, wenn du in Zukunft den Code posten könntest, denn du bereits selber zusammengestellt hast (mit den Delphi-Tags).

Heute bin ich mal nicht so, so geht's:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    function NetMessageBufferSendSubstA(ServerName, MsgName, FromName, Msg: AnsiString): Boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.NetMessageBufferSendSubstA(ServerName, MsgName, FromName, Msg: AnsiString): Boolean;
{.$DEFINE SYNCHRONOUS}
const
  szService = '\mailslot\messngr';
  MaxBufLen = $700;
var
  hFile: THandle;
  WrittenBytes: DWORD;
{$IFNDEF SYNCHRONOUS} 
  ovs: OVERLAPPED;
  EventName:String;
{$ENDIF} 
begin
  Result := False;
  if Length(Msg) > MaxBufLen then
    SetLength(Msg, MaxBufLen);
{$IFNDEF SYNCHRONOUS} 
  EventName:='NetSendEvent_'+ServerName;
{$ENDIF} 
  ServerName := '\\' + Servername + szService;
  hFile := CreateFileA( 
    @ServerName[1], GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING or FILE_FLAG_OVERLAPPED, 0);
  if hFile <> INVALID_HANDLE_VALUE then
  try
    Msg := FromName + #0 + MsgName + #0 + Msg;
{$IFNDEF SYNCHRONOUS} 
    ovs.hEvent := CreateEventA(nil, True, False, @EventName[1]);
    WriteFile(hFile, Pointer(Msg)^, Length(Msg), WrittenBytes, @ovs);
{$ELSE}
    WriteFile(hFile, Pointer(Msg)^, Length(Msg), WrittenBytes, nil);
{$ENDIF} 
    Result := GetLastError = ERROR_IO_PENDING;
  finally
{$IFNDEF SYNCHRONOUS}
    if WaitForSingleObject(ovs.hEvent, INFINITE) <> WAIT_TIMEOUT then
{$ENDIF}
      CloseHandle(hFile);
  end;
end;

//Aufruf:
procedure TForm1.Button1Click(Sender: TObject);
begin
  NetMessageBufferSendSubstA(...);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz