我有一个应用程序调用{{1}}来映射网络驱动器。这非常有效,除非我以管理员身份运行应用程序(右键单击 - 以管理员身份运行),在这种情况下,函数返回0(成功),但映射的驱动器不会出现。
这里似乎发生的事情是有两个上下文,我的程序正在运行的Admin一个以及运行Windows资源管理器的用户,我正在寻找映射的驱动器。我认为驱动器映射在"管理上下文" 中取代,但在"用户上下文" 中不可见。
当我以管理员身份运行时WNetAddConnection2
包含我尝试映射的驱动器号,让我认为映射在"管理上下文" 中成功
道歉,如果我在多个情境中完全错误的想法,但这似乎是我所看到的最佳解释。
这个问题有两个可能的答案:
1)如何映射驱动器以使其在所有上下文中都可见?
2)如何从"以管理员身份运行"执行某些操作(进程/线程/ API调用)没有管理员权限的流程(即在" User Context" 中)?
答案 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)在调用NetUseAdd
或WNetAddConnection2
之前,您需要模拟其他上下文。
例如,您可以枚举进程,找到具有相同终端SessionId
的资源管理器(不与登录会话混淆)并模拟它(打开令牌,重复和模拟)。或者更通用地打开与您的流程相同的终端会话中的每个流程令牌,查询令牌TokenElevationType
(TOKEN_ELEVATION_TYPE
)以及它是否TokenElevationTypeLimited
- 在调用{{1}之前复制并模拟此令牌}}
如何从&#34;运行执行某些操作(进程/线程/ API调用) 作为管理员&#34;没有管理员权限的流程(即在&#34;用户中) 上下文&#34;?)
工作代码示例:
NetUseAdd