2017-01-17 120 views
2

我需要关闭一些外部程序。需要关闭外部应用程序的Windows权限

是否我的应用程序需要管理员权限才能使用Windows API GetWindowThreadProcessIdOpenProcess了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

你需要'SE_DEBUG_PRIVILEGE'在您的令牌什么。和调用之前启用它'OpenProcess' – RbMm

回答

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你arguements,如果呼叫失败的最好方法,获取最后的错误设置(使用GetLastError()和检查检查是否有ERROR_ACCESS_DENIED(0x5的)值。一般所有

+0

我需要杀进程不是服务,是的,你是对的:我的应用程序以用户身份运行(中等)。 – Galaxian

+0

然后我用黑体字写的是真实的。 – lucasg

相关问题