2017-01-17 82 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

相關問題