关闭外部应用程序所需的Windows权限
Windows privileges needed to close a external app
我需要关闭一些外部程序。
我的应用程序是否需要管理员权限才能使用Windows APIGetWindowThreadProcessId、OpenProcess和TerminateProcess或用户模式已满?
我已经检查了XP和7,运行良好,但我知道新版本的限制性更强。
我使用以下代码:
bool CloseApp(const char *WindowName)
{
HWND hWnd;
hWnd=FindWindow(nullptr,WindowName);
if(!hWnd)return(true); // Not running
DWORD pid;
GetWindowThreadProcessId(hWnd,&pid);
if(!pid)return(false);
HANDLE prc;
prc=OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE,FALSE,pid);
if(!prc)return(false);
TerminateProcess(prc,0);
DWORD rst=WaitForSingleObject(prc,10000); // Wait until completion
CloseHandle(prc);
if(FindWindow(nullptr,WindowName))return(false); // Check if still running
return(true);
}
谢谢。
这实际上取决于您的应用程序和您想要终止的外部进程。Windows有一个相当复杂的进程交互授权系统(一切都围绕着Access Tokens
)。
流程
自从Windows Vista以来,进程现在有一个完整性级别,可以是:
Untrusted
。没有登录SID,无法访问文件系统。基本上是贱民Low
。只能访问%LocalLow%
和一组受限的API。通常用于沙盒应用程序的危险部分(解析器、评估器等)Medium
。您的普通应用程序/用户High
。高级特权。需要UAC
确认
可以想象,较低完整性级别的应用程序不会干扰较高完整性级别应用程序。由于开发人员很少使用这种机制(除了MS产品和web浏览器),我假设您的程序运行为Medium
。
根据完整性级别分析,您的程序可能只能终止由同一用户创建的进程,并且没有管理权限。
服务
服务是一个长期的过程,有自己的一套访问机制。服务通常需要控制和终止管理级别(甚至SYSTEM
)。有些甚至只能由网络管理员修改(例如在AD中)或只能由Windows本身修改(例如用于PPL
服务)
无论如何,检查它的最佳方法是使用参数调用OpenProcess
,如果调用失败,则检索最后一个错误集(使用GetLastError()
并检查ERROR_ACCESS_DENIED
(0x5)值。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux for Windows上编译C++代码时出错
- 如何使用Windows API C++更改已创建的文件夹/目录安全权限
- 检查文件是否具有Windows c ++的可执行权限
- 关闭外部应用程序所需的Windows权限
- 以 Windows 服务身份运行应用程序是否需要管理员权限
- Windows 7如何确定您是否需要管理员权限?(vc60)
- 如何在Qt/C++中设置Windows文件权限
- 在Windows上读取性能数据计数器是否需要任何特殊的安全权限
- >使用 RegCreateKeyEx() 的 Windows 可执行文件不会提示输入 UAC 管理员权限并失败?
- "Standard I/O only" Windows 下的权限
- Visual Studio Online(调整用户权限-不是TFS用户,而是windows用户)
- 正在检查非提升用户在Windows上的文件权限
- 如果应用程序以windows上的管理权限从cmd打开,则会出现访问冲突
- 可执行文件是否可以要求管理员权限?(Windows 7)
- 从没有管理员权限的应用程序启动Windows服务(c++)
- 检查windows文件权限
- 通过Winapi以编程方式编辑Windows审核策略时出现权限错误
- 无Admin权限使用Windows api收集事件日志
- 如果在Windows 8上,C++请求管理权限