.NET中提升当前进程的UAC权限

       User Account Control (UAC)是从windows vista系统开始增加的一个安全控制组件。正常情况下,应用程序都运行在较低的权限级别上,但有时不得不强制要求当前进程以较高的安全级别上运行,这时就希望程序自身能够强制要求用户提升当前进程的权限,下面的方法就实现了权限检测与提升。

/// <summary>
/// 检查当前进程是否以administrator身份运行
/// </summary>
/// <returns>
/// </returns>
public bool IsRunAsAdmin()
{
	WindowsIdentity id = WindowsIdentity.GetCurrent();	
WindowsPrincipal principal = new WindowsPrincipal(id); return principal.IsInRole(WindowsBuiltInRole.Administrator); }

如果当前进程不是以Administrator身份运行,则提升进程权限:

       public void Elevate()
       {
            // 如果不是以administrator身份运行
if (!IsRunAsAdmin()) { // 以administrator身份,重启自己 ProcessStartInfo proc = new ProcessStartInfo(); proc.UseShellExecute = true; proc.WorkingDirectory = Environment.CurrentDirectory; proc.FileName = Application.ExecutablePath; proc.Verb = "runas"; try { Process.Start(proc); } catch { // 如果用户拒绝提升权限,直接退出 } Application.Exit(); // 退出 } else { MessageBox.Show("正以administrator运行当前进程", "UAC"); } }

     不仅仅是在UAC控制下,即便是在Windows XP下以非管理员用户启动程序,也会弹出runas对话框,要求以管理员身份运行,这样就能保证程序总是在最高用户权限下运行!

要实现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版本上都有效。在某些情况下,用户可能需要手动启动程序并选择“以管理员身份运行”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值