[英]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.