如何在winxp运行时提升我的进程?
How can i elevate my process at runtime under win xp
我的应用程序需要在运行时做一些特权操作。例如,当用户第一次运行我的应用程序时,我必须创建并格式化一个虚拟驱动器。我使用未归档的api formatex来完成格式化工作,但是formatex需要管理员权限。如果操作系统是vista或更高版本,我可以用"COM Elevation Moniker"提示UAC对话框,它可以正常工作。但是在xp上,这种技术不适合,所以我使用冒充方法。如果应用程序作为受限用户运行,我会这样格式化:
CredUIPromptForCredentials() -> prompt to get administrator credentials
LogonUser()
ImpersonateLoggedOnUser()
formatex()
RevertToSelf()
formattex仍然失败…当然,以管理员身份运行我的应用程序可以工作,但它并不好,我的应用程序是按用户安装的,而不是按机器安装的,这应该在当前用户上下文中工作,即使用户是有限的用户。
我怎样才能在运行时正确地提升我的应用程序来完成格式化工作?有人帮忙吗?
一个可能的解决方案是使用更高的权限和一些命令行参数重新执行应用程序,这些参数将指示执行实际的格式化。
示例代码:
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;
}
相关文章:
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 进程在我的 c++ 代码上返回 -1073741571 (0xC00000FD)
- CLion 没有调试我的目标之一 - 立即"进程已完成,退出代码为 0"
- 为什么我应该使用 fork() 来守护我的进程?
- C++通过热键关闭我的进程
- 如何将我的 cli 信息(变量等)共享到子进程,这是一个 bash shell 脚本
- 如何在我的进程中运行的二进制文件中注册操作和内核
- 为什么我的 Redhat 服务器上的 QuickFIX 进程没有将其核心文件写入应有的位置?
- 窗口 :创建仅具有对我的进程的权限的目录 (C++)
- 有没有一种方法可以判断哪些线程正在我的进程中运行
- 如何确保我的进程永远不会将另一个进程锁定在文件之外
- SYSTEM_INFO::d wActiveProcessorMask是否可以在我的进程运行时更改
- 如何找出我的进程Id正在哪个物理CPU上运行
- 如何在winxp运行时提升我的进程?
- 如何在控制台中获得我的进程绑定到的行字符数
- 如何防止一个特定的DLL加载到我的进程
- C++/Win32 枚举属于我的进程的窗口并关闭它们
- 找到属于我的进程的z顺序中最高的非子窗口
- ReadProcessMemory减慢了我的进程
- 我的进程在主程序之前崩溃,由datamngr.dll