![]() |
Programm unter NT 4.0 als anderer User starten
Ich möchte ein Programm aus einem Delphi-Programm aus aufrufen. Das Programm soll aber unter einem anderen Useraccount laufen als das Delphiprogramm (User einer NT-Domain). Wie kann ich das machen? Gibt es die Möglichkeit es ähnlich wie unter XP als "run as..." zu starten?
Bin leider gezwungen das Problem unter Windows NT 4.0 zu lösen. Danke vorab. |
Re: Programm unter NT 4.0 als anderer User starten
Kuck dir mal
![]() |
Re: Programm unter NT 4.0 als anderer User starten
Habe es mit CreateProcessAsUser probiert, klappt aber nicht. Für den Aufruf braucht man den LoginHandle. Habe ich also erzeugt aber irgendwas scheint schon damit nicht zu klappen. Ich bekomme immer 1341560 zurück. Laut Hilfe ist alles außer 0 ein gültiger Handle, was komisch ist, weil ich die Zahl auch bekomme, wenn ich falsche Anmeldeinfos angebe.
Hier mein Code:
Delphi-Quellcode:
Hat jemand ein funktionierendes Beispiel für CreateProcessAsUser? Es gibt hier im Forum zwar viele Hiweise wie "Benutze halt CreateProcessAsUser" aber leider kein Beispiel.
procedure TForm1.Button1Click(Sender: TObject);
var LogonHandle: THandle; StartupInfo : TStartupinfo; ProcessInfo : TProcessInformation; begin LogonUser(pchar(Edit1.Text), pchar(Edit2.Text), pchar(Edit3.Text),0,LOGON32_LOGON_INTERACTIVE,LogonHandle); if LogonHandle = 0 then begin ShowMessage(IntToStr(GetLastError) + ' Fehler beim LogonHandle!'); end else ShowMessage(IntToStr(LogonHandle) + ' ist der LogonHandle!'); FillChar(Startupinfo, SizeOf(TStartupinfo),0); Startupinfo.cb:=Sizeof(TStartupInfo); CreateProcessAsUser(LogonHandle, Nil, pchar(Edit4.Text), Nil, Nil, TRUE, CREATE_DEFAULT_ERROR_MODE, Nil, Nil, // noch anpassen soll ja Env vom User verwendet werden Startupinfo, ProcessInfo ); end; Danke |
Re: Programm unter NT 4.0 als anderer User starten
Du musst schon überprüfen ob LogonUser True oder False zurückliefert und dir dann bei Bedarf per GetLastError den Fehlercode liefern lassen..! Aber ich geh mal davon aus, dass dir einfach die entsprechenden Privilegien fehlen (weiß jetzt nicht genau welche das sind). Normale Benutzer (auch als Admin) haben die nämlich normalerweise nicht...
|
Re: Programm unter NT 4.0 als anderer User starten
an den Privilegien liegt es nicht (weiß schon was du meinst, das SE_TCB_NAME Privileg). Das hat man nicht, auch nicht als Admin. Starte deshalb das Programm auch über einen System-Dienst, der hat diese Privilegien. Aber hilft halt nix...
|
Re: Programm unter NT 4.0 als anderer User starten
Ja, und CreateProcessAsUser benötigt außerdem noch SeIncreaseQuotaPrivilege und SeAssignPrimaryTokenPrivilege. Aber als System-Service sollte das eigentlich funktionieren...
Hier mal ein Code den ich problemlos in einem Service verwendet hab:
Delphi-Quellcode:
var
hToken: THandle; aSI: TStartupInfo; aPI: TProcessInformation; procedure ShowLastError; begin MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Error', MB_ICONERROR or MB_OK); end; begin ZeroMemory(@aSI, SizeOf(aSI)); aSI.cb := SizeOf(aSI); // create process as specific principal if cbCreateAsUser.Checked then begin if LogonUser(PChar(edUserName.Text), nil, PChar(edPassword.Text), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken) then begin if CreateProcessAsUser(hToken, PChar(edProgramPath.Text), nil, nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, aSI, aPI) then begin CloseHandle(aPI.hProcess); CloseHandle(aPI.hThread); end else ShowLastError; CloseHandle(hToken); end else ShowLastError; end // create process in system-logonsession else begin if CreateProcess(PChar(edProgramPath.Text), nil, nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, aSI, aPI) then begin CloseHandle(aPI.hProcess); CloseHandle(aPI.hThread); end else ShowLastError; end; end; |
Re: Programm unter NT 4.0 als anderer User starten
Vielen Dank! Super! - Das funktioniert.
Aber: Leider nur mit lokalen Usern. Ich möchte es gerne mit einem Domainuser veranstalten. Dazu habe ich die Zeile
Delphi-Quellcode:
entsprechend nach
if LogonUser(PChar(edUserName.Text), nil, PChar(edPassword.Text),
Delphi-Quellcode:
geändert.
if LogonUser(PChar(edUserName.Text), PChar('MyDomainame'), PChar(edPassword.Text),
Die Anmeldung scheint auch zu funktionieren, dann bekomme ich allerdings (z.B. bei cmd.exe als zu startendes Programm) die Fehlermeldung: "Initialisierung der DLL "C:\winnt\system\kernel32.dll" gescheitert. Prozess wird nicht normal beendet." Bei einem anderen Programm (z.B. calc.exe) eine andere DLL, also nicht immer die Kernel-DLL. Woran könnte das liegen? |
Re: Programm unter NT 4.0 als anderer User starten
Hm.. ja, und damit tauchst du immer tiefer in die komplexen Gebilde der Windows-Security ein.. :?
Das Problem hier sind wiedermal WindowStations und Desktops... Was soll das ganze denn für eine LogonSession werden? Benötigt sie interaktive Benutzereingaben? |
Re: Programm unter NT 4.0 als anderer User starten
ja, das Programm ist ein "normales" Benutzerprogramm, also interaktiv. Es soll aber als Domainuser laufen (ohne Adminrechte), damit auch Domainfunktionalitäten wie Netzwerkdrucken genutzt werden können.
|
Re: Programm unter NT 4.0 als anderer User starten
Hm.. damit wirds dann kompliziert.. so genau hab ich das auch noch nicht ausprobiert, aber du musst dann wohl die WindowStation und den Desktop zuweisen und möglicherweise auch deren DACLs anpassen..
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 Uhr. |
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-2025 by Thomas Breitkreuz