gpt4 book ai didi

Delphi:需要时提示 UAC 提升

转载 作者:行者123 更新时间:2023-12-03 14:32:50 36 4
gpt4 key购买 nike

我们需要在运行时更改 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 版本。它显然是基于当通常隐藏的代码内部调用 CoGetObject 时,在类 GUID 字符串前添加“Elevation:Administrator!new:”前缀的技巧:

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 中以标准用户身份运行的人?

关于Delphi:需要时提示 UAC 提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/923350/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com