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

Motzi 12. Sep 2004 12:15

Re: Ein gültiges Token für CreateProcessAsuser bekommen
 
Das Problem warum das Code-Beispiel so lang ist ist was anderes. Man kann über lpStartupInfo festlegen welcher WindowStation/Desktop ein Prozess zugeordnet wird. Allerdings muss der Benutzer bzw die LogonSession des Benutzers unter dem der Prozess lauft auch Zugriff auf die jeweilige WindowStation und den Desktop haben. Und damit das auch der Fall ist müssen die DACLs entsprechend angepasst werden...

Ich empfehle zu diesem Thema "Programming Windows Security" von Keith Brown.

Edit: schau dir mal das an: http://www.pluralsight.com/keith/sec.../cmdasuser.zip
da is alles drinnen was du brauchst um einen Prozess unter einem anderen Benutzer zu starten..!

Luckie 12. Sep 2004 13:07

Re: Ein gültiges Token für CreateProcessAsuser bekommen
 
Danke, ich werde es mir mal ankucken.

toyoman 17. Nov 2004 08:52

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

Zitat von SleepyMaster
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.

Warum kann man bei dieser Funktion nicht Programme mit Parametern starten?????? :wall:

jim_raynor 17. Nov 2004 08:58

Re: Ein gültiges Token für CreateProcessAsuser bekommen
 
Ist nicht der Paramater nach der EXE-Datei die Paramater?

toyoman 17. Nov 2004 08:59

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

Zitat von jim_raynor
Ist nicht der Paramater nach der EXE-Datei die Paramater?

wenn ich notepad.exe starte funktionierts.

sobald ich aber einen Parameter anhänge zb.: notepad.exe readme.txt läuft das programm nicht mehr an.

warum? eine ahnung?

Luckie 8. Jan 2005 15:44

Re: Ein gültiges Token für CreateProcessAsuser bekommen
 
So, es geht einfach nicht, weil man die nötigen Privilegien nicht aktivieren kann. Ab 2000 gibt es aber CreateProcessWithLogonW und das kann das. Es muss also native API-Funktionen geben, die das ermöglichen. mal sehen, ob ich in dieser Richtung weiterkomme. :? Wer was weiß, nur zu, bitte melde dich.

toyoman 8. Jan 2005 15:53

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

Zitat von Luckie
So, es geht einfach nicht, weil man die nötigen Privilegien nicht aktivieren kann. Ab 2000 gibt es aber CreateProcessWithLogonW und das kann das. Es muss also native API-Funktionen geben, die das ermöglichen. mal sehen, ob ich in dieser Richtung weiterkomme. :? Wer was weiß, nur zu, bitte melde dich.

hey luckie

mein programm läuft längst, habe das problem gelöst.
allerdings hab ich immer noch ferien.
ab montag bin ich wieder im büro und könnte nachgucken wie der source endgültig aussah :)

gruss

Luckie 8. Jan 2005 15:58

Re: Ein gültiges Token für CreateProcessAsuser bekommen
 
Mit CreateProcessWithLogonW ist es ja auch kein Problem, sie dazu mein RunAsUser. Und das mit den paramtermn ist auch kein Problem. Nur gibt es eben diese API nur ab Windows 2000 und wird nicht unter Windows NT funktionieren.


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