使用来自"以管理员身份运行的WNetAddConnection2映射网络驱动器"过程不起作用

时间:2017-03-13 11:30:54

标签: c# winapi runas mapped-drive

我有一个应用程序调用{​​{1}}来映射网络驱动器。这非常有效,除非我以管理员身份运行应用程序(右键单击 - 以管理员身份运行),在这种情况下,函数返回0(成功),但映射的驱动器不会出现。

这里似乎发生的事情是有两个上下文,我的程序正在运行的Admin一个以及运行Windows资源管理器的用户,我正在寻找映射的驱动器。我认为驱动器映射在"管理上下文" 中取代,但在"用户上下文" 中不可见。

当我以管理员身份运行时WNetAddConnection2包含我尝试映射的驱动器号,让我认为映射在"管理上下文" 中成功

道歉,如果我在多个情境中完全错误的想法,但这似乎是我所看到的最佳解释。

这个问题有两个可能的答案:

1)如何映射驱动器以使其在所有上下文中都可见?

2)如何从"以管理员身份运行"执行某些操作(进程/线程/ API调用)没有管理员权限的流程(即在" User Context" 中)?

1 个答案:

答案 0 :(得分:1)

1)驱动器仅在登录会话中可见, LUID 与您的令牌TOKEN_STATISTICS.AuthenticationId相同

将在 \Sessions\0\DosDevices\<LogonId>\<X>: 下创建符号链接对象 \Device\LanmamRedirector\;<X>:<LogonId>\server\share ,因为结果驱动器<X>:仅对运行的进程可见在 <LogonId> 会话中。和进程运行&#34;作为管理员&#34;有不同的 <LogonId> 比较流程不会运行&#34;作为管理员&#34;

2)在调用NetUseAddWNetAddConnection2之前,您需要模拟其他上下文。

例如,您可以枚举进程,找到具有相同终端SessionId的资源管理器(不与登录会话混淆)并模拟它(打开令牌,重复和模拟)。或者更通用地打开与您的流程相同的终端会话中的每个流程令牌,查询令牌TokenElevationTypeTOKEN_ELEVATION_TYPE)以及它是否TokenElevationTypeLimited - 在调用{{1}之前复制并模拟此令牌}}

  

如何从&#34;运行执行某些操作(进程/线程/ API调用)   作为管理员&#34;没有管理员权限的流程(即在&#34;用户中)   上下文&#34;?)

工作代码示例:

NetUseAdd