加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi:需要时提示UAC提升

发布时间:2020-12-15 05:21:52 所属栏目:大数据 来源:网络整理
导读:我们需要在运行时将一些设置更改为HKEY_LOCAL_MACHINE。 如果需要在运行时提示uac提升,或者我必须启动第二个提升的过程做’脏工作’吗? 解决方法 我会重新启动自己作为提升,通过命令行参数指示什么高架的事你想做。然后,您可以直接跳到相应的表单,或只
我们需要在运行时将一些设置更改为HKEY_LOCAL_MACHINE。

如果需要在运行时提示uac提升,或者我必须启动第二个提升的过程做’脏工作’吗?

解决方法

我会重新启动自己作为提升,通过命令行参数指示什么高架的事你想做。然后,您可以直接跳到相应的表单,或只保存您的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对象。

注意:没有“CoCreateInstanceAsAdmin”API调用。它只是一些浮动的代码。这里是Dephi版本我偶然发现。它显然是基于前缀一个类guid字符串与“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;

另一个问题:如何处理在Windows XP中作为标准用户运行的人员?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读