2010-07-21 35 views

回答

8

只是試圖做一些事情,需要管理員權限:

uses 
    WinSvc; 

function IsAdmin(Host : string = '') : Boolean; 
var 
    H: SC_HANDLE; 
begin 
    if Win32Platform <> VER_PLATFORM_WIN32_NT then 
    Result := True 
    else begin 
    H := OpenSCManager(PChar(Host), nil, SC_MANAGER_ALL_ACCESS); 
    Result := H <> 0; 
    if Result then 
     CloseServiceHandle(H); 
    end; 
end; 
+0

我可以問一下這個程序的確切程度嗎?有什麼辦法可以給出假陽性或假結果?只是想知道是否有什麼。 – 2014-02-16 05:42:50

+1

它應該是相當可靠的。 GENERIC_WRITE包含SC_MANAGER_CREATE_SERVICE。而且您需要管理權限才能創建服務。 – davea 2014-02-17 20:05:30

+0

感謝您的評論。如何一次使用'GENERIC_READ'或'GENERIC_WRITE'或'GENERIC_EXECUTE'?它不應該溢出邊界嗎? – 2014-02-18 05:28:42

-2

至於明知羯羊或不是你的程序有管理員權限,我有沒有代碼,但是這可能是一個想法。請注意,我只寫了它,未經測試。

但這個想法是,如果你能夠在program files文件夾創建一個文件,那麼你可能有管理員權限。

function IsRunningWithAdminPrivs: Boolean; 
begin 
var 
    List: TStringList; 
begin 
    List := TStringList.Create; 
    try 
    try 
     List.Text := 'Sample'; 
     // Use SHGetFolder path to retreive the program files folder 
     // here is hardcoded for the sake of the example 
     List.SaveToFile('C:\program files\test.txt'); 
     Result := True; 
    except 
     Result := False; 
    end; 
    finally 
    List.Free; 
    DeleteFile('C:\program files\test.txt'); 
    end; 
end; 
+5

爲什麼不通過覆蓋隨機分區表來探測當前權限? – 2010-07-21 16:05:47

+0

這隻會測試您是否可以寫入'程序文件'目錄,並且如果目錄的安全設置已相應更改,則會失敗......並且由於代碼中存在錯誤(結果: =終於真「)。 ;) – 2010-07-21 16:15:14

+2

這會以很多方式失敗。在許多版本的本地化窗口上C:\ Program Files並不總是使用該名稱。您永遠不應該將系統路徑硬編碼到您的代碼中。使用API​​。 – 2010-07-21 16:33:48

相關問題