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 CreateProcessAsUser (https://www.delphipraxis.net/39716-createprocessasuser.html)

jfheins 6. Feb 2005 22:17


CreateProcessAsUser
 
Kann mir mal bitte jemand ein Beispiel geben, wie ich mit CreateProcessAsUser ein Programm unter einem bestimmten Benutzer ausführen lassen kann ?

Ist irgendwie zu kompüliziert ... :?

Soweit ich es verstanden hab', muss es CreateProcessAsUser sein, weil ich einen System-Dienst habe, und meine Anwendung aber unter meinem Benutzer laufen soll ...

Oh, sry ... fünffachthread ... :oops: :oops: :oops: :oops: :oops:

Doofer IE ... :evil:

Luckie 6. Feb 2005 22:32

Re: CreateProcessAsUser
 
Das Forum hat auch eine Suche. ;)

jfheins 7. Feb 2005 16:05

Re: CreateProcessAsUser
 
Zitat:

Zitat von Luckie
Das Forum hat auch eine Suche. :wink:

Ach wirklich ?

Nur ist bei allem, was ich gefunden habe, alles daraufhinausgelaufen, dass statt CreateProcessAsUser CreateProcessWithLogonW verwendet wird ... (Was mir afaik nicht weiterhilft)

Assarbad 10. Feb 2005 10:29

Re: CreateProcessAsUser
 
PSDK sagt:
The CreateProcessWithLogonW function is similar to CreateProcessAsUser, except that the caller does not need to call the LogonUser function to authenticate the user and get a token.


Du mußt eben LogonUser() bei der gewünschten Funktion explizit aufrufen - danach das erhaltene Token an die Funktion übergeben. Außerdem existiert CreateProcessWithLogonW() erst ab Windows 2000.

Außerdem werden bestimmte Privilegien benötigt, die du um es maximalst kompatibel zu gestalten, vorher aktivieren solltest. Funktionen dazu für Dlephi gibt's wie Sand am Meer:
PSDK meint:
Typically, the process that calls the CreateProcessAsUser function must have the SE_ASSIGNPRIMARYTOKEN_NAME and SE_INCREASE_QUOTA_NAME privileges. However, if hToken is a restricted version of the caller's primary token, the SE_ASSIGNPRIMARYTOKEN_NAME privilege is not required. If the necessary privileges are not already enabled, CreateProcessAsUser enables them for the duration of the call. For more information, see Running with Special Privileges.


Bei weiteren Fragen einfach fragen ;) ... notfalls PN an mich, weil ich nur unregelmäßig reinschaue.

Luckie 10. Feb 2005 11:16

Re: CreateProcessAsUser
 
Zitat:

Zitat von jfheins
Zitat:

Zitat von Luckie
Das Forum hat auch eine Suche. :wink:

Ach wirklich ?

Nur ist bei allem, was ich gefunden habe, alles daraufhinausgelaufen, dass statt CreateProcessAsUser CreateProcessWithLogonW verwendet wird ... (Was mir afaik nicht weiterhilft)

Ja. Wirklich: Und wenn ich nach createprocessasuser suche finde ich sogar kompletten Quellcode. Und wenn du den Thread bis zum Ende verfolgst, wirst du feststellen, dass letztendlich nur ein Dienst, der unter dem Systemkonto läuft, sich die nötigen Rechte, die auch Assarbad angesprochen hat, wird verschaffen können.

Assarbad 10. Feb 2005 12:15

Re: CreateProcessAsUser
 
Zitat:

Zitat von Luckie
[...] wirst du feststellen, dass letztendlich nur ein Dienst, der unter dem Systemkonto läuft, sich die nötigen Rechte, die auch Assarbad angesprochen hat, wird verschaffen können.

Oder ein Gast auf einem ungepatchten System oder ein beliebiger Benutzer mit Debug-Privs *g*

jfheins 10. Feb 2005 19:23

Re: CreateProcessAsUser
 
Luckie, wo ist die Funktion EnablePrivilege deklariert?

Ich finde die irgendwie nicht ...

P.S. Ich versuche verzweifelt, aus einem System-Prozess heraus eine normale Anwendung in meinem Benutzerkontext zu starten ...

Assarbad 10. Feb 2005 19:39

Re: CreateProcessAsUser
 
Zitat:

Zitat von jfheins
Luckie, wo ist die Funktion EnablePrivilege deklariert?

Suche bei Google oder im Forum. Es gibt genug derer.

Luckie 10. Feb 2005 21:48

Re: CreateProcessAsUser
 
Delphi-Quellcode:
function EnablePrivilege(const Privilege: string; fEnable: Boolean; out
  PreviousState: Boolean): DWORD;
var
  Token       : THandle;
  NewState    : TTokenPrivileges;
  Luid        : TLargeInteger;
  PrevState   : TTokenPrivileges;
  Return      : DWORD;
begin
  PreviousState := True;
  if (GetVersion() > $80000000) then
    // Win9x
    Result := ERROR_SUCCESS
  else
  begin
    // WinNT
    if not OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, Token) then
      Result := GetLastError()
    else
    try
      if not LookupPrivilegeValue(nil, PChar(Privilege), Luid) then
        Result := GetLastError()
      else
      begin
        NewState.PrivilegeCount := 1;
        NewState.Privileges[0].Luid := Luid;
        if fEnable then
          NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
        else
          NewState.Privileges[0].Attributes := 0;
        if not AdjustTokenPrivileges(Token, False, NewState,
          SizeOf(TTokenPrivileges), PrevState, Return) then
          Result := GetLastError()
        else
        begin
          Result := ERROR_SUCCESS;
          PreviousState :=
            (PrevState.Privileges[0].Attributes and SE_PRIVILEGE_ENABLED <> 0);
        end;
      end;
    finally
      CloseHandle(Token);
    end;
  end;
end;
Stammt, glaube ich, ursprünglich von Nico oder so.


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