在标准用户帐户(Delphi)中以管理员身份运行外部程序

在标准用户帐户(Delphi)中以管理员身份运行外部程序,delphi,createprocess,Delphi,Createprocess,我有一个代码,可以帮助我作为管理员运行外部程序。如果运行我的程序的用户是管理员,那么它工作得很顺利 程序RunApp; 常数 记事本路径='C:\windows\system32\notepad.exe'; 变量 SI:TStartupInfo; PI:t过程信息; 开始 零内存(@SI,SizeOf(SI)); SI.cb:=SizeOf(SI); CreateProcess(PChar(NotepadPath)、nil、nil、nil、false、CREATE\u NEW\u PROCESS

我有一个代码,可以帮助我作为管理员运行外部程序。如果运行我的程序的用户是管理员,那么它工作得很顺利

程序RunApp;
常数
记事本路径='C:\windows\system32\notepad.exe';
变量
SI:TStartupInfo;
PI:t过程信息;
开始
零内存(@SI,SizeOf(SI));
SI.cb:=SizeOf(SI);
CreateProcess(PChar(NotepadPath)、nil、nil、nil、false、CREATE\u NEW\u PROCESS\u GROUP或NORMAL\u PRIORITY\u CLASS、nil、nil、SI、PI);
结束;
开始
主机:=ParamStr(0);
FillChar(SEI,SizeOf(SEI),0);
SEI.cbSize:=SizeOf(SEI);
SEI.fMask:=见屏蔽过程;
{$IFDEF UNICODE}
SEI.fMask:=SEI.fMask或SEE\u MASK\u UNICODE;
{$ENDIF}
SEI.Wnd:=0;
SEI.lpVerb:='runas';
SEI.lpFile:=PChar(主机);
SEI.nShow:=SW_正常;
如果是IsUserAnAdmin,则开始
RunApp;
出口
结束;
如果不是ShellExecuteEx(@SEI),则开始
SetEnvironmentVariable(“兼容层”、“RUNASINVOKER”);
RunApp;
结束;
结束。
但是,当我以标准用户身份运行我的程序时,UAC将提示,在UAC中输入管理员密码后,外部程序将自动在我的管理员用户桌面上运行,而不是在我当前的标准用户帐户桌面上运行

情况:两个帐户都登录到我的电脑,User1(管理员)和User2(非管理员)。 在User2中,我运行delphi程序,UAC提示输入外部应用程序(预期行为),我决定作为外部应用程序的管理员运行,因此我输入了管理员密码

发生了什么?:我的外部应用程序窗口在User1桌面而不是User2桌面中打开。
这种行为正确吗?如果没有,可能是什么原因造成的?

@EllynLyn您已经知道是什么原因造成的。您试图解决的实际问题是什么?你只是在陈述事实,而不是问题。您不能在UAC提升下运行外部进程,并期望它仍然处于相同的用户上下文中。这违背了提升的全部目的。@EllynLyn“如果UAC提示,那么程序将不会在当前标准用户上运行?”-这是正确的。“如果从每个帐户注销,并且只登录到标准用户,则它工作正常?”-否。它将作为登录到UAC提示符的管理员用户运行。这是故意的。所以我再次问,你想要解决的实际问题是什么?可能是您正在寻找的。@EllynLyn外部应用程序将在标准用户的桌面上运行,是的。但它不会作为标准用户运行,而是作为管理员用户运行。这是正常的行为。无论用户帐户如何,
CreateProcess()
将在与调用进程相同的工作站和桌面上运行新进程,除非在
STARTUPINFO::lpDesktop
字段中另有要求。@EllynLyn您的意思是,当您使用“user2”(在user2会话/桌面内)启动/提升进程时提升/启动的程序不会显示在user2桌面上,而是显示在已登录user1的桌面/会话中?有趣的是,其他人刚刚发布了一个具有完全相同症状的类似问题:@EllynLyn您已经知道它的原因了。您试图解决的实际问题是什么?你只是在陈述事实,而不是问题。您不能在UAC提升下运行外部进程,并期望它仍然处于相同的用户上下文中。这违背了提升的全部目的。@EllynLyn“如果UAC提示,那么程序将不会在当前标准用户上运行?”-这是正确的。“如果从每个帐户注销,并且只登录到标准用户,则它工作正常?”-否。它将作为登录到UAC提示符的管理员用户运行。这是故意的。所以我再次问,你想要解决的实际问题是什么?可能是您正在寻找的。@EllynLyn外部应用程序将在标准用户的桌面上运行,是的。但它不会作为标准用户运行,而是作为管理员用户运行。这是正常的行为。无论用户帐户如何,
CreateProcess()
将在与调用进程相同的工作站和桌面上运行新进程,除非在
STARTUPINFO::lpDesktop
字段中另有要求。@EllynLyn您的意思是,当您使用“user2”(在user2会话/桌面内)启动/提升进程时提升/启动的程序不会显示在user2桌面上,而是显示在已登录user1的桌面/会话中?有趣的是,其他人刚刚发布了一个具有完全相同症状的类似问题: