gpt4 book ai didi

delphi - 模拟管理员重启Windows服务

转载 作者:行者123 更新时间:2023-12-03 15:47:49 25 4
gpt4 key购买 nike

我有一个 Delphi 应用程序可以重新启动某些 Windows 服务。

如果执行此应用程序的用户具有管理权限(管理员组的成员),则服务重启将会成功。

对于普通用户,服务重启会失败。

如果该普通用户使用“右键单击”以管理员身份运行,也会成功。但是,普通用户必须输入管理员用户名和密码。

我想为普通用户解决这个问题。

我的想法是在代码中“模拟用户”,显然是模拟本地管理员帐户。

但是,还是不行。

这是我的代码:

function GetCurrUserName: string;
var
Size : DWORD;
begin
Size := MAX_COMPUTERNAME_LENGTH + 1;
SetLength(Result, Size);
if GetUserName(PChar(Result), Size) then
SetLength(Result, Size)
else
Result := '';
end;

function ConnectAs(const lpszUsername, lpszPassword: string): Boolean;
var
hToken : THandle;
begin
Result := LogonUser(PChar(lpszUsername), nil, PChar(lpszPassword), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken);
if Result then
Result := ImpersonateLoggedOnUser(hToken)
else
RaiseLastOSError;
end;

我这样调用它:

try
ConnectAs('Administrator','password');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;

// Restart the Windows service

// Done, back to the user
RevertToSelf;

服务重启将失败。如果用户以管理员身份运行它(右键单击 RunAs),它就可以工作。

模拟本身运行良好。我可以通过获取当前用户名来检查它。但是,为什么还是不行呢。看起来该用户冒充没有管理员权限。

还有其他类型的冒充吗?

最佳答案

这是可以预料到的。在 UAC 下,管理员组中的用户会收到经过过滤的 token ,除非他们通过 UAC 提升过程。您正在模拟其他用户,但您这样做时没有 UAC 提升,因此拥有经过过滤、降低的权限 token 。

为了在UAC下以提升的权限执行代码,您必须通过UAC提升过程。如果您可以避免这样做,那么 UAC 将毫无意义。

据我所知,您有以下原则选择:

  1. 启动另一个进程来完成工作,使用 runas shell 动词强制提升,或者使用其他机制来安排提升。这将引导您完成您想要避免的 UAC 对话框。
  2. 作为替代方案,请安装两项服务。第一个服务是您当前安装的服务,也是您希望重新启动的服务。第二个服务是一个小而简单的服务,其唯一任务是执行重新启动。由于第二个服务在没有 UAC 的 session 0 中运行,因此您可以轻松地安排它具有足够的权限来重新启动第一个服务。当您需要从桌面应用重启服务 1 时,向服务 2 发送请求,以便服务 2 可以执行服务 1 的重启。

顺便说一句,我确实注意到您在调用 ImpersonateLoggedOnUser 时没有检查错误。

关于delphi - 模拟管理员重启Windows服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35364667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com