![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Какой пользователь работает на компьютере? [D7, WinXP]
КрЫска © (2007-04-20 00:33:00)Подскажите, пожалуйста, как определить пользователь с какими правами работает на компьютере? Админ или нет?
КрЫска (2007-04-21 00:08:00) [1]Спасибо Вам огромное. Вы мне очень помогли!:-))
T.V (2007-04-20 11:22:00) [2]
function IsAdmin: Boolean;
var
hModule: THandle;
IsUserAnAdmin: function: Boolean; stdcall;
begin
Result := True;
hModule := LoadLibrary('shell32.dll');
if hModule <> 0 then
begin
IsUserAnAdmin := GetProcAddress(hModule,'IsUserAnAdmin');
if Assigned(IsUserAnAdmin) then
Result := IsUserAnAdmin;
FreeLibrary(hModule);
end;
end;
Elen (2007-04-20 08:06:00) [3]Вот еще из инета :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//**************************************************************************
function IsAdmin: Boolean;
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;
//**************************************************************************
procedure TForm1.FormCreate(Sender: TObject);
begin
if IsAdmin then caption:='admin' else caption:='No admin';
end;
end.
Elen (2007-04-20 07:56:00) [4]Можно попробовать вычеслить по привилегиям обычного процесса :
(Примерчик из Delphi World)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function GetPrivilegy(Delimiter:string=';'):string;
var
Form1: TForm1;
implementation
{$R *.dfm}
function GetPrivilegy;
const
TokenSize = 800; // (SizeOf(Pointer)=4 *200)
var
hToken: THandle;
pTokenInfo: PTOKENPRIVILEGES;
ReturnLen: Cardinal;
i: Integer;
PrivName: PChar;
DisplayName: PChar;
NameSize: Cardinal;
DisplSize: Cardinal;
LangId: Cardinal;
begin
GetMem(pTokenInfo, TokenSize);
if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
hToken) then ShowMessage('OpenProcessToken error');
if not GetTokenInformation(hToken, TokenPrivileges, pTokenInfo, TokenSize, ReturnLen) then
ShowMessage('GetTokenInformation error');
GetMem(PrivName, 255);
GetMem(DisplayName, 255);
for i := 0 to pTokenInfo.PrivilegeCount - 1 do
begin
DisplSize := 255;
NameSize := 255;
LookupPrivilegeName(nil, pTokenInfo.Privileges[i].Luid, PrivName, Namesize);
LookupPrivilegeDisplayName(nil, PrivName, DisplayName, DisplSize, LangId);
result:=result+string(PrivName){ +'('+ string(DisplayName)+')'}+Delimiter;
end;
FreeMem(PrivName);
FreeMem(DisplayName);
FreeMem(pTokenInfo);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.Items.Delimiter:=';';
ListBox1.Items.DelimitedText:=GetPrivilegy;
end;
end.