无法作为非管理员模拟用户运行 - 访问被拒绝

时间:2010-09-21 19:17:51

标签: c# impersonation non-admin

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

访问被拒绝。

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

我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

回到这一段时间。

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

答案 1 :(得分: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();
}

使用本地Administrator帐户登录Windows时,这绝对可以实现。

但是,如果我创建了一个属于Administrators组成员的“ Test_User”帐户,则表示从Process.Start()获取了“拒绝访问”或0xc0000142异常。

Allow service to interact with desktop

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

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

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