delphi - CreateProcessAsUser 如何添加权限?

标签 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 - 我可以根据要求解释原因。

最佳答案

使用AdjustTokenPrivileges 。一、调用LookupPrivilegeValue获取所需权限的 ID,然后进行设置。下面是改编 self 碰巧拥有的一些 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);

关于delphi - CreateProcessAsUser 如何添加权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12604263/

相关文章:

c - Kylix 中的 TEvent.WaitFor

delphi - 弹出菜单标题中的非拉丁字符

c++ - 如何查询文件上所有锁持有者的窗口

c++ - 使用 WaveOutOpen(C++) 播放 .wav

c++ - 如何在 DdeCallback 函数中实现返回码

c++ - 有没有办法阻止 WinApi Hook 到特定进程?

delphi - 如何在 TIdHTTP 中指定自定义 HTTP 方法?

delphi - 如何获取TSynEdit等TWinControl的水平和垂直滚动条位置?

delphi - Windows 7 中缺少右键菜单

c++ - 如何使用 C++ 和 WinAPI 检查 Web 浏览器是否正在运行?