我遇到了问题,我一直在寻找两件必须合作的事情,以管理员身份运行Createprocess()
并获得输出。
当我谷歌如何CreateProcess()
作为管理员时,我会让人们回复使用shellexecute
。我去shellexecute
,当我在那里时,shellexecute不会输出在控制台(进程)上运行的内容。
我再次谷歌如何获取带有shellexecute的进程的输出,我得到答案,说你不能用shellexecute做这个,使用createprocess,所以我去创建进程。我正在努力将我正在使用shellexecute转换为createprocess。
我正在使用shellexecute做我正在寻找的,以管理员身份运行。但没有输出。
这是我的shellexecute代码。
SHELLEXECUTEINFO si = {0};
si.cbSize = sizeof(SHELLEXECUTEINFO);
si.fMask = SEE_MASK_NOCLOSEPROCESS;
si.hwnd =NULL;
si.lpVerb = "runas";
si.lpFile = "netsh.exe";
si.lpParameters = "advfirewall firewall add rule name=\"dummy_rule\" action=allow protocol=TCP dir=in localport=3300";
si.lpDirectory=NULL;
si.nShow=SW_SHOW;
si.hInstApp =NULL;
ShellExecuteEx(&si);
WaitForSingleObject(si.hProcess, INFINITE);
CloseHandle(si.hProcess);
此代码在一种方法中运行,它的作用是添加一个防火墙规则来打开一个端口以进行连接。它工作正常,问题是我不知道这个过程是否成功,而不是shellexecute。所以我需要输出。
答案 0 :(得分:2)
尝试使用本文中的CreateProcessElevated()
函数:
Vista UAC: The Definitive Guide
它具有与CreateProcess()
相同的功能,但提供runas
ShellExecute()
功能,即提示用户输入UAC提升凭据。
答案 1 :(得分:1)
您的代码实际上是创建了两个进程runas.exe
和netsh.exe
,它只能创建一个进程。正确的做法是:
LogonUser()
个函数来获取管理令牌。CreateProcessAsUser()
上述令牌。请注意,对于CreateProcessAsUser()
,您应指定netsh.exe
作为您要执行的流程,并将您的参数指定为LPTSTR lpCommandLine
。