2010-07-21 97 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

相关问题