我正在尝试使用以下代码调用另一个用户帐户下的其他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 - 我可以根据要求解释原因。
答案 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);