Delphi 以管理员身份创建进程[重复]

kiayqfof  于 2022-11-29  发布在  其他
关注(0)|答案(2)|浏览(207)

此问题在此处已有答案

Launch an EXE with elevated privileges from a "normal" non-elevated one?(1个答案)
4天前关闭。
我正在从 Delphi 执行一个命令行程序。
我使用CreateProcess是因为我需要捕获输出并将其显示在备忘录中。
我现在的问题是,我正在执行的程序需要“以管理员身份”运行才能正常工作。如果我在“以管理员身份”命令提示符下运行它,它执行得很好。
如何让CreateProcess以管理员身份运行?我看到ShellExecute有一个lpVerb参数,可以将其设置为'runas'以使其正常工作,但我需要CreateProcess才能捕获命令行输出并显示它。
我以为如果我以管理员身份运行我的exe,这些权限会传递给CreateProcess cmd,但看起来并没有发生这种情况。
关于如何告诉CreateProcess我想运行提升的进程,有什么想法吗?
下面是启动命令行的工作代码(只是不是作为管理员)

var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  Handle: Boolean;
begin
  with SA do begin
    nLength := SizeOf(SA);
    bInheritHandle := True;
    lpSecurityDescriptor := nil;
  end;
  CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
  try
    with SI do
    begin
      FillChar(SI, SizeOf(SI), 0);
      cb := SizeOf(SI);
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow := SW_HIDE;
      hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
      hStdOutput := StdOutPipeWrite;
      hStdError := StdOutPipeWrite;
    end;
    Handle := CreateProcess(nil, PWideChar('cmd.exe /C ' + CommandLine),
                            nil, nil, True, 0, nil,
                            PWideChar(WorkDir), SI, PI);
mbskvtky

mbskvtky1#

我正在执行的程序需要以“管理员”身份运行才能正常工作。
如果这是真的,那么该程序 * 应该 * 有一个UAC清单,它指定requireAdministratorrequestedExecutionLevel。在这种情况下,如果您的程序没有以提升的管理员身份运行,CreateProcess()将失败,并返回ERROR_ELEVATION_REQUIRED错误代码。如果不是这样,那么另一个程序的设计就不正确。
如何让CreateProcess以管理员身份运行?
您不能这样做,因为它不具备该功能。
您可以选择:

  • 以提升的管理员身份运行您的程序,以便调用CreateProcess()将在相同的提升的管理员上下文中运行命令。
  • ShellExecute/Ex()"runas"动词结合使用,以提升的管理员身份运行该命令(正如您已经知道的)。但是,您无法捕获新进程的输出,除非您指示该命令将其输出通过管道传输到一个临时文件,然后在命令终止后读取该文件。
  • 让主程序使用ShellExecute/Ex("runas")以提升管理员身份运行其自身的单独副本,然后该进程可以调用CreateProcess(),捕获输出,并通过您自己选择的IPC机制将其发送回主进程。
  • CreateProcess +捕获代码重构为单独的COM对象,然后在需要时使用COM Elevation Moniker在提升的管理上下文中示例化该对象。
  • 请使用本文中介绍的非官方CreateProcessElevated() API:Vista UAC: The Definitive Guide

我以为如果我以管理员身份运行我的exe,这些权限会传递给CreateProcess cmd,但看起来并没有发生这种情况。
是的,会的。

t2a7ltrp

t2a7ltrp2#

我已经在我的程序中使用了它

function RunAsAdmin(hWnd: hWnd; filename: string; Parameters: string; Visible: Boolean = true): 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;
  if Visible then
    sei.nShow := SW_SHOWNORMAL // Integer;
  else
    sei.nShow := SW_HIDE;

  Result := ShellExecuteEx(@sei);
end;

相关问题