1

我在以管理员用户身份运行的应用程序中模拟非管理员用户帐户(使用和LogonUser()函数)。由于此用户帐户是临时的,我还需要加载用户配置文件(使用本机功能)。所有方法都成功执行(没有设置最后一个错误),并且当前身份是预期的模拟非管理员用户。但是,当我尝试使用 运行新进程时,出现错误:DuplicateToken()WindowsIdentity.Impersonate()LoadUserProfile()System.Diagnostics.Process.Start()

访问被拒绝。

当我尝试使用 runas /profile /user:mynonadmin 用户手动执行相同的场景时,一切正常。

我在这里想念什么?

4

2 回答 2

0

不久前遇到了这个问题。

模拟用户无权访问在 Process 对象上设置的 CWD。创建一个 ProcessStartInfo 对象并将工作目录设置为模拟用户可以访问的位置。

于 2015-03-24T18:47:40.577 回答
0

我在一个服务项目中遇到了非常相似的情况。这是一些过于简化的伪代码,可以让您了解我在做什么:

uint ConsoleSessionID = WTSGetActiveConsoleSessionId()
WTSQueryUserToken(ConsoleSessionID, out hToken)
IsUserInAdminGroup(hToken)
DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, ref sa, SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation, TOKEN_TYPE.TokenPrimary, out IntPtr DuplicateToken)
WindowsIdentity.RunImpersonated(new SafeAccessTokenHandle(DuplicateToken), () =>
{
    Process p = new Process();
    p.StartInfo.FileName = ...
    p.StartInfo.Arguments = ...
    p.WorkingDirectory = ...
    p.StartInfo.UseShellExecute = true;
    p.StartInfo.Verb = "runas"; // Elevated!
    p.Start();
}

使用本地管理员帐户登录 Windows 时,这绝对正常。

但是,如果我创建了一个属于管理员组成员的“Test_User”帐户,我会收到来自 Process.Start() 的 ACCESS DENIED 或 0xc0000142 异常。

允许服务与桌面交互

在选中“允许服务与桌面交互”之后,现在无论我使用实际的本地管理员帐户还是本地管理员组成员的任何其他帐户,我的服务现在都可以在登录的上下文中启动提升的应用程序 -在用户上。

当然,我回去更新了安装服务的代码,以确保设置了 SERVICE_INTERACTIVE_PROCESS 标志,所以这个选项是通过编程设置的。

希望这可以帮助某人...

于 2019-04-25T04:40:31.243 回答