2011-08-13 223 views
-1

DelphiXe,Win7x64检测管理员帐户

如何定义,用户启动的程序启动时,它代表系统管理员(域或本地)的系统记录。我定义的权利如下:

Function IsUserAdmin:Bool; 
Const 
    SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =(Value: (0, 0, 0, 0, 0, 5)); 
    SECURITY_BUILTIN_DOMAIN_RID = $00000020; 
    DOMAIN_ALIAS_RID_ADMINS = $00000220; 
Var 
    hAccessToken: THandle; 
    ptgGroups: PTokenGroups; 
    dwInfoBufferSize: DWORD; 
    psidAdministrators: PSID; 
    x: Integer; 
    bSuccess: BOOL; 
begin 
    Result := False; 
    bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, hAccessToken); 
    if not bSuccess then 
    begin 
    if GetLastError = ERROR_NO_TOKEN then 
     bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hAccessToken); 
    end; 

    if bSuccess then 
    begin 
    GetMem(ptgGroups, 1024); 
    bSuccess := GetTokenInformation(hAccessToken, TokenGroups, ptgGroups, 
            1024, dwInfoBufferSize); 
    CloseHandle(hAccessToken); 
    if bSuccess then 
    begin 
     AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, 
           SECURITY_BUILTIN_DOMAIN_RID, 
           DOMAIN_ALIAS_RID_ADMINS, 
           0, 0, 0, 0, 0, 0, psidAdministrators); 
     {$R-} 
     for x := 0 to ptgGroups.GroupCount-1 do 
     if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then 
     begin 
      Result := True; 
      Break; 
     end; 
     {$R+} 
     FreeSid(psidAdministrators); 
    end; 
    FreeMem(ptgGroups); 
    end; 
end; 

但它只是将用户的配件定义为管理员组。如何定义,从会计记录“管理员”开始到底是什么开始(考虑到记录名称可以更改什么(该帐户被重命名,例如“管理员”)?

PS这一切都是如果启动应用程序的用户是在包容的Windows UAC组管理员在它开始代表管理员将所有相同的请求

因此,有必要对我来说:

  1. 要了解的是,启动程序的用户在组 管理员(本地或域)是作为工作
  2. 开始由代系统的会计记录中的“管理员”的(CAN和重命名),而不是用管理员的权限创建新用户

[更新]

一旦再以另一种方式。我们会承认,在系统中有一些帐户:管理员(默认情况下是管理员的系统帐户),用户1(包含组“管理员”,新创建的帐户),用户2(包含在组“用户”中,新创建帐户)。出于任何原因,系统帐户“管理员”在“管理员”(或任何其他名称)中重命名。有我的申请。它由不同的用户启动。对于我来说,启动我的应用程序的用户是系统管理员(Admin)。因为对于Windows UAC,从User1和Admin启动的权限将有所不同 - 也只有当应用程序启动User1并且Admin - 消息UAC不会出现时才会出现问题UAC。这里有一个问题:如何定义,启动应用程序的用户是什么= Admin(旧名称Administrator),换句话说,用户是系统管理员?

极品:

Function GetCurrentUserName:string; 
begin 
... detect current user name 
end; 

Function isCurrentUserisAdministratorPC:bool; 
begin 
// ??? Result:=isUserPCAdmin(GetCurrentUserName); 
end; 

//使用

用户1启动程序:isCurrentUserisAdministratorPC返回False;

User2启动程序:isCurrentUserisAdministratorPC return False;

管理员启动程序:isCurrentUserisAdministratorPC返回TRUE; //!

将帐号Admin重命名为Test123。

Test123启动程序:isCurrentUserisAdministratorPC返回TRUE; //!

+0

你想通过检测用户权限来完成什么? –

回答

2

该代码检查用户是否为Administrators组的成员。有人可以成为Administrators组的成员,但不具有任何管理员权限。

你想知道用户是否真的管理员privelages。我已经回答了这个问题here.

0

已找到。在内置记录中,通过NetUserEnum(http://msdn.microsoft.com/en-us/library/aa370652(VS.85).aspx)级别= 1的标志将返回标志66049(或66051,如果它断开连接)。

伊恩博伊德: 如果该代码检查用户是管理员组的成员。有人可以是管理员组的成员,但没有任何管理员权限。

如果包含在Windows UAC,起初为权利接待组管理员的成员应该确认它从UAC消息的新兴窗口(这是默认包含在本地和组政客视窗)。个人电脑管理员的本地记录 - 不需要这样的操作。

是的,它也检测到“IsUserAnAdmin”功能。

if IsUserAnAdmin then Showmessage('Admin') else Showmessage('Not Admin, or UAC enabled');