Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

uac + действия или [D7]


QAZ ©   (2010-01-25 11:17:00) 

как сделать выполнение команды под админом если прога запущена юзером ? т.е. все надеюсь видели кнопки со щитом, вот я про это
и соответствено повышение прав дается только под выполнение команды или навсегда для всей проги ?


Rouse_   (2010-01-26 22:00:00) [1]

под UAC все сразу виртуализируется без дополнительных вопросов.


QAZ   (2010-01-26 21:41:00) [2]

я не про запуск самой проги от админа и манифесты
а про команды выполняемые под админом,т.е. запись в реестр удал. файлов, когда системой задается вопрос разрешить или нет,а не возвращается типа нет доступа или проглатывается виртуализацией
при этом изначально прога не под админом,и встречается это частенько


Игорь Шевченко   (2010-01-26 21:27:00) [3]

к Игорь Шевченко ©   (26.01.10 20:51) [10]

Все нормально, IsUserAdmin показывает поднятые привилегии тоже.
http://cc.embarcadero.com/item/24512


Rouse_   (2010-01-26 21:24:00) [4]

Ну мой вариант гарантированно работает всегда, проверял и под вистой и под 2008 сервером и под семеркой (как 32 так и 64 бита)


Eraser   (2010-01-26 21:11:00) [5]

в примере по ссылке есть
// IsUserAnAdmin.
function IsAdmin4: Boolean;
var
 hShell32: HMODULE;
 _IsUserAnAdmin: function(): BOOL; stdcall;
begin
 Result := False;

 hShell32 := LoadLibrary('shell32.dll');
 _IsUserAnAdmin := GetProcAddress(hShell32, 'IsUserAnAdmin'); // Do not localize
 if Assigned(_IsUserAnAdmin) then
   Result := _IsUserAnAdmin()
 else
   ShowMessage('Does not supported!');
end;


только она тоже не правильно в домене работает иногда.


Rouse_   (2010-01-26 21:05:00) [6]


> Игорь Шевченко ©   (26.01.10 21:02) [12]
> Rouse_ ©   (26.01.10 20:56) [11]
>
> Я говорю про функции в Shell32.dll или в Shlwapi.dll

Мдя... совсем мозги зашорились... :) Ясно :)


Игорь Шевченко   (2010-01-26 21:02:00) [7]

Rouse_ ©   (26.01.10 20:56) [11]

Я говорю про функции в Shell32.dll или в Shlwapi.dll, без разницы, каким средством разработки пользоваться.


Rouse_   (2010-01-26 20:56:00) [8]

Ну это ты наверно про 2009-ую студию говоришь, ибо в 2007-ой нет модуля Shell32, а в модуле ShlwApi нет IsUserAnAdmin


Игорь Шевченко   (2010-01-26 20:51:00) [9]

Rouse_ ©   (26.01.10 20:39) [9]

Я не знаю, как оно отрабатывает при обычном пользователе, но с поднятыми правами. Наверняка что-то на эту тему есть в Shell32 или в ShlwApi изданием для Vista или Windows 7


Rouse_   (2010-01-26 20:39:00) [10]


> Кстати не совсем понял зачем нужен особый способ определения
> админских прав для UAC? Работает и стандартный вроде.

У меня не отрабатывал, пришлось допиливать. Точнее как, под Windows 7 возвращал что я с админскими правами, хотя на самом деле приложение было запущено как обычный пользователь.
Опять-же делалось все в состоянии  "сдать проект нужно еще вчера", поэтому...


> Игорь Шевченко ©   (26.01.10 18:47) [8]
> > до кучи
> Shell32.IsUserAnAdmin

Танк секретный, наука может и не знать? :)
Shell32 моя 2007-ая студия не опознает :)


Игорь Шевченко   (2010-01-26 18:47:00) [11]


> до кучи


Shell32.IsUserAnAdmin


Eraser   (2010-01-26 18:37:00) [12]

> [5] Rouse_ ©   (26.01.10 18:09)

у этого способа (точнее не конретно этого, а такого подхода с перечислением вручную) есть недостаток. у некоторых клиентов при сложной организации прав в домене он отрабатывал не правильно, причем даже на XP. Ховард рекомендует такие проверки делать с пом. CheckTokenMembership.

Кстати не совсем понял зачем нужен особый способ определения админских прав для UAC? Работает и стандартный вроде.

до кучи пример с 5 способами проверки админских прав (4 самый корректный) http://slil.ru/28550987

// CheckTokenMembership.
function IsAdmin3: Boolean;
const
 SE_GROUP_ENABLED = $00000004;
 SE_GROUP_USE_FOR_DENY_ONLY  = $00000010;
var
 psidAdministrators: PSID;
 bIsMember: LongBool;
begin
 Result := False;
 if Win32Platform <> VER_PLATFORM_WIN32_NT then
 begin
   Result := True;
   Exit;
 end;

 psidAdministrators := nil;
 try
   if AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
     SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
     0, 0, 0, 0, 0, 0, psidAdministrators) then
   begin
     if CheckTokenMembership(0, psidAdministrators, bIsMember) then
       Result := bIsMember;
   end;
 finally
   if psidAdministrators <> nil then
     FreeSid(psidAdministrators);
 end;
end;


Eraser   (2010-01-26 18:23:00) [13]

в дополнение к  [4] Rouse_ ©   (26.01.10 18:04)
скажу что, нужно удалить из проекта и других юнитов все упоминания о модуле XPMan (компонент TXPManifest), а то он подсовывает свой манифест, который мешает новому.


Rouse_   (2010-01-26 18:09:00) [14]

Вот тебе кстати до кучи код, который показывает имеем ли мы админские права или нет с учетом UAC

type
 TPrivilegeCheckState = (csError, csLimitedUser, csAdmin);

function IsAdmin: TPrivilegeCheckState;
const
 SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
   (Value: (0, 0, 0, 0, 0, 5));
 SECURITY_BUILTIN_DOMAIN_RID = $00000020;
 DOMAIN_ALIAS_RID_ADMINS = $00000220;
 SECURITY_MANDATORY_HIGH_RID = $00003000;
 TokenIntegrityLevel = 25;
var
 hAccessToken: THandle;
 ptgGroups: PTokenGroups;
 dwInfoBufferSize: DWORD;
 psidAdministrators: PSID;
 I: Integer;
 SubAuthority: DWORD;    
begin
 Result := csError;
 if Win32Platform <> VER_PLATFORM_WIN32_NT then Exit;
 if not OpenThreadToken(GetCurrentThread,
   TOKEN_QUERY, True, hAccessToken) then
   if not OpenProcessToken(GetCurrentProcess,
     TOKEN_QUERY, hAccessToken) then Exit;
 try
   GetMem(ptgGroups, 1024);
   try
     if Win32MajorVersion < 6 then
     begin
       if not GetTokenInformation(hAccessToken, TokenGroups,
         ptgGroups, 1024, dwInfoBufferSize) then Exit;
       AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
         SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
         0, 0, 0, 0, 0, 0, psidAdministrators);
       try
         Result := csLimitedUser;
         for I := 0 to ptgGroups.GroupCount - 1 do
           if EqualSid(psidAdministrators, ptgGroups.Groups[I].Sid) then
           begin
             Result := csAdmin;
             Break;
           end;
       finally
         FreeSid(psidAdministrators);
       end;
     end
     else
     begin
       if GetTokenInformation(hAccessToken, TTokenInformationClass(TokenIntegrityLevel),
         ptgGroups, 1024, dwInfoBufferSize) and
         IsValidSid(PSIDAndAttributes(ptgGroups)^.Sid) then
       begin
         Result := csLimitedUser;
         SubAuthority :=
           GetSidSubAuthorityCount(PSIDAndAttributes(ptgGroups)^.Sid)^ - 1;
         if GetSidSubAuthority(PSIDAndAttributes(ptgGroups)^.Sid,
           SubAuthority)^ >= SECURITY_MANDATORY_HIGH_RID then
           Result := csAdmin;
       end;
     end;
   finally
     FreeMem(ptgGroups);
   end;
 finally
   CloseHandle(hAccessToken);
 end;
end;


Rouse_   (2010-01-26 18:04:00) [15]

Поднять нельзя. А запрашивать права при старте очень даже просто. Пипшешь вот такой RC файл:

#define RT_MANIFEST  24
#define CREATEPROCESS_MANIFEST_RESOURCE_ID  1
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST ".\manifest.txt"


Подключаешь этот RC к своей программе (стандартный манифест только отключи)

В файл manifest.txt вбиваеш след текст:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 <assemblyIdentity
    type="win32"
    name="DelphiApplication"
    version="1.0.0.0"
    processorArchitecture="*"/>
 <dependency>
    <dependentAssembly>
      <assemblyIdentity
         type="win32"
         name="Microsoft.Windows.Common-Controls"
         version="6.0.0.0"
         publicKeyToken="6595b64144ccf1df"
         language="*"
         processorArchitecture="*"/>
    </dependentAssembly>
 </dependency>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
         <requestedExecutionLevel
           level="requireAdministrator"
           uiAccess="false"/>
      </requestedPrivileges>
    </security>
 </trustInfo>
</assembly>


Получаешь программу со "щитом", которая при старте будет требовать права админа.
Из минусов - если дельфя запущена без админских прав, дебащить проект с таким манифестом с включенным UAC не получится.


Eraser   (2010-01-26 17:19:00) [16]

> [2] Дмитрий С ©   (26.01.10 15:54)

нельзя вроде как.


Дмитрий С   (2010-01-26 15:54:00) [17]


> Eraser ©   (25.01.10 17:09) [1]

А на время поднять свои права можно?


Eraser   (2010-01-25 17:09:00) [18]

> или навсегда для всей проги ?

конкретно для какого-то действия нельзя. админские права запрашиваются для всей программы.


Наверх

Титульная страница Поиск, карта сайта Написать письмо