我需要关闭一些外部程序。
我的应用是否需要管理员权限才能使用Windows API GetWindowThreadProcessId , 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);
}
感谢。
答案 0 :(得分:2)
这实际上取决于您的应用程序和要杀死的外部进程。 Windows有一个非常复杂的流程交互授权系统(一切都围绕Access Tokens
)。
从Windows Vista开始,进程现在有integrity level,可以是:
Untrusted
。没有登录SID,无法访问文件系统。基本上是一个贱民。Low
。只能访问%LocalLow%
和一组受限制的API。通常用于沙箱应用程序的危险部分(解析器,评估程序等)Medium
。您的普通应用程序/用户High
。优越的特权。需要UAC
确认。可以想象,较低的完整性级应用程序不能干扰更高完整性级别的应用程序。由于这种机制很少被开发人员使用(除了MS产品和Web浏览器),我认为您的程序运行为Medium
。
从完整性级别分析,您的程序可能只能终止由同一用户创建的流程,并且不会管理员权限。
服务是长期流程,拥有自己的一套访问机制。服务通常需要管理级别(甚至SYSTEM
)来控制和终止。有些甚至可以仅由网络管理员修改(例如在AD中)或仅由Windows本身修改(例如用于PPL
services)
无论如何,检查它的最佳方法是使用您的参数调用OpenProcess
,如果调用失败,则检索最后一个错误集(使用GetLastError()
并检查ERROR_ACCESS_DENIED
}(0x5)值。