CreateProcessAsUser如何添加权限?

时间:2012-09-26 14:40:43

标签: delphi winapi

我正在尝试使用以下代码调用另一个用户帐户下的其他Windows应用程序执行应用程序:

procedure TForm1.Button3Click(Sender: TObject);
var
  userName: string;
  password: string;
  domain: string;
  path: string;
  logonok: boolean;
  impok: boolean;
  hUserToken: THandle;
  ProcessCreatedOK: Boolean;
  startupInfo: TStartupInfo;
  processInfo: TProcessInformation;
  err: DWORD;
begin
    username := 'theusername';
    password := 'thepassword';
    domain := '';
    Path := 'myapp.exe';

    LogonOK := LogonUser(PWideChar(username), PWideChar(domain), PWideChar(password),
      LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hUserToken);

    if LogonOK then
    begin
      impOK := ImpersonateLoggedOnUser(hUserToken);

      if impok then
      begin
        FillChar(startupInfo, SizeOf(startupInfo), 0);
        startupInfo.CB := SizeOf(startupinfo);
        startupInfo.dwFlags := STARTF_USESHOWWINDOW;
        startupinfo.wShowWindow := SW_SHOWNORMAL;

        NewState.PrivilegeCount := 1;
        res := LookupPrivilegeValue(
          nil,
          SE_ASSIGNPRIMARYTOKEN_NAME,
          NewState.Privileges[0].Luid);
          Win32Check(res);

        NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        res := AdjustTokenPrivileges(
          hUserToken,
          False,
          NewState,
          SizeOf(NewState),
          nil,
          returnLength);
        Win32Check(res);

        NewState.PrivilegeCount := 1;
        res := LookupPrivilegeValue(
          nil,
          SE_INCREASE_QUOTA_NAME,
          NewState.Privileges[0].Luid);
          Win32Check(res);

        NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        res := AdjustTokenPrivileges(
          hUserToken,
          False,
          NewState,
          SizeOf(NewState),
          nil,
          returnLength);
        Win32Check(res);

        ProcessCreatedOK := CreateProcessAsUser(
           hUserToken,
           nil,
           PChar(path),
           nil, nil,
           false,
           CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,
           startupInfo, processInfo);

        if GetLastError <> 0 then
        begin
          err := GetlastError;
          ShowMessage(inttostr(err) + ' ' +  SysErrorMessage(err));
        end;
      end;
    end;

我得到了1314“客户端没有保留所需的权限”错误。

现在从一些挖掘中我可以看到我需要为模拟帐户应用一些权限:SE_ASSIGNPRIMARYTOKEN_NAME和SE_INCREASE_QUOTA_NAME?

有没有人对如何做到这一点有一些建议?

我已经看到了此Stackoverflow answer中给出的JCL示例,但我在帐户权限方面遇到了类似的问题。

我不想使用CreateProcessWithLogonW - 我可以根据要求解释原因。

1 个答案:

答案 0 :(得分:5)

使用AdjustTokenPrivileges。首先,调用LookupPrivilegeValue获取所需权限的ID,然后设置它们。这是一个改编自我碰巧遇到的一些C代码的例子:

var
  NewState: TTokenPrivileges;

NewState.PrivilegeCount := 1;
res := LookupPrivilegeValue(nil, Se_AssignPrimaryToken_Name,
  @NewState.Privileges[0].Luid);
Win32Check(res);

NewState.Privileges[0].Attributes := Se_Privilege_Enabled;
res := AdjustTokenPrivileges(hUserToken, False, @NewState,
  SizeOf(NewState), nil, nil);
Win32Check(res);