簡體   English   中英

在C#中以管理員身份添加網絡驅動器:注銷后消失

[英]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 在這種情況下, IsElevatedCallercan )返回false(它首先嘗試打開線程令牌(僅在不存在時-處理令牌))並查詢TokenElevationType打開令牌(如果TokenElevationTypeFull返回true)

因此,這當然沒有記錄在案,但是如果您假冒不帶提升令牌的自我線程(如何獲得獨立問題),那么當前(測試)標記CONNECT_UPDATE_PROFILE將可以很好地工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM