检测管理员帐户
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组管理员在它开始代表管理员将所有相同的请求
因此,有必要对我来说:
- 要了解的是,启动程序的用户在组 管理员(本地或域)是作为工作
- 开始由代系统的会计记录中的“管理员”的(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; //!
该代码检查用户是否为Administrators
组的成员。有人可以成为Administrators组的成员,但不具有任何管理员权限。
你想知道用户是否真的有管理员privelages。我已经回答了这个问题here.
已找到。在内置记录中,通过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');
你想通过检测用户权限来完成什么? –