Lord_Otter
03.09.2002, 19:04
Moin !
bei der Netzwerkumgebung werden ja am Anfang alle Computer angezeigt, die sich im Netzwerk befinden und an sind.
Aber wenn ich die jetzt selber herausfinden möchte, wie kann ich das tun ?
Das bauchte ich kürzlich für ein eigenes Programm, is relativ simpel.
Du führst einfach per ShellExecute folgendes DOS Command aus:
net view > pcs.txt
Danach hast du im Dir, welches du bei ShellExecute angegeben hattest die Datei pcs.txt, diese musst du nun in ne Stringlist laden und dann entsprechend zerhacken, so dass die Computernamen übrigbeleiben.
Aus Zeitmangel hab ich das Zerhacken noch nicht ganz fertig, wenn du willst poste ich dir das, was ich schon habe, du perfektionierst es und postest es dann wieder :)
Ne bessere Möglichkeit habe ich trotz langen Suchens nicht gefunden.. Felix?
mfg, Manu
Patrik Graf
03.09.2002, 19:36
Das könnte z.B. so aussehen...
procedure TForm1.Button1Click(Sender: TObject);
Var i: Integer;
begin
ShellExecute(Handle,'open','command','/C net view > pcs.txt',nil,SW_HIDE);
While not FileExists('pcs.txt') Do Application.ProcessMessages;
Memo1.Lines.LoadFromFile('pcs.txt');
DeleteFile('pcs.txt');
i := 0;
While i <> Memo1.Lines.Count-1 Do begin
If Copy(Memo1.Lines[i],1,2) <> '\\\' Then Memo1.Lines.Delete(i)
Else Inc(i);
end;
Memo1.Lines.Delete(Memo1.Lines.Count-1);
end;
Viel Spass damit :D
Ey, woher hassu mein Code? :D
Ne, aber ich hatte imho als letztes noch zu bearbeitendes Prob an der Sache ( hab das schon nen halbes Jahr auf Eis liegen ), dass man dann am ende des Stings zig Leerzeichen hat.
Die hätte ich noch entfernen lassen müssen, dann wärs auch fertig gewesen glaub ich.. will grad nich schauen.. *faul*
Aber Otter, du kannst ja kurz Bescheid geben, wie gut Patrik's Lösung funzt, dann übernehm ich die gleich. ;)
Lord_Otter
04.09.2002, 11:38
Gut und danke !
Ich hab's verstanden und werde dies gleich in mein Programm einbauen.
Kann man, wenn man den Computer hat, auch die freigegeben Laufwerke des Computers ermitteln ?
Patrik Graf
04.09.2002, 11:44
Hmmm... das ist schon wieder nicht so einfach... da müssen API-Calls her. Als ich das das letzte mal versucht habe, hab ich mich ewig lange mit einem Fehler rumgeschlagen... "Diese Anwendung wird auf Grund eines ungültigen Vorgangs geschlossen."
Da bräuchten wir jetzt Felix... FELIX!!!
Lord_Otter
04.09.2002, 13:37
Auf Felix muss man zum Glück nicht lange warten (normlerweise).
Aber vielleicht weiß das ja noch jemand anderes...
Felix Kaiser
04.09.2002, 15:36
Patrik: Wenn du den Code mit dem IOStream umleiten meinst, ja, den hatte ich dann funktionstüchtig innem rudimentären Dummy httpd für Win zum Debuggen von PHP Skripten ohne Caching :cool:
procedure TForm1.ExecutePHP(Header: TStringList; Socket: TCustomWinSocket);
var
newstdin,newstdout,read_stdout,write_stdin: THandle;
si: STARTUPINFO;
pi: PROCESS_INFORMATION;
sa: PSECURITYATTRIBUTES;
sd: PSECURITY_DESCRIPTOR;
buf: array[0..65536] of char;
env: TStringList;
i: integer;
s,en,ev,queue,query,script: string;
Exit_Code,bread,avail: Cardinal;
begin
s:= Header[0];
Delete(s,1,Pos(' ',s));
SetLength(s,Pos(' ',s)-1);
if Pos('?',s) = 0 then s:= s+'?';
script:= Copy(s,1,Pos('?',s)-1);
Delete(s,1,Pos('?',s));
query:= s;
Memo2.Lines.Clear;
env:= TStringList.Create;
env.Add('DOCUMENT_ROOT=c:\servers/apache/htdocs/');
env.Add('HTTP_ACCEPT=*/*');
env.Add('HTTP_ACCEPT_ENCODING=gzip, deflate');
env.Add('HTTP_ACCEPT_LANGUAGE=de');
env.Add('HTTP_CONNECTION=Keep-Alive');
env.Add('HTTP_HOST=localhost');
env.Add('HTTP_USER_AGENT=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3215)');
env.Add('REDIRECT_STATUS=200');
env.Add('REDIRECT_URL='+script);
env.Add('REMOTE_ADDR=127.0.0.1');
env.Add('REMOTE_PORT=4100');
env.Add('SCRIPT_FILENAME=c:\servers/apache/php4/php.exe');
env.Add('SERVER_ADDR=127.0.0.1');
env.Add('SERVER_ADMIN=Administrator@netserver.home');
env.Add('SERVER_NAME=localhost');
env.Add('SERVER_PORT=80');
env.Add('SERVER_SIGNATURE=<ADDRESS>Apache/1.3.26 Server at localhost Port 666</ADDRESS>');
env.Add('SERVER_SOFTWARE=Apache/1.3.26 (Win32)');
env.Add('GATEWAY_INTERFACE=CGI/1.1');
env.Add('SERVER_PROTOCOL=HTTP/1.1');
env.Add('REQUEST_METHOD=GET');
env.Add('QUERY_STRING='+query);
env.Add('REQUEST_URI='+script+'?'+query);
env.Add('SCRIPT_NAME=/php4/php.exe');
env.Add('PATH_INFO='+script);
env.Add('PATH_TRANSLATED=c:\servers\apache\htdocs'+script);
for i:= 1 to env.Count do begin
s:= env[i-1];
en:= Copy(s,1,Pos('=',s)-1);
ev:= Copy(s,Pos('=',s)+1,Length(s)-Pos('=',s));
SetEnvironmentVariable(PChar(en),PChar(ev));
end;
env.Destroy;
GetMem(sd,sizeof(SECURITY_DESCRIPTOR));
GetMem(sa,sizeof(SECURITY_ATTRIBUTES));
InitializeSecurityDescriptor(sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(sd,True,nil,False);
sa.lpSecurityDescriptor:= sd;
sa.nLength:= sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle:= True;
CreatePipe(newstdin,write_stdin,sa,0);
CreatePipe(read_stdout,newstdout,sa,0);
GetStartupInfo(si);
si.dwFlags:= STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
si.wShowWindow:= SW_HIDE;
si.hStdOutput:= newstdout;
si.hStdError:= newstdout;
si.hStdInput:= newstdin;
queue:= '';
if CreateProcess(nil,'c:\Servers\Apache\php4\php.exe',nil,nil,TRUE,CREATE_NEW_CONSOLE,nil,nil,si,pi) then begin
Socket.SendText('HTTP/1.1 200 OK'#13#10);
repeat
GetExitCodeProcess(pi.hProcess,Exit_Code);
Application.ProcessMessages;
FillChar(buf,SizeOf(buf),0);
PeekNamedPipe(read_stdout,@buf,SizeOf(buf),@bread,@avail,nil);
if bread <> 0 then begin
avail:= bread;
ReadFile(read_stdout,buf,avail,bread,nil);
s:= StrPas(buf);
Socket.SendText(s);
queue:= queue+s;
while Pos(#13,queue) > 0 do queue[Pos(#13,queue)]:= #10;
while Pos(#10#10,queue) > 0 do Delete(queue,Pos(#10#10,queue),1);
while Pos(#10,queue) > 0 do begin
s:= Copy(queue,1,Pos(#10,queue)-1);
Delete(queue,1,Length(s)+1);
Memo2.Lines.Add(s);
end;
end;
Sleep(1);
until Application.Terminated or (Exit_Code <> STILL_ACTIVE);
TerminateProcess(pi.hProcess,0);
end;
FreeMem(sd);
FreeMem(sa);
Socket.Close;
end;
Bin jetzt einfach mal zu faul, da die wichtigsten Teile rauszuschneiden, zur Erklärung: Das Ding entnimmt einem HTTP GET Request die Informationen zum Skript, welches ausgeführt werden soll, via PHP. Dazu wird die Ausgabe in Memo2 vorbereitet und sämtliche Environmentvariablen gesetzt, die für PHP relevant sind (Angaben entnommen einem Apache 1.3.26). Danach wird der Prozess eingeleitet und die Ausgabe direkt in den Socket umgeleitet. Lief auf meinem Laptop damals problemlos (Win2k)
Naja, viel Spaß damit.
Lord_Otter
04.09.2002, 16:12
Und wie geht das jetzt mit den Laufwerken ?
Jan Krüger
04.09.2002, 16:13
ich glaube, hier gehts eher um NetBios... :) aber weiterhelfen kann ich da leider auch nicht. :(
ich würde empfehlen, mal die dll-imports von programmen wie dem netzwerkmonitor zu durchleuchten.
Lord_Otter
04.09.2002, 16:17
OK JaST, ich werde mal die DLLs unter die Lupe nehmen !
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.