Многие начинающие программисты сталкиваются с проблемой поднятия привилегий в Vista. Существует 3 способа это сделать:

  1. Включить специальный манифест в исполняемый файл
  2. Поднять привилегии во время выполнения программы путем запроса их у системы соответствующими API функциями
  3. Запустить отдельный процесс с привилегиями (в том числе и самого себя)


Рассмотрим первый и третий способ как самые простые. Чтобы создать манифест, необходимо сделать текстовый файл манифеста в кодировке UTF-8 со следующим содержимым:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
processorArchitecture="x86"
version="1.0.0.0"
type="win32"
name="ЛинкМастер 2.0"/>
<description>ЛинкМастер 2.0 - новый стандарт в SEO аналитике</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="x86"/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>


Для того чтобы включить в Delphi приложение этот манифест для Vista, нужно проделать следующие шаги:

  1. Сохранить указанное выше содержимое в xml файле с кодировкой UTF-8, например manifest.xml
  2. Создать тестовый файл задания для компилятора ресурсов brcc32.exe. Пусть например manifest.rc, со следующим содержимым:
    1 24 manifest.xml
  3. Скомпилировать ресурсный файл. Положить manifest.xml, manifest.rc в папку с компилятором ресурсов brcc32.exe (находится в директории Bin с установленной Delphi)
  4. Скомпилировать ресурсный файл. Перетаскиваем manifest.rc в пиктограмму brcc32.exe.
  5. Получившийся файл manifest.res, кладем в директорию с вашим проектом Delphi.
  6. В свойствах проекта пишем подключение ресурса {$R manifest.res}

Вот и все. Теперь при запуске приложения с таким манифестом будет выводится административный запрос, и программа в Vista будет запущена под администратором.

Но на самом деле такой способ неправильный. Вы обрекаете пользователя всегда подтверждать запуск вашего приложения с административными привилегиями. Гораздо лучший способ – вынести функции, требующие привелегий например в отдельный исполняемый файл. И запускать этот файл при необходимости следующей процедурой:

procedure RunAsAdministrator(const source:string);
var
shExecInfo:PSHELLEXECUTEINFOA;
begin
New(shExecInfo);
shExecInfo^.cbSize := sizeof(SHELLEXECUTEINFO);
shExecInfo^.fMask := 0;
shExecInfo^.Wnd := 0;
shExecInfo^.lpVerb := 'runas';
shExecInfo^.lpFile := PAnsiChar(ExtractFileName(source));
shExecInfo^.lpParameters := '';
shExecInfo^.lpDirectory := PAnsiChar(ExtractFilePath(source));
shExecInfo^.nShow := SW_SHOWNORMAL;
shExecInfo^.hInstApp := 0;
ShellExeCuteex(shExecInfo);
Dispose(shExecInfo);
shExecInfo:=nil;
end;

Связанные статьи: