![]() |
Ein gültiges Token für CreateProcessAsuser bekommen
![]()
Delphi-Quellcode:
Wie Motzi hier im Forum schon gesagt hat, braucht man dazu das Privileg 'SeTcbPrivilege'. Das bekomme ich auch. Aber LogonUser schlägt trotzdem fehl.
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; Zu Testezwecken wollte ich einfach eine Konsole als Admin öffen (bin selber nur Benutzer). Als fehlermeldung bekomme ich immer: Zitat:
|
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? |
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:
|
Re: Ein gültiges Token für CreateProcessAsuser bekommen
Zitat:
![]() |
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:
|
Re: Ein gültiges Token für CreateProcessAsuser bekommen
Zitat:
Edit: Ahh, ich hab gerade was gefunden. :) Zitat:
|
Re: Ein gültiges Token für CreateProcessAsuser bekommen
Zitat:
Zitat:
|
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! |
Re: Ein gültiges Token für CreateProcessAsuser bekommen
Hmm also ich mach das immer so:
Delphi-Quellcode:
Hoffe das war auch das was gesucht war.
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; |
Re: Ein gültiges Token für CreateProcessAsuser bekommen
@Motzi: Dann habe ich da wohl Pech. Ich dachte, ich hätte sie zu mindest. :?
|
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: ![]() da is alles drinnen was du brauchst um einen Prozess unter einem anderen Benutzer zu starten..! |
Re: Ein gültiges Token für CreateProcessAsuser bekommen
Danke, ich werde es mir mal ankucken.
|
Re: Ein gültiges Token für CreateProcessAsuser bekommen
Zitat:
|
Re: Ein gültiges Token für CreateProcessAsuser bekommen
Ist nicht der Paramater nach der EXE-Datei die Paramater?
|
Re: Ein gültiges Token für CreateProcessAsuser bekommen
Zitat:
sobald ich aber einen Parameter anhänge zb.: notepad.exe readme.txt läuft das programm nicht mehr an. warum? eine ahnung? |
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.
|
Re: Ein gültiges Token für CreateProcessAsuser bekommen
Zitat:
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 |
Re: Ein gültiges Token für CreateProcessAsuser bekommen
Mit CreateProcessWithLogonW ist es ja auch kein Problem, sie dazu mein
![]() |
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