CREATE_ELEVATED_OBJECT


Библиотека

V32.EXE

Характеристика

В системах до Windows Vista,  Windows 2008, Windows 7 функциональность ограничена

Синтаксис

CREATE_ELEVATED_OBJECT(ProgID: STRING[];
                       [ RunLevel: STRING[] ]
                      ): OBJECT;

Описание

Функция создает объект COM автоматизации и возвращает ссылку на него. Кокласс объекта определяется исходя из программного идентификатора ProgID. Вместо ProgID можно указать CLSID, заключенный в фигурные скобки. На самом деле, первое, что выполнит функция - получит CLSID из ProgID по информации из системного реестра, для чего выполняется поиск ProgID в разделе реестра HKCR.

Параметр RunLevel задает уровень требуемых привилегий. Допустимы следующие уровни.

По умолчанию используется уровень "Administrator".

Далеко не любой объект может быть создан на неограниченном маркере безопасности локального администратора. Во-первых, кокласс должен быть соответственным образом зарегистрирован. Строковым параметром "HKCR\CLSID\{CLSID}\LocalizedString" должно быть задано дружественное имя, иначе функция выбросит исключение 868. Повышение уровня привилегий должно быть разрешено установкой числового параметра "HKCR\CLSID\{CLSID}\Elevation\Enabled" в 1, иначе функция выбросит исключение 869. Во-вторых, класс должен быть сконфигурирован (dcomcnfg) для запуска от имени запускающего пользователя (это установка по умолчанию для большинства настольных приложений), иначе функция выбросит исключение 867. Сервер автоматизации ASB ("ASB.Application") соответствует перечисленным требованиям.

Под Windows Vista при выключенном UAC объект будет создан на прежнем маркере безопасности, т.е. администратор останется неограниченным администратором, а обычный пользователь - обычным пользователем. Фактически при выключенном UAC функция работает аналогично CREATE_OBJECT.

Под предшествующими версиями Windows функция также работает аналогично CREATE_OBJECT.

При работе с элевированным объектом автоматизации следует помнить, что сервер автоматизации возможно запущен от имени другого пользователя, соответственно с другим профилем. Поэтому не следует пытаться модифицировать элевированным объектом раздел HKCU и файлы в профиле. Создаваемые в процессе работы экземпляра ASL-интерпретатора (IASLEngine) объекты автоматизации унаследуют этот (возможно чужой) профиль. Если на этом профиле ни разу не запускался, например, Microsoft Word, создание объекта "Word.Application" приведет к запуску инсталлятора MS Office, что может быть весьма неожиданным для пользователя.

Фактически под Windows Vista и выше функция пользуется моникером элевации Windows (elevation moniker) и представляет собой некую модификацию приведенного ниже вызова.
GET_OBJECT("Elevation:RunLevel!new:{CLSID}")

В режиме терминального клиента ASB объект безусловно создается на стороне терминального клиента.

До версии 14.136.020 процедура называлась CreateElevatedOBJECT. В настоящее время допустимы оба варианта имени.

Исключительные ситуации

Не найдена одна из OLE-библиотек Исключение 164
Не удалось загрузить OLE-библиотеки Исключение 138
Одна из нужных точек входа в OLE-библиотеках не найдена Исключение 165
Не удалось инициализировать OLE-библиотеки Исключение 139
ProgID или CLSID не найден в реестре Исключение 140
Кокласс не поддерживает интерфейс COM автоматизации IDispatch Исключение 141
Кокласс сконфигурирован неверно Исключение 867
Для кокласса не зарегистрировано дружественное имя Исключение 868
Для кокласса не разрешена элевация Исключение 869
Не удалось создание объекта COM автоматизации Исключение 142
Ошибка компонента Исключение класса Exc_Object

См. также

Пример 1

VAR
 objXL: OBJECT;
BEGIN
 objXL := GET_OBJECT(, "Excel.Application");
 (* Получили объект кокласса Excel.Application (первый попавшийся) *)
END.

Пример 2

VAR
 objXL: OBJECT;
BEGIN
 objXL := GET_OBJECT("c:\Test.xls");
 (* Получили ссылку на объект кокласса Excel.Workbook, *)
 (* загруженный из c:\Test.xls *)
 (* .................................................. *)
END.