Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Ein gültiges Token für CreateProcessAsuser bekommen (https://www.delphipraxis.net/29502-ein-gueltiges-token-fuer-createprocessasuser-bekommen.html)

Luckie 9. Sep 2004 22:56


Ein gültiges Token für CreateProcessAsuser bekommen
 
MSDN-Library durchsuchenCreateProcessAsUser verlangt als ersten Parameter einen Token. Den kann man mit LogonUser bekommen. Nur leider schlägt LogonUser bei mir immer fehl:
Delphi-Quellcode:
function RunAs(const User, PW, App, Params: string): DWORD;
var
  bReturn: Boolean;
  dwReturn: DWORD;
  hLogon: THandle;
  si: TStartupInfo;
  pi: TProcessInformation;
begin
  SetLastError(0);
  if EnablePrivilege('SeTcbPrivilege') = 0 then
  begin
    bReturn := LogonUser(PChar(User), nil, PChar(PW), LOGON32_LOGON_INTERACTIVE,
      LOGON32_PROVIDER_WINNT50, hLogon);
    if bReturn then
    begin
      ZeroMemory(@si, sizeof(si));
      si.cb := sizeof(si);
      ZeroMemory(@pi, sizeof(pi));
      if CreateProcessAsUser(hLogon, PChar(App), PChar(Params), nil, nil, False,
        CREATE_DEFAULT_ERROR_MODE, nil, nil, si, pi) then
        dwReturn := 0
      else
        dwReturn := GetLastError;
      CloseHandle(hLogon);
      ZeroMemory(@PW[1], length(PW));
    end
    else
      dwReturn := GetLastError;
  end
  else
    dwReturn := GetLastError;
  result := dwReturn;
end;
Wie Motzi hier im Forum schon gesagt hat, braucht man dazu das Privileg 'SeTcbPrivilege'. Das bekomme ich auch. Aber LogonUser schlägt trotzdem fehl.
Zu Testezwecken wollte ich einfach eine Konsole als Admin öffen (bin selber nur Benutzer). Als fehlermeldung bekomme ich immer:
Zitat:

---------------------------
Project1
---------------------------
Der Client besitzt ein erforderliches Recht nicht
---------------------------
OK
---------------------------

Christian Seehase 10. Sep 2004 00:04

Re: Ein gültiges Token für CreateProcessAsuser bekommen
 
Moin Luckie,

unter Windows 2000 ist auch noch SE_TCB_NAME erforderlich.

Woher hast Du eigentlich EnablePrivilege?

Luckie 10. Sep 2004 00:11

Re: Ein gültiges Token für CreateProcessAsuser bekommen
 
Hatte ich mal von Nico für SeDebugPrivilege. Ich habe es verallgemeinert. Ist da ein Fehler drin?

Jetzt bekomme ich nach:
Delphi-Quellcode:
if (EnablePrivilege('SeTcbPrivilege') = 0) and (EnablePrivilege('SeTcbName') = 0)
Zitat:

---------------------------
Project1
---------------------------
Ein angegebenes Recht ist nicht vorhanden
---------------------------
OK
---------------------------
:gruebel:

Sprint 10. Sep 2004 00:45

Re: Ein gültiges Token für CreateProcessAsuser bekommen
 
Zitat:

Zitat von Luckie
Nur leider schlägt LogonUser bei mir immer fehl

Schau mal in die Unit JclMiscel vom Project Jedi. Dort findest du die Funktion CreateProcAsUserEx. Anhand des Quellcodes kannst du dann auch leicht nachvollziehen wie das alles funktioniert.

Luckie 10. Sep 2004 01:25

Re: Ein gültiges Token für CreateProcessAsuser bekommen
 
Letztendlich mache ich doch auch nichts anderes. Die Jedis setzten sogar noch nicht mal irgendwelche Privilegien. Ungetestet kann ich mir dann nicht vorstellen, dass deren Methode funktionieren sollte. :gruebel:

Sprint 10. Sep 2004 01:50

Re: Ein gültiges Token für CreateProcessAsuser bekommen
 
Zitat:

Zitat von Luckie
Letztendlich mache ich doch auch nichts anderes. Die Jedis setzten sogar noch nicht mal irgendwelche Privilegien. Ungetestet kann ich mir dann nicht vorstellen, dass deren Methode funktionieren sollte. :gruebel:

Hast du dir diese Artikel von Microsoft durchgelesen?Besonders der erste Link ist sehr interessant. Ich frage mich nur, wie du auf die Idee kommst, das der in deinem ersten Posting genantte Privileg gesetzt werden muss.


Edit: Ahh, ich hab gerade was gefunden. :)
Zitat:

The key to successfully calling LogonUser is by ensuring that the user
account the code is executing under (normally the interctively logged on
user) has the SE_TCB_NAME privilege assigned to his/her account. You see,
there is a difference between having a privilege and enabling a privilege
(you're code only attempts to do the latter). You can assign this privilege
through either the LSA API or using the Local Security Policy MMC snapin
(Start | Programs | Adminstrative Tools). After you've done that you must
logout/login again for the privilege to become available. After that calling
LogonUser should succeed (even without explicitly enabling the privilege).
As an aside a word of caution, the SE_TCB_NAME privilege is an enormously
powerfull privilege. Unless there really is no other way to achieve way
you're attempting to do, you should not assign this privilege to just any
user - it effectively makes the user even more powerfull than the
Administrator user itself!

Luckie 10. Sep 2004 02:35

Re: Ein gültiges Token für CreateProcessAsuser bekommen
 
Zitat:

Zitat von Sprint
Hast du dir diese Artikel von Microsoft durchgelesen?

Der zweite und dritte sind aus dem PSDK, die kenne ich. das Beispeil kenne ich nicht, aber das kann doch nicht wahr sein, dass so viel Code nötig ist einen Prozess unter einem anderem Benutzer zu starten.

Zitat:

Ich frage mich nur, wie du auf die Idee kommst, das der in deinem ersten Posting genantte Privileg gesetzt werden muss.
Motzi hat es in einem Posting mal erwähnt.

Motzi 11. Sep 2004 16:08

Re: Ein gültiges Token für CreateProcessAsuser bekommen
 
Das Problem ist, dass du das Privilege nicht haben wirst. Es ist ein Unterschied ob man ein Privilege _besitzt_ oder ob man es besitzt aber es nicht _aktiviert_ ist. Das Debug-Privilege besitzt man als Admin zB, aber es ist deaktiviert. Ergo kann man es aktivieren und es benutzen, anders sieht es bei SeTcbPrivilege aus. Das besitzt man standardmäßig nicht (auch nicht als Admin), die System-LogonSession hat es -> ein Service besitzt das Privilege und kann LogonUser aufrufen. Du kannst es auch als Admin haben, wenn du in den lokalen Sicherheitsrichtlinien den Benutzer bei "Einsetzen als Teil des Betriebssystems" einträgst.

Privilegien die man nicht besitzt kann man auch nicht aktivieren!

SleepyMaster 11. Sep 2004 17:55

Re: Ein gültiges Token für CreateProcessAsuser bekommen
 
Hmm also ich mach das immer so:

Delphi-Quellcode:
function CreateProcessWithLogonW(
  lpUsername,
  lpDomain,
  lpPassword:PWideChar;
  dwLogonFlags:dword;
  lpApplicationName: PWideChar;
  lpCommandLine: PWideChar;
  dwCreationFlags: DWORD;
  lpEnvironment: Pointer;
  lpCurrentDirectory: PWideChar;
  const lpStartupInfo: tSTARTUPINFO;
  var lpProcessInformation: TProcessInformation): BOOL; stdcall; external 'advapi32.dll';

function StartProgramm(Benutzer:string;Passwort:string;Domain:string;EXE:string):boolean;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  result:=false;
  FillChar (StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb := SizeOf(StartupInfo);
  if CreateProcessWithLogonW(StringToOleStr(Benutzer),StringToOleStr(Domain), StringToOleStr(Passwort), 0, StringToOleStr(Exe), nil, 0, nil, nil, StartupInfo, ProcessInfo) then
    result:=true;
end;
Hoffe das war auch das was gesucht war.

Luckie 12. Sep 2004 08:15

Re: Ein gültiges Token für CreateProcessAsuser bekommen
 
@Motzi: Dann habe ich da wohl Pech. Ich dachte, ich hätte sie zu mindest. :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:25 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-2025 by Thomas Breitkreuz