2016-12-05 46 views
0

首先,我的任务是以编程方式从C#程序映射网络驱动器,该管理员以管理员的身份运行在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)); 
+0

大多数驱动器映射为用户使用类似网络j:\ blah是记住,你的应用程序不会是.. – BugFinder

+0

我真的不明白你的意思。这听起来像是你说应用程序添加的网络驱动器永远不会被记住,但这是错误的,所以我想我没有完全理解你。 – Snowfire

+0

我相信默认情况下,应用程序映射的驱动器不是持久的..因为你没有显示任何代码,我不能告诉你是否试图使它们如此 – BugFinder

回答

1

但仍可见注销/重启

此之后是因为,当CONNECT_UPDATE_PROFILE标志使用 - 称为导出,但未记录的功能I_MprSaveConn(从mpr.dll)保存在注册表中,在HKEY_CURRENT_USER\Network\<lpLocalName>信息,你传递给WNetAddConnection2。但I_MprSaveConn在非常开始呼叫功能bool IsElevatedCaller(PLUID),如果函数返回true - 它只是退出,而不保存在注册表中。所以你绝对正确的 - 当您从提升的进程调用WNetAddConnection2不带模拟) - 这方面不能持续(不保存在注册表中的信息)

解决方案:你需要的不是那些提升令牌(比如从explorer) - 开/重复(TokenImpersonation类型)并致电SetThreadToken。在这种情况下IsElevatedCaller可以)返回false(它第一次尝试打开线程标记(仅当不存在的话 - 进程令牌))和查询开通令牌的TokenElevationType(并返回true,如果TokenElevationTypeFull

所以这当然没有记录,但目前(我测试),如果你冒充自我线程与不升高的标记(你如何得到它单独的问题)标志CONNECT_UPDATE_PROFILE将工作得很好

+1

您可能还需要配置[EnableLinkedConnections设置](https://technet.microsoft.com/en-us/library/ee844140(v = ws.10).aspx),以便记住驱动器映射对高架过程可见。请注意,商业软件不适合在最终用户计算机上配置此设置,但可能适用于内部设置。 –