gpt4 book ai didi

c++ - 我如何在 win xp 下在运行时提升我的进程

转载 作者:可可西里 更新时间:2023-11-01 10:27:58 26 4
gpt4 key购买 nike

我的应用程序需要在运行时执行一些特权操作。例如,当用户第一次运行我的应用程序时,我必须创建并格式化一个虚拟目录。我使用未记录的 api formatex 来完成 fomating 工作,但 formatex 需要管理员权限。如果操作系统是 vista 或更高版本,我可以使用“COM Elevation Moniker”提示 UAC 对话框并且它工作正常。但是在xp上,这个技巧不适用,所以我用impersonate的方法。如果应用程序以受限用户身份运行,我会这样格式化:

CredUIPromptForCredentials() -> prompt to get administrator credentials
LogonUser()
ImpersonateLoggedOnUser()
formatex()
RevertToSelf()

formatex 仍然失败...当然,以管理员身份运行我的应用程序会起作用,但这不好,我的应用程序是按用户安装的,而不是按机器安装的,这应该在当前用户上下文下工作,即使用户是有限的用户。

如何在运行时正确提升我的应用程序以完成格式化工作?有人帮忙吗?

最佳答案

一个可能的解决方案是使用提升的权限和一些命令行参数重新执行应用程序,这些参数将指示执行实际格式化。

示例代码:

if (!IsUserAdmin()) {
RunAsAdmin(hwnd, exeName, "--do-format");
} else {
DoFormat();
}
...

BOOL RunAsAdmin(HWND hWnd, LPCTSTR lpFile, LPCTSTR lpParameters)
{
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(sei));

sei.cbSize = sizeof(SHELLEXECUTEINFOW);
sei.hwnd = hWnd;
sei.fMask = SEE_MASK_FLAG_DDEWAIT | SEE_MASK_FLAG_NO_UI;
sei.lpVerb = _TEXT("runas");
sei.lpFile = lpFile;
sei.lpParameters = lpParameters;
sei.nShow = SW_SHOWNORMAL;

if (!ShellExecuteEx(&sei)) {
return FALSE;
}
return TRUE;
}

BOOL IsUserAdmin(VOID)
{
BOOL b;
SID_IDENTIFIER_AUTHORITY NtAuthority = { SECURITY_NT_AUTHORITY };
PSID AdministratorsGroup;
b = AllocateAndInitializeSid(
&NtAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&AdministratorsGroup);
if (b) {
if (!CheckTokenMembership( NULL, AdministratorsGroup, &b)) {
b = FALSE;
}
FreeSid(AdministratorsGroup);
}

return b;
}

关于c++ - 我如何在 win xp 下在运行时提升我的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8676015/

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