Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2014, 21:55   #1
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
Вопрос UAC, COM Elevation Moniker

Приветствую!

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

Сделал тестовое приложение, сделал ActiveX Library, добавил Com Object, сваял тестовый метод, зарегистрировал библиотеку в системе.

Код:
CLID: {1FDCEE9D-E747-4616-9D00-D55D7FD26B03}

ITestOBJ = interface(IUnknown)
  ['{0FD34325-6654-4DC4-9537-11CAA5B25652}']
  function GetSum(S1: HResult; S2: HResult): HResult; stdcall;
end;
Если просто создать COM объект, то все работает прекрасно.

Код:
II, TOBJ: ITestOBJ;

procedure TForm1.Button2Click(Sender: TObject);
begin
 II:=CoTestOBJ.Create;
 II.QueryInterface(ITestOBJ, TOBJ);
end;
Если вызывать моникер с запросом прав, - то не работает.
Код:
function NewCoGetObject(pazName: PWideChar; pBindOptions: PBindOpts3;
         const iid: TIID; out ppv): HResult; stdcall; external 'ole32.dll'
         name 'CoGetObject';
function CoCreateInstanceAsAdmin(WndHandle: HWND; clsid: TCLSID;
    iid: TIID; out ppv): HRESULT;
var
    Bo      : TBindOpts3;
    Moniker : PWideChar;
begin
    Moniker := PWideChar(WideString('Elevation:Administrator!new:' +
                                    GuidToString(clsid)));
    FillChar(Bo, SizeOf(Bo), #0);
    Bo.hwnd           := WndHandle;
    Bo.cbStruct       := SizeOf(Bo);
    Bo.dwClassContext := CLSCTX_LOCAL_SERVER;
    Result            := NewCoGetObject(Moniker, @Bo, iid, ppv);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 z: ITestOBJ;
begin
 OleCheck(CoCreateInstanceAsAdmin(Self.Handle,
                                     CLASS_TestOBJ,
                                     ITestOBJ,
                                     z));

 ShowMessage(IntToStr(z.GetSum(1, 2)));
end;


Может быть я что-то сделал не так?

Может DLL как-то по особенному зарегистрировать?

P.S.
Windows 8.1 Pro x64, Delphi XE5
STRELOK-2007 вне форума Ответить с цитированием
Старый 28.01.2014, 01:29   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
Лампочка

В помощь:
Vista UAC in Delphi: Part 3
COM Elevation Moniker fails to elevate the server under Vista/Windows 7
Официальная документация Microsoft:
The COM Elevation Moniker
Streletz вне форума Ответить с цитированием
Старый 28.01.2014, 13:56   #3
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
Восклицание

Цитата:
Сообщение от Streletz Посмотреть сообщение
Читал я эти статьи, много раз натыкался в поисках. Нигде нет завершенного целостного примера, на любом языке, только кусочки кода, да и те не компилятся.

К примеру, я так и не нашел (опять же на любом языке) реализацию SetAccessPermissionsForLUAServer и CreateRegKeyEx.

Опять-же, английский, не очень хорошо понимаю, что создает небольшой барьер.
STRELOK-2007 вне форума Ответить с цитированием
Старый 28.01.2014, 14:13   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Быть не может чтобы на MSDN тему не раскрыти.
Человек_Борща вне форума Ответить с цитированием
Старый 28.01.2014, 14:24   #5
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
Вопрос

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Быть не может чтобы на MSDN тему не раскрыти.
Да, но проблема в том, что они в основном пишут только на английском языке. А английский язык, я понимаю только отдельные слова. Переводчики типа гугла, вообще порой бредятину выдают, что лучше и не переводить.

Общий смысл не полностью понятен.
STRELOK-2007 вне форума Ответить с цитированием
Старый 28.01.2014, 15:09   #6
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
Стрелка

Цитата:
Сообщение от STRELOK-2007 Посмотреть сообщение
Да, но проблема в том, что они в основном пишут только на английском языке. А английский язык, я понимаю только отдельные слова. Переводчики типа гугла, вообще порой бредятину выдают, что лучше и не переводить.

Общий смысл не полностью понятен.
Учите английский.
Простите, я не хочу повторяться, потому, что уже писал буквально об этом же, только в другой теме и другому человеку. Просто ИМХО в данном посте тема необходимости изучения английского языка для программиста мной раскрыта в достаточной степени.
Streletz вне форума Ответить с цитированием
Старый 29.01.2014, 18:02   #7
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

Делай через манифест, и все.
HTTqp вне форума Ответить с цитированием
Старый 29.01.2014, 18:24   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Не комильфо. Программа работоспособна даже в ограниченной учетке, и 1 раз за всю жизнь надо повышенные привелегии, что ради этого всю программу накрыть колпаком "только для админа?"
Человек_Борща вне форума Ответить с цитированием
Старый 03.02.2014, 21:41   #9
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
По умолчанию

Нашел еще немного времени поработать над данным вопросом

Процесс немного сдвинулся, правда не понятно, в каком направлении - вперед или назад.

Появляется ошибка "Класс не зарегистрирован".

В чем может быть дело?

P.S.
Как и в тот раз, при обычном получении COM интерфейса, все работает прекрасно. Проблема именно в "элеваторе".
STRELOK-2007 вне форума Ответить с цитированием
Старый 03.02.2014, 22:54   #10
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
Вопрос

Код:
procedure TForm1.Button3Click(Sender: TObject);
var
 z: ITestOBJ;
 hr: HRESULT;

 BO: BIND_OPTS3;
 MonikerName: WideString;
begin
 hr:=0;
 z:=nil;

 MonikerName := 'Elevation:Administrator!new:' + GUIDToString(CLASS_TestOBJ);
 FillChar(BO, SizeOf(BIND_OPTS3), 0);

 BO.cbStruct := SizeOf(BIND_OPTS3);
 BO.dwClassContext := CLSCTX_LOCAL_SERVER;
 BO.hwnd := Self.Handle;

 hr:=CoGetObject(PWideChar(MonikerName), @BO, ITestOBJ, @z);

 OleCheck(hr);

 ShowMessage(IntToStr(z.GetSum(1, 2)));
end;
Выдает вот что:


Но дальше, все равно Класс не зарегистрирован

Что я делаю не так?
STRELOK-2007 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
UAC, автозагрузка и ПО Человек_Борща Win Api 14 28.10.2013 23:30
CreateProcess и UAC XeruH Общие вопросы Delphi 0 02.04.2013 22:16
uac manifest fucil Общие вопросы Delphi 3 10.05.2012 02:02
Delphi vs UAC dyonysos Общие вопросы Delphi 0 02.05.2010 20:02