c++ 设置进程管理员权限自启动并且过UAC
时间: 2023-07-01 22:09:36 浏览: 562
管理员权限判断和轻松切换源码
要实现C++程序在启动时获取管理员权限并且避免UAC提示框的出现,可以通过以下步骤:
1. 在程序代码中添加以下代码,以提升程序的权限:
```c++
BOOL SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
TOKEN_PRIVILEGES tp;
LUID luid;
if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid))
{
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
{
return FALSE;
}
return (GetLastError() == ERROR_SUCCESS);
}
void SetAdministratorPrivilege()
{
HANDLE hToken;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
SetPrivilege(hToken, SE_DEBUG_NAME, TRUE);
CloseHandle(hToken);
}
```
此代码片段使用Windows API函数 `OpenProcessToken` 和 `AdjustTokenPrivileges` 获取并提升程序的权限。请注意,此代码片段假定您的帐户已具有管理权限。
2. 将以下代码添加到程序的主函数中,以检查程序是否以管理员身份运行。如果不是,则使用管理员权限重新运行程序:
```c++
BOOL IsRunAsAdministrator()
{
BOOL fIsRunAsAdmin = FALSE;
DWORD dwError = ERROR_SUCCESS;
PSID pAdministratorsGroup = NULL;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
if (!AllocateAndInitializeSid(&NtAuthority, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&pAdministratorsGroup))
{
dwError = GetLastError();
goto Cleanup;
}
if (!CheckTokenMembership(NULL, pAdministratorsGroup, &fIsRunAsAdmin))
{
dwError = GetLastError();
goto Cleanup;
}
Cleanup:
if (pAdministratorsGroup)
{
FreeSid(pAdministratorsGroup);
pAdministratorsGroup = NULL;
}
SetLastError(dwError);
return fIsRunAsAdmin;
}
int main()
{
if (!IsRunAsAdministrator())
{
SHELLEXECUTEINFO sei = { sizeof(sei) };
sei.lpVerb = TEXT("runas");
sei.lpFile = TEXT("yourprogram.exe");
sei.nShow = SW_NORMAL;
if (!ShellExecuteEx(&sei))
{
return GetLastError();
}
return 0;
}
SetAdministratorPrivilege();
// your program code here
return 0;
}
```
此代码片段检查程序是否以管理员身份运行。如果不是,它使用 `ShellExecuteEx` 函数以管理员权限重新启动程序。通过此方法重新启动程序会自动获取管理员权限,并且不会出现UAC提示框。
请注意,此方法不能保证在所有Windows版本上都有效。在某些情况下,用户可能需要手动启动程序并选择“以管理员身份运行”。
阅读全文