Einzelnen Beitrag anzeigen

madas

Registriert seit: 9. Aug 2007
207 Beiträge
 
#14

AW: Re: CreateProcessAsUser ERROR_PRIVILEGE_NOT_HELD

  Alt 3. Apr 2013, 14:11
Ich nutze die Gelegenheit, um nach einem anderen Posting aus diesem Thread nochmal nachzufragen:
Interessant. In den Comments findet sich ein Link zu DropMyRights, wo gezeigt wird wie einem Admin Token die Rechte genommen werden können.
Gibt es dazu schon eine Delphi-Portierung?
Diese Variante hatte ich auch versucht. Hat jedoch bei mir nicht geklappt. D.h. der Prozess lief trotzdem mit Admin-Rechten. Kann aber auch an der Umsetzung selbst liegen.

Hier der Code:

Delphi-Quellcode:
function StartUserProcess(ApplicationName, CommandLine, WorkingDir: PAnsiChar): DWORD;
  var
    hSaferLevel: DWORD;
    hAuthzLevel: SAFER_LEVEL_HANDLE;
    hToken: THandle;
    si:STARTUPINFO;
    pi: PROCESS_INFORMATION;
  begin
    Result := ERROR_SUCCESS;
    hSaferLevel := SAFER_LEVELID_NORMALUSER;
    hAuthzLevel := 0;
    if (SaferCreateLevel(SAFER_SCOPEID_USER, hSaferLevel, 0, @hAuthzLevel, nil)) then
    begin
      hToken := 0;
      if (SaferComputeTokenFromLevel(hAuthzLevel, 0, @hToken, 0, nil)) then
      begin
        ZeroMemory(@si, sizeof(STARTUPINFO));
        si.cb := sizeof(STARTUPINFO);
        si.lpDesktop := nil;
        if (CreateProcessAsUser(hToken, ApplicationName, CommandLine, nil, nil, False, CREATE_NEW_CONSOLE, nil, WorkingDir, si, pi)) then
        begin
           CloseHandle(pi.hProcess);
           CloseHandle(pi.hThread);
        end else
          Result := GetLastError;
      end else
        Result := GetLastError;
      SaferCloseLevel(hAuthzLevel);
    end else
      Result := GetLastError;
  end;
  Mit Zitat antworten Zitat