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

问题描述 投票:1回答:2

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

访问被拒绝。

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

我在这里错过了什么?

c# impersonation non-admin
2个回答
0
投票

一会儿就跑进去了。

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


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

Allow service to interact with desktop

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

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

希望这有助于某人......

© www.soinside.com 2019 - 2024. All rights reserved.