c 使用特定帳號密碼訪問Windows網路共享

2021-10-22 17:01:36 字數 3426 閱讀 8468

透過程式訪問windows網路分享的檔案也算常見需求,但訪問身分是個問題。之前我慣用的技巧是用有許可權的ad網域帳號執行排程訪問網路分享,但這招要搬進**或遇到不同網路分享用不同帳號便會破功。最近遇上類似議題,直覺要得回頭靠winapi impersonation解決,之前曾寫過通用元件,擔心11年前windows vista/7時代的作品有點過時,就爬文找找更好的做法。

之前的變身做法是改變thread的執行身分,然而針對網路分享還有另乙個winapi - wnetaddconnection2,可做到對多個網路分享使用不同登入身分。在stackoverflow找到有人分享把它包成搭配using使用的context物件,符合我慣用的風格,二話不說,按讚並寫文分享。

為方便使用,我再做了一層包裝,寫了乙個networkcopier,將查目錄或複製檔案動作簡化成copy(srcnetpath, targetpath, domain, userid, passwd)、dirfiles(srcnetpath, domain, userid, passwd),並支援預設帳密可省略輸入domain, userid, passwd;另外還有getconnetioncontext(path, domain, userid, passwd) 可取回networkconnection 物件方便用同一連線身分進行多項操作,若**與目的屬不同網路分享則可套疊多重身分,寫成:

using system;

using system.collections.generic;

using system.componentmodel;

using system.io;

using system.linq;

using system.net;

using system.runtime.interopservices;

using system.text.regularexpressions;

using system.web;

public static getconnectioncontext(string path, string domain = null, string userid = null, string passwd = null)

}//引用來源:

public class networkconnection : idisposable

;var username = string.isnullorempty(credentials.domain)

? credentials.username

: string.format(@"", credentials.domain, credentials.username);

var result = wnetaddconnection2(

netresource,

credentials.password,

username,

0);if (result != 0)

}~networkconnection()

public void dispose()

protected virtual void dispose(bool disposing)

[dllimport(「mpr.dll」)]

private static extern int wnetaddconnection2(netresource netresource, string password, string username, int flags);

[dllimport(「mpr.dll」)]

private static extern int wnetcancelconnection2(string name, int flags, bool force);

}[structlayout(layoutkind.sequential)]

public class netresource

public enum resourcescope : int

;public enum resourcetype : int

public enum resourcedisplaytype : int

}using system;

using system.collections.generic;

using system.componentmodel;

using system.io;

using system.linq;

using system.net;

using system.runtime.interopservices;

using system.text.regularexpressions;

using system.web;

public static getconnectioncontext(string path, string domain = null, string userid = null, string passwd = null)

}//引用來源:

public class networkconnection : idisposable

;var username = string.isnullorempty(credentials.domain)

? credentials.username

: string.format(@"", credentials.domain, credentials.username);

var result = wnetaddconnection2(

netresource,

credentials.password,

username,

0);if (result != 0)

}~networkconnection()

public void dispose()

protected virtual void dispose(bool disposing)

[dllimport(「mpr.dll」)]

private static extern int wnetaddconnection2(netresource netresource, string password, string username, int flags);

[dllimport(「mpr.dll」)]

private static extern int wnetcancelconnection2(string name, int flags, bool force);

}[structlayout(layoutkind.sequential)]

public class netresource

public enum resourcescope : int

;public enum resourcetype : int

public enum resourcedisplaytype : int

}以上就是c# 使用特定帳號密碼訪問windows網路共享的詳細內容

帳號密碼登入

帳號標識使用者在平台唯一身份的標誌,可以代表使用者在平台的身份 登入密碼使用者使用帳號登入時使用的帳號憑證。注意 帳號密碼一般針對帳號,而不是登入帳號 打個比方 帳號是用來表示乙個小區裡哪個房子是你家的 登入帳號是你家房子幾個不同的密碼鎖門 登入密碼是密碼鎖門的密碼 帳號型別 型別說明 優點不足 自...

修改帳號密碼驗證

通過資料庫查詢查詢出對應資料id 通過a標籤的get方法傳值到修改頁面 修改頁面通過get接收到id 連線資料庫查詢對應資料 id唯一所以輸出一維陣列 然後獲取修改後的資料 獲取後進行判斷 是否修改使用者名稱 如果未修改使用者名稱 直接執行修改密碼操作 其中修改成功 跳轉回使用者介面 修改失敗給個提...

Eclipse SVN外掛程式的帳號 密碼修改

問題描述 eclipse的svn外掛程式subclipse做得很好,在svn操作方面提供了很強大豐富的功能。但到目前為止,該外掛程式對svn使用者的概念極為淡薄,不但不能方便地切換使用者,而且一旦使用者的帳號 密碼儲存之後,就無法再變更了。解決思路 既然介面上不能進行修改,那就只有刪除subclip...