此问题在此处已有答案:
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);
2条答案
按热度按时间mbskvtky1#
我正在执行的程序需要以“管理员”身份运行才能正常工作。
如果这是真的,那么该程序 * 应该 * 有一个UAC清单,它指定
requireAdministrator
的requestedExecutionLevel
。在这种情况下,如果您的程序没有以提升的管理员身份运行,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,但看起来并没有发生这种情况。
是的,会的。
t2a7ltrp2#
我已经在我的程序中使用了它