[Windows]_[初级]_[如何不编程判断进程是管理员模式启动(UAC)]

场景

  1. 我们在开发Windows程序时, 安装程序后一般会以admin方式启动程序, 这时候程序的权限一般是admin权限。可如果重新打开程序时, 程序就是asInvoker的权限,即所属用户的Normal权限. 程序在某些逻辑上admin和非admin是有区别的,比如响应WM_DROPFILES消息在admin下是失效的. 或者由于某些原因我想看这个程序是否管理员模式启动的,如何快速查看呢?

说明

Windows自带的任务管理器可以查看到:

Win7

打开任务管理器, 在进程(Processes)Tab页,选择菜单->视图(view)->选择列(Select Columns)->勾选UAC虚拟化(UAC Virtualization)

图1:如果在UAC虚拟化(UAC Virtualization)列是已禁止(Disable)就是正常模式启动的,如果显示的是Not Allowed或者不显示内容的就是管理员模式启动的程序.
在这里插入图片描述
在这里插入图片描述

Win10

打开任务管理器, 在详细信息(Detail)Tab页,鼠标在表头名称(Name)右键->选择列(Select Columns)->勾选特权(Elevated),在这列里的内容如果显示的是,那么这个进程就是管理员模式启动的.

图2
在这里插入图片描述

可以通过taskkill来判断

如果通过在进入命令行并执行 taskkill /f /pid 进程ID来判断进程是否是管理员启动.
出现以下错误结束不了基本上就是管理员启动的了:

C:\Users\apple>taskkill /f /pid 4048
ERROR: The process with PID 4048 could not be terminated.
Reason: Access is denied.
要实现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
发出的红包

打赏作者

Peter(阿斯拉达)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值