Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.07;
Скачать: CL | DM;

Вниз

Проверяем наличие администраторских привилегий.   Найти похожие ветки 

 
Terrible ©   (2002-09-04 15:19) [0]

Возникла необходимость проверять наличие административных прав. Во всей глобальной сети для Delphi предлагается один единственный привем, который не работает. Пытаюсь довести его до ума, но тут проблемка:
....
var
SystemSidAuthority: SID_IDENTIFIER_AUTHORITY = SECURITY_NT_AUTHORITY;
...
begin
...
if not AllocateAndInitializeSid(SystemSidAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
psidAdmin) then
...
end.

Константы типа SECURITY_NT_AUTHORITY, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS нигде не определены. Ладно, с поледними двумя просто: это DWord, нашёл в MSDN значения и подставил. Но вот что делат с первой. Как загнать необходимое значение в этот долбанный тип SID_IDENTIFIER_AUTHORITY.

Или может кто то поделится готовым исходником, который уже выполняет проверку административных привилегий ?
Кить в меня исходником, плиз, кто-нить на мыло.


 
Ученик ©   (2002-09-04 15:27) [1]

const
SECURITY_NT_AUTHORITY: TSidIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));

SECURITY_BUILTIN_DOMAIN_RID = ($00000020);
DOMAIN_ALIAS_RID_ADMINS = ($00000220);

function IsAdministrator: Boolean;
var
psidAdmin: Pointer;
Token: THandle;
Count: DWORD;
TokenInfo: PTokenGroups;
HaveToken: Boolean;
I: Integer;
begin
Result := False;
psidAdmin := nil;
TokenInfo := nil;
HaveToken := False;
try
HaveToken := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, Token);
if (not HaveToken) and (GetLastError = ERROR_NO_TOKEN) then
HaveToken := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, Token);
if HaveToken then
begin
Win32Check(AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
psidAdmin));
if GetTokenInformation(Token, TokenGroups, nil, 0, Count) or
(GetLastError <> ERROR_INSUFFICIENT_BUFFER) then
RaiseLastOSError;
TokenInfo := PTokenGroups(AllocMem(Count));
Win32Check(GetTokenInformation(Token, TokenGroups, TokenInfo, Count, Count));
for I := 0 to TokenInfo^.GroupCount - 1 do
begin
{$RANGECHECKS OFF} // Groups is an array [0..0] of TSIDAndAttributes, ignore ERangeError
Result := EqualSid(psidAdmin, TokenInfo^.Groups[I].Sid);
{$IFDEF RANGECHECKS_ON}
{$RANGECHECKS ON}
{$ENDIF RANGECHECKS_ON}
if Result then
Break;
end;
end;
finally
if TokenInfo <> nil then
FreeMem(TokenInfo);
if HaveToken then
CloseHandle(Token);
if psidAdmin <> nil then
FreeSid(psidAdmin);
end;
end;


 
Terrible ©   (2002-09-04 15:59) [2]

Огромное спасибо.
Вопрос закрыт, всё завелось.



Страницы: 1 вся ветка

Текущий архив: 2002.11.07;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.023 c
14-21822
Axel
2002-10-16 18:07
2002.11.07
Стив Тейксейра, Ксавье Пачеко. Borland Delphi 5.


6-21701
501Room
2002-09-08 19:01
2002.11.07
Как построить график исходящего и входящего трафика через модем


3-21440
nN_
2002-10-18 10:14
2002.11.07
TreeView и DBGrid


14-21790
MJH
2002-10-19 16:38
2002.11.07
win2151 -> utf-8


3-21456
sdram
2002-10-21 14:22
2002.11.07
Удаляющий запрос