91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#訪問遠程主機資源的方法有哪些

發布時間:2021-03-10 10:21:42 來源:億速云 閱讀:272 作者:小新 欄目:編程語言

這篇文章主要介紹了C#訪問遠程主機資源的方法有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。


一、調用Net use命令

 // 使用方法:
        //if (Connect("192.168.1.48", "用戶名", "密碼"))   
        //{
        //    File.Copy(@"\\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;
        }

二、調用WNetAddConnection2、WNetAddConnection3或者NetUseAdd函數,進行磁盤映射。

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:  @"\\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的格式一定要正確,否則可能出現錯誤            string remote = @"\\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)            {                // 如果網絡很慢,而文件又很大,這時可能有超時異常(Time out)。            }        }
        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)            {                // 如果網絡很慢,而文件又很大,這時可能有超時異常(Time out)。            }        }

類似的還可以試試WebRequest、FileWebRequest等:

 WebRequest req = WebRequest.Create("file://138.12.12.14/generals/test.htm");
                NetworkCredential cred = new NetworkCredential("username", "password", "IP");
                req.Credentials = cred;
                WebResponse response = req.GetResponse();
                Stream strm = response.GetResponseStream();
                StreamReader r = new StreamReader(strm);
                ... ...

四、角色模擬

/// <summary>
    /// 身份模擬實現遠程資源訪問
    /// </summary>
    public class FileImpersonation
    {
        // 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;
        /// <summary>
        /// 身份模擬
        /// </summary>
        /// <param name="userName">獨立服務器用IP,域環境就用域名</param>
        /// <param name="domain"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        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來訪問遠程資源。
                // 如果要(通過模擬用戶獲得權限)實現服務器程序,訪問本地授權數據庫可
                // 以用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)
                        {
                            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;
        }
        /// <summary>
        /// 取消模擬身份
        /// </summary>
        public void undoImpersonation()
        {
            impersonationContext.Undo();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="domain">獨立服務器用IP,域環境就用域名</param>
        /// <param name="username"></param>
        /// <param name="password"></param>
        /// <param name="act">需要執行的操作</param>
        public void ImpersonateFunc(string username, string domain, string password, Action act)
        {
            bool isImpersonated = false;
            try
            {
                if (impersonateValidUser(username, domain, password))
                {
                    isImpersonated = true;
                    //File.Copy(@"\\192.168.1.48\generals\now.htm", "c:\\now.htm", true);
                    act();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                if (isImpersonated)
                    undoImpersonation();
            }
        }
        //
    }
 FileImpersonation imp = new FileImpersonation();
            imp.ImpersonateFunc("Administrator", "192.168.0.125", "xxxx", () =>
            {
                var source = new DirectoryInfo(@"D:\HR");
                string targetFolder = @"\\192.168.0.125\d$\HR";
                if (!Directory.Exists(targetFolder))
                {
                    Directory.CreateDirectory(targetFolder);
                }
                foreach (FileInfo item in source.GetFiles())
                {
                    string targertFile = Path.Combine(targetFolder, item.Name);
                    File.Copy(item.FullName, targertFile, true);
                }
            });

五、比較

方法一通過調用Shell命令Net Use實現,有點笨拙。
方法二和方法一有些相似之處。映射遠程資源,然后訪問。
方法三由于會有超時異常出現,所以在網絡速度快、傳輸小文件時是可以的。
方法四通過身份模擬實現遠程資源訪問。一些服務器進程就是通過這種方式運行的。這種方法也是我的最愛。

六、要注意的地方

關于這幾種方法,google后都可以找到一些文章。但是等到自己實際測試時,有時會出現各種小錯誤,
這些錯誤基本來源于兩方面:

1、函數的參數選擇有問題,和自己的環境不相符。
比如        

public static extern int LogonUser(String lpszUserName,
            String lpszDomain,
            String lpszPassword,
            int dwLogonType,
            int dwLogonProvider,
            ref IntPtr phToken);

中的dwLogonType,要訪問遠程資源就要用LOGON32_LOGON_NEW_CREDENTIALS,
要模擬本機用戶就要用LOGON32_LOGON_INTERACTIVE。

2、函數的參數格式有問題。
   a、比如

 public static extern int LogonUser(String lpszUserName,
            String lpszDomain,
            String lpszPassword,
            int dwLogonType,
            int dwLogonProvider,
            ref IntPtr phToken);

中的lpszUserName、lpszDomain、lpszPassword就要寫清楚。

   我就在這遇到過問題,第一次測試時,遠程服務器就是一臺獨立的文件服務器,這是我的調用方式:
       LogonUser("myname", "192.168.1.48", "password", LOGON32_LOGON_NEW_CREDENTIALS,
                   LOGON32_PROVIDER_DEFAULT, ref token);

   第二次測試時,遠程服務器是域MyDomain中的一個成員服務器,提供文件服務。這時代碼就應該是:

 LogonUser("myname", "MyDomain", "password", LOGON32_LOGON_NEW_CREDENTIALS,
                    LOGON32_PROVIDER_DEFAULT, ref token);

注意,代碼中是MyDomain而不是IP地址。

   b、再如:
   參考上面代碼

 string remote = @"\\192.168.1.48\generals";
            string local = @"P:";
            string username = @"Domain\UserName";
            string password = @"Password";

如果@"\\192.168.1.48\generals"變成@"\\192.168.1.48\generals\”就會出錯;
   如果是域中的用戶,那么把@"Domain\UserName"變成@"UserName"就會出錯。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“C#訪問遠程主機資源的方法有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万盛区| 马边| 铁岭县| 陆川县| 陆河县| 岳阳县| 汝城县| 怀宁县| 鱼台县| 鹰潭市| 汉阴县| 保康县| 深州市| 鹿邑县| 和田县| 邓州市| 伊宁市| 拜泉县| 冕宁县| 卓资县| 宁都县| 西林县| 青神县| 元朗区| 环江| 宜君县| 富民县| 甘泉县| 永寿县| 黄大仙区| 林西县| 景泰县| 宽甸| 龙州县| 长丰县| 阿拉善盟| 长阳| 奉新县| 富蕴县| 阳信县| 中西区|