Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programm unter NT 4.0 als anderer User starten (https://www.delphipraxis.net/28931-programm-unter-nt-4-0-als-anderer-user-starten.html)

weisswurst 1. Sep 2004 13:25


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.

Luckie 1. Sep 2004 14:16

Re: Programm unter NT 4.0 als anderer User starten
 
Kuck dir mal MSDN-Library durchsuchenCreateProcessAsUser an. Das sollte es sein, was du suchst.

weisswurst 3. Sep 2004 09:59

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:
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;
Hat jemand ein funktionierendes Beispiel für CreateProcessAsUser? Es gibt hier im Forum zwar viele Hiweise wie "Benutze halt CreateProcessAsUser" aber leider kein Beispiel.

Danke

Motzi 3. Sep 2004 10:46

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...

weisswurst 3. Sep 2004 10:57

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...

Motzi 3. Sep 2004 12:03

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;

weisswurst 3. Sep 2004 12:35

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:
   if LogonUser(PChar(edUserName.Text), nil, PChar(edPassword.Text),
entsprechend nach

Delphi-Quellcode:
   if LogonUser(PChar(edUserName.Text), PChar('MyDomainame'), PChar(edPassword.Text),
geändert.

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?

Motzi 3. Sep 2004 12:56

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?

weisswurst 3. Sep 2004 13:11

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.

Motzi 3. Sep 2004 13:27

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..

weisswurst 6. Sep 2004 08:50

Re: Programm unter NT 4.0 als anderer User starten
 
Zitat:

WindowStation und den Desktop zuweisen
Wie meinst du das, wo soll ich das zuweisen?

DP-Maintenance 6. Sep 2004 17:35

DP-Maintenance
 
Dieses Thema wurde von "Christian Seehase" von "Programmieren allgemein" nach "Windows API" verschoben.
Ist nicht so allgemein

Motzi 6. Sep 2004 18:39

Re: Programm unter NT 4.0 als anderer User starten
 
Über den STARTUPINFO-Parameter:
Zitat:

Zitat von PSDK
lpDesktop
Pointer to a null-terminated string that specifies either the name of the desktop, or the name of both the desktop and window station for this process. A backslash in the string indicates that the string includes both the desktop and window station names.
For CreateProcess and CreateProcessAsUser, if this member is NULL, the new process inherits the desktop and window station of its parent process. If this member is an empty string, the process does not inherit the desktop and window station of its parent process; instead, the system determines if a new desktop and window station need to be created. If the impersonated user already has a desktop, the system uses the existing desktop.

For CreateProcessWithLogonW, if this member is NULL or an empty string, the new process inherits the desktop and window station of its parent process. CreateProcessWithLogonW adds permission for the specified user account to the inherited window station and desktop. Otherwise, if this member specifies a desktop, it is the responsibility of the application to add permission for the specified user account to the specified window station and desktop.


Windows Me/98/95: Desktops and window stations are not supported.


weisswurst 7. Sep 2004 11:00

Re: Programm unter NT 4.0 als anderer User starten
 
hm, ich glaube daran scheints nicht zu liegen, habe es aber gesetzt und das Ergebnis ist das selbe wie vorher.

Ich habe aber noch etwas anderes rausgefunden: Wenn ich als Domainuser einen nehme, der auch Domainadmin ist, funktioniert es. Nur eben mit einem normalen Domainuser nicht.

Ich habe mal weiter geforscht und als Vergleich mal psexec.exe von Sysinternals ausprobiert. Das interessante ist: Es funktionert bzw. funktioniert nicht mit den gleichen Userkombiniationen wie mit meinem Programm (Wenns damit gehen würde, hätte es mir auch schon gereicht, das Tool über entsprechende Paramter aus meinem Programm aus aufzurufen).

Das es mit psexec und einem normalen Domainuser auch nicht geht, lässt mich langsam befürchten, dass es unter NT halt einfach gar nicht geht. Würde mich aber freuen, wenn es andere Meinungen gibt...

Motzi 7. Sep 2004 12:06

Re: Programm unter NT 4.0 als anderer User starten
 
Doch.. du musst nur auch noch die DACLs anpassen...

Schau dir mal die 2 Sachen an (inkl. Source):
http://www.pluralsight.com/keith/sec.../cmdasuser.zip
http://www.pluralsight.com/keith/sec...winstadacl.zip

Allerdings ist das ganze Thema sehr komplex.. weiß nicht ob dir das bisschen Doku das da drin ist reicht..

weisswurst 7. Sep 2004 14:53

Re: Programm unter NT 4.0 als anderer User starten
 
Danke, aber du hast Recht. Die Doku hilft mir nicht wirklich viel weiter.

Vor der Benutzung von winstadacl muß man (unter NT) den "Security Configuration Editor" installiert haben. Gibts bei Microsoft aber nicht mehr und selbst langes googeln hat keinen hilfreichen Download-Link geliefert.

:pale:

Hast du noch eine Idee?

Christian Seehase 7. Sep 2004 15:40

Re: Programm unter NT 4.0 als anderer User starten
 
Moin Weisswurst,

wenn es Dir schon genügt ein Tool aufzurufen, könntest Du es mal mit SU versuchen (Switch User).
Dieses sollte sich im NT Resource Kit befinden.

Assarbad 8. Sep 2004 22:15

Re: Programm unter NT 4.0 als anderer User starten
 
Einfach mal in das Buch von Keith reinschauen. Das gibt es (zwar für C#, aber Basics sind immernoch enthalten) hier:
http://pluralsight.com/wiki/default....eBook.HomePage

(Als Wiki)

BTW: Ich glaube der Security Policy Editor hatte diese erweiterte ACL-Editor-GUI! Den könnte ich noch irgendwo haben.

weisswurst 10. Sep 2004 11:02

Re: Programm unter NT 4.0 als anderer User starten
 
Hat alles nix geholfen. Habe das Problem jetzt grundsätzlich anders gelöst.

Ich möchte mich aber für die vielen Tips und Hilfestellungen bedanken.

Grüsse
Die Weisswurst


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:20 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