[英]Adding network drives in C# as admin: disappear after logoff
好的,首先:我的任务是,以管理员身份运行的C#程序以编程方式映射网络驱动器。
我设法以普通的管理员用户身份将驱动器映射为没有提升的特权,并且注销/重新引导后仍然可见(即使它没有重新连接,但这是另一回事)。 我使用WNetAddConnection2
WinApi函数以及cmd中的net use
命令执行此操作,只是为了进行检查。
可悲的是,两者都没有使用提升的特权。 在这种情况下,将按原样添加驱动器,但是在重新启动后,驱动器将完全消失。
甚至可以通过提升的特权来实现这一目标,或者有一些我不知道的Windows帐户不可思议的功能可以防止这种情况发生?
这是我使用的代码,设置通常应该使驱动器被记住并重新连接的所有标志:
uint flags = (uint)(Flags.CONNECT_CMD_SAVECRED |
Flags.CONNECT_INTERACTIVE |
Flags.CONNECT_COMMANDLINE |
Flags.CONNECT_UPDATE_PROFILE);
NETRESOURCE NetworkResource = new NETRESOURCE();
oNetworkResource.dwType = ResourceType.RESOURCETYPE_DISK;
oNetworkResource.lpLocalName = Console.ReadLine() + ":";
oNetworkResource.lpRemoteName = @"\\[Server]\foo";
oNetworkResource.lpProvider = null;
Console.WriteLine(WNetAddConnection2(NetworkResource, "[Password]", @"[Domain]\[Username]", flags));
注销/重启后仍然可见
这是因为,当使用CONNECT_UPDATE_PROFILE
标志时-称为导出的但未记录的函数I_MprSaveConn
(来自mpr.dll
),该函数保存在注册表中,并在HKEY_CURRENT_USER\\Network\\<lpLocalName>
信息下传递给WNetAddConnection2
。 但I_MprSaveConn
在非常开始通话功能bool IsElevatedCaller(PLUID )
如果函数返回true
-它只是退出,而不在注册表中保存。 所以您绝对正确-当您从提升的进程中调用WNetAddConnection2
时( 没有模拟 )-该连接不会持久(信息未保存在注册表中)
解决方案:您不需要提升令牌(例如来自explorer
)-打开/复制(对于TokenImpersonation
类型)并调用SetThreadToken
。 在这种情况下, IsElevatedCaller
( can )返回false(它首先尝试打开线程令牌(仅在不存在时-处理令牌))并查询TokenElevationType
打开令牌(如果TokenElevationTypeFull
返回true)
因此,这当然没有记录在案,但是如果您假冒不带提升令牌的自我线程(如何获得独立问题),那么当前(测试)标记CONNECT_UPDATE_PROFILE
将可以很好地工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.