该程序在管理员下运行。从程序本身,我想启动另一个进程,但没有管理员权限,即 作为普通用户:
Process process = new Process();
process.StartInfo.FileName = @"C:\Program Files\MyApp\MyConfig.exe";
process.Start();
process.WaitForExit();
在我指定的子进程的清单中
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
我检查表单是否在管理员权限下运行:它以与父进程相同的权限开始。我的错误在哪里?
清单中的指示
asInvoker并不要求您做任何事情,因为根据官方 M$ 文档(并且只是逻辑),应用程序将以与调用它的进程相同的特权级别执行。手头的任务可以通过多种方式解决。一种可能的解决方案可以以调用链的形式表示
GetShellWindow->GetWindowThreadProcessId->OpenProcessToken->DuplicateTokenEx->CreateProcessWithToken(简而言之 - 我们只是转储令牌),如下所示(膝盖上的选项):来自管理控制台的调用应该以普通用户身份启动控制台。
使用 nuget SimpleImpersonation
关于代表“用户”组运行的愿望,在我看来这是不可能的,因为这不是真正的用户,而只是默认访问权限级别的一些设置。或一组用户,但不是真正的用户。如我错了请纠正我。
要代表其他用户运行进程,首先需要以他的名义登录系统,获取该用户的SID和token。为此,有一个
LogonUser()返回令牌的函数。您现在可以在调用CreateProcessAsUser()以以其他用户身份运行进程时使用它。这是runas实用程序遵循的算法。有关详细信息,请参阅MSDN。