Delphi: Подсказка для повышения контроля учётных записей при необходимости

спасибо за подсказки, получил здесь рабочий код для себя. он скопирует каждый элемент списка и удалит 1-ую кому.

var list_with_coma = ", " + list_item;
var unwantedCharacter = ",";

$('#id_of_input').val(function(){
if (this.value.charAt(0) == unwantedCharacter){
this.value = this.value.substr(1);}
return this.value + list_with_coma;
});
36
задан Ken White 29 May 2009 в 02:45
поделиться

2 ответа

Вы не можете «повысить» существующий процесс. Процессы с повышенными правами в UAC имеют другой токен с другим LUID, другим обязательным уровнем целостности и другим членством в группах. Этот уровень изменений не может быть осуществлен в рамках запущенного процесса - и это было бы проблемой безопасности, если бы это могло произойти.

Вам необходимо запустить второй процесс с повышенными правами, который будет выполнять эту работу, или путем создания COM-объекта, который запускается в dllhost с повышенными привилегиями.

http://msdn.microsoft.com/en-us/library/bb756922.aspx дает пример функции «RunAsAdmin» и функции «CoCreateInstanceAsAdmin».

РЕДАКТИРОВАТЬ: I только что увидел в названии "Delphi". Все, что я перечислил, явно родное,

20
ответ дан 27 November 2019 в 05:57
поделиться

Я бы перезапустил себя с повышенными правами, передав параметры командной строки, указывающие, какие действия с повышенными правами вы хотите делать. Затем вы можете перейти прямо к соответствующей форме или просто сохранить данные HKLM.

function RunAsAdmin(hWnd: HWND; filename: string; Parameters: string): Boolean;
{
    See Step 3: Redesign for UAC Compatibility (UAC)
    http://msdn.microsoft.com/en-us/library/bb756922.aspx

    This code is released into the public domain. No attribution required.
}
var
    sei: TShellExecuteInfo;
begin
    ZeroMemory(@sei, SizeOf(sei));
    sei.cbSize := SizeOf(TShellExecuteInfo);
    sei.Wnd := hwnd;
    sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
    sei.lpVerb := PChar('runas');
    sei.lpFile := PChar(Filename); // PAnsiChar;
    if parameters <> '' then
        sei.lpParameters := PChar(parameters); // PAnsiChar;
    sei.nShow := SW_SHOWNORMAL; //Integer;

    Result := ShellExecuteEx(@sei);
end;

Другое решение, предлагаемое Microsoft, - создать COM-объект вне процесса (с использованием специально созданной функции CoCreateInstanceAsAdmin). Мне не нравится эта идея, потому что вам нужно написать и зарегистрировать COM-объект.


Примечание: Нет вызова API "CoCreateInstanceAsAdmin". Это просто плавающий код. Вот версия Dephi, на которую я наткнулся. Очевидно, это основано на трюке с префиксом строки идентификатора класса префиксом « Elevation: Administrator! New: », когда обычно скрытый код внутренне вызывает CoGetObject :

function CoGetObject(pszName: PWideChar; pBindOptions: PBindOpts3; 
      const iid: TIID; ppv: PPointer): HResult; stdcall; external 'ole32.dll';

procedure CoCreateInstanceAsAdmin(const Handle: HWND; 
      const ClassID, IID: TGuid; PInterface: PPointer);
var
   BindOpts: TBindOpts3;
   MonikerName: WideString;
   Res: HRESULT;
begin
   //This code is released into the public domain. No attribution required.
   ZeroMemory(@BindOpts, Sizeof(TBindOpts3));
   BindOpts.cbStruct := Sizeof(TBindOpts3);
   BindOpts.hwnd := Handle;
   BindOpts.dwClassContext := CLSCTX_LOCAL_SERVER;

   MonikerName := 'Elevation:Administrator!new:' + GUIDToString(ClassID);

   Res := CoGetObject(PWideChar(MonikerName), @BindOpts, IID, PInterface);
   if Failed(Res) then 
      raise Exception.Create(SysErrorMessage(Res));
end;

Еще один вопрос :

23
ответ дан 27 November 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: