国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C#訪問遠(yuǎn)程主機(jī)資源的方法

2019-11-17 02:23:46
字體:
供稿:網(wǎng)友
C#訪問遠(yuǎn)程主機(jī)資源的方法

實(shí)現(xiàn)訪問遠(yuǎn)程主機(jī)的共享目錄中的一個(gè)文件的解決方法:一、調(diào)用Net use命令 // 使用方法: //if (Connect("192.168.1.48", "用戶名", "密碼")) //{ // File.Copy(@"http://192.168.1.48/共享目錄/test.txt", @"e://test.txt", true); //} public bool Connect(string remoteHost, string userName, string passWord) { bool Flag = true; PRocess proc = new Process(); proc.StartInfo.FileName = "cmd.exe"; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardInput = true; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.CreateNoWindow = true; try { proc.Start(); string command =@"net use //" + remoteHost + " " + passWord + " " + " /user:" + userName + ">NUL"; proc.StandardInput.WriteLine(command); command = "exit"; proc.StandardInput.WriteLine(command); while (proc.HasExited == false) { proc.WaitForExit(1000); } string errormsg = proc.StandardError.ReadToEnd(); if (errormsg != "") Flag = false; proc.StandardError.Close(); } catch (Exception ex) { Flag = false; } finally { proc.Close(); proc.Dispose(); } return Flag; }二、調(diào)用WNetAddConnection2、WNetAddConnection3或者NetUseAdd函數(shù),進(jìn)行磁盤映射。using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;

namespace Windowsapplication1{ public class MyMap { [DllImport("mpr.dll", EntryPoint = "WNetAddConnection2")] public static extern uint WNetAddConnection2( [In] NETRESOURCE lpNetResource, string lpPassword, string lpUsername, uint dwFlags); [DllImport("Mpr.dll")] public static extern uint WNetCancelConnection2( string lpName, uint dwFlags, bool fForce); [StructLayout(LayoutKind.Sequential)] public class NETRESOURCE { public int dwScope; public int dwType; public int dwDisplayType; public int dwUsage; public string LocalName; public string RemoteName; public string Comment; public string Provider; }

// remoteNetworkPath format: @"http://192.168.1.48/sharefolder" // localDriveName format: @"E:" public static bool CreateMap(string userName, string password, string remoteNetworkPath, string localDriveName) { NETRESOURCE myNetResource = new NETRESOURCE(); myNetResource.dwScope = 2; //2:RESOURCE_GLOBALNET myNetResource.dwType = 1; //1:RESOURCETYPE_ANY myNetResource.dwDisplayType = 3; //3:RESOURCEDISPLAYTYPE_GENERIC myNetResource.dwUsage = 1; //1: RESOURCEUSAGE_CONNECTABLE myNetResource.LocalName = localDriveName; myNetResource.RemoteName = remoteNetworkPath; myNetResource.Provider = null;

uint nret = WNetAddConnection2(myNetResource, password, userName, 0);

if (nret == 0) return true; else return false; }

// localDriveName format: @"E:" public static bool DeleteMap(string localDriveName) { uint nret = WNetCancelConnection2(localDriveName, 1, true);

if (nret == 0) return true; else return false; }

public void test() {// 注意: // remote、local、username的格式一定要正確,否則可能出現(xiàn)錯(cuò)誤 string remote =@"http://192.168.1.48/generals"; string local =@"P:"; string username =@"Domain/UserName"; string password =@"Password"; bool ret = MyMap.CreateMap(username, password, remote, local); if (ret) { //do what you want:// ... //File.Copy("q://test.htm", "c://test.htm");

MyMap.DeleteMap(local); } } }}三、使用WebClient類由于WebClient類可以上傳下載文件,并且支持以http:、https:和file:開頭的URI,所以可以用WebClient類來傳輸文件。添加System.Net命名空間后使用如下代碼下載文件:

private void Test1() { try { WebClient client = new WebClient(); NetworkCredential cred = new NetworkCredential("username", "password", "172.16.0.222"); client.Credentials = cred; client.DownloadFile("file://172.16.0.222/test/111.txt", "111.txt"); } catch (Exception ex) {//如果網(wǎng)絡(luò)很慢,而文件又很大,這時(shí)可能有超時(shí)異常(Timeout)。 } }

public void Test2() { try { WebClient client = new WebClient(); NetworkCredential cred = new NetworkCredential("username", "password", "domain"); client.Credentials = cred; client.DownloadFile("file://172.16.0.222/test/111.txt", "111.txt"); } catch (Exception ex) { //如果網(wǎng)絡(luò)很慢,而文件又很大,這時(shí)可能有超時(shí)異常(Timeout)。 } }

類似的還可以試試WebRequest、FileWebRequest等: WebRequest req = WebRequest.Create("file://138.12.12.14/generals/test.htm"); NetworkCredential cred = new NetworkCredential("username", "password", "

namespace Test{ public class Test { // logon types const int LOGON32_LOGON_INTERACTIVE = 2; const int LOGON32_LOGON_NETWORK = 3; const int LOGON32_LOGON_NEW_CREDENTIALS = 9; // logon providers const int LOGON32_PROVIDER_DEFAULT = 0; const int LOGON32_PROVIDER_WINNT50 = 3; const int LOGON32_PROVIDER_WINNT40 = 2; const int LOGON32_PROVIDER_WINNT35 = 1;

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern int LogonUser(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool RevertToSelf();

[DllImport("kernel32.dll", CharSet = CharSet.Auto)] public static extern bool CloseHandle(IntPtr handle);

private WindowsImpersonationContext impersonationContext;

public bool impersonateValidUser(String userName, String domain, String password) { WindowsIdentity tempWindowsIdentity; IntPtr token = IntPtr.Zero; IntPtr tokenDuplicate = IntPtr.Zero;

if (RevertToSelf()) {// 這里使用LOGON32_LOGON_NEW_CREDENTIALS來訪問遠(yuǎn)程資源。// 如果要(通過模擬用戶獲得權(quán)限)實(shí)現(xiàn)服務(wù)器程序,訪問本地授權(quán)數(shù)據(jù)庫(kù)可// 以用LOGON32_LOGON_INTERACTIVE if (LogonUser(userName, domain, password,LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref token) != 0) { if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) { tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); impersonationContext = tempWindowsIdentity.Impersonate(); if (impersonationContext != null) { System.AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); IPrincipal pr = System.Threading.Thread.CurrentPrincipal; IIdentity id = pr.Identity; CloseHandle(token); CloseHandle(tokenDuplicate); return true; } } } }

if (token != IntPtr.Zero) CloseHandle(token);

if (tokenDuplicate != IntPtr.Zero) CloseHandle(tokenDuplicate);

return false; }

public void undoImpersonation() { impersonationContext.Undo(); }

public void TestFunc() { bool isImpersonated = false; try { if (impersonateValidUser("UserName", "Domain", "Password")) { isImpersonated = true; //do what you want now, as the special user // ... File.Copy(@"http://192.168.1.48/generals/now.htm", "c://now.htm", true); } } finally { if (isImpersonated) undoImpersonation(); } } }}五、比較方法一通過調(diào)用Shell命令Net Use實(shí)現(xiàn),有點(diǎn)笨拙。方法二和方法一有些相似之處。映射遠(yuǎn)程資源,然后訪問。方法三由于會(huì)有超時(shí)異常出現(xiàn),所以在網(wǎng)絡(luò)速度快、傳輸小文件時(shí)是可以的。方法四通過身份模擬實(shí)現(xiàn)遠(yuǎn)程資源訪問。一些服務(wù)器進(jìn)程就是通過這種方式運(yùn)行的。這種方法也是我的最愛。六、要注意的地方關(guān)于這幾種方法,google后都可以找到一些文章。但是等到自己實(shí)際測(cè)試時(shí),有時(shí)會(huì)出現(xiàn)各種小錯(cuò)誤,這些錯(cuò)誤基本來源于兩方面:1、函數(shù)的參數(shù)選擇有問題,和自己的環(huán)境不相符。比如public static extern int LogonUser(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);中的dwLogonType,要訪問遠(yuǎn)程資源就要用LOGON32_LOGON_NEW_CREDENTIALS,要模擬本機(jī)用戶就要用LOGON32_LOGON_INTERACTIVE。2、函數(shù)的參數(shù)格式有問題。a、比如public static extern int LogonUser(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);中的lpszUserName、lpszDomain、lpszPassword就要寫清楚。我就在這遇到過問題,第一次測(cè)試時(shí),遠(yuǎn)程服務(wù)器就是一臺(tái)獨(dú)立的文件服務(wù)器,這是我的調(diào)用方式:LogonUser("myname", "192.168.1.48", "password", LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 怀来县| 齐齐哈尔市| 精河县| 高阳县| 张掖市| 莱阳市| 怀柔区| 泰和县| 天气| 依安县| 济宁市| 确山县| 岑巩县| 兴和县| 新昌县| 明水县| 建德市| 朝阳区| 彰化市| 黎平县| 东城区| 诸暨市| 资中县| 阿尔山市| 岳阳市| 井研县| 清远市| 嘉峪关市| 新干县| 吉隆县| 军事| 陈巴尔虎旗| 河津市| 新民市| 定陶县| 浦江县| 桐柏县| 门源| 东明县| 泰和县| 永嘉县|