无法以非管理员模拟用户身份运行 - 访问被拒绝
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:无法在计算机“。”上启动服务拒绝访问(以管理员身份运行)