无法以非管理员模拟用户身份运行 - 访问被拒绝

Posted

技术标签:

【中文标题】无法以非管理员模拟用户身份运行 - 访问被拒绝【英文标题】:Cannot run as a non-admin impersonated user - access is denied 【发布时间】:2010-09-21 19:17:51 【问题描述】:

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

访问被拒绝。

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

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

不久前遇到了这个问题。

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

【讨论】:

【参考方案2】:

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

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 异常。

Allow service to interact with desktop

选中“允许服务与桌面交互”后,现在无论我使用的是实际的本地管理员帐户,还是本地管理员组成员的任何其他帐户,我的服务现在都可以在登录用户。

当然,我返回并更新了安装服务的代码,以确保设置了 SERVICE_INTERACTIVE_PROCESS 标志,因此以编程方式设置了此选项。

希望这对某人有所帮助...

【讨论】:

以上是关于无法以非管理员模拟用户身份运行 - 访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

Windows,启动服务 System.InvalidOperationException:无法在计算机“。”上启动服务拒绝访问(以管理员身份运行)

即使具有管理员权限,批处理脚本访问也被拒绝

在远程计算机上模拟用户时 WMI 的访问被拒绝

为啥有些文件拒绝访问

无法启动 IIS Express Web 服务器,无法注册 URL,访问被拒绝

即使以管理员身份运行,在 Windows 错误 5(拒绝访问)上运行 Spark