C# 访问共享文件夹或者磁盘(需要用户名密码)

来源:互联网 发布:holi天气数据来源 编辑:程序博客网 时间:2024/05/16 11:47

SharedTool:

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  using System.Runtime.InteropServices;    namespace ConsoleApplication5  {      public class SharedTool : IDisposable      {          // obtains user token               [DllImport("advapi32.dll", SetLastError = true)]          static extern bool LogonUser(string pszUsername, string pszDomain, string pszPassword,              int dwLogonType, int dwLogonProvider, ref IntPtr phToken);            // closes open handes returned by LogonUser               [DllImport("kernel32.dll", CharSet = CharSet.Auto)]          extern static bool CloseHandle(IntPtr handle);            [DllImport("Advapi32.DLL")]          static extern bool ImpersonateLoggedOnUser(IntPtr hToken);            [DllImport("Advapi32.DLL")]          static extern bool RevertToSelf();          const int LOGON32_PROVIDER_DEFAULT = 0;          const int LOGON32_LOGON_NEWCREDENTIALS = 9;//域控中的需要用:Interactive = 2               private bool disposed;            public SharedTool(string username, string password, string ip)          {              // initialize tokens                   IntPtr pExistingTokenHandle = new IntPtr(0);              IntPtr pDuplicateTokenHandle = new IntPtr(0);                try              {                  // get handle to token                       bool bImpersonated = LogonUser(username, ip, password,                      LOGON32_LOGON_NEWCREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref pExistingTokenHandle);                    if (bImpersonated)                  {                      if (!ImpersonateLoggedOnUser(pExistingTokenHandle))                      {                          int nErrorCode = Marshal.GetLastWin32Error();                          throw new Exception("ImpersonateLoggedOnUser error;Code=" + nErrorCode);                      }                  }                  else                  {                      int nErrorCode = Marshal.GetLastWin32Error();                      throw new Exception("LogonUser error;Code=" + nErrorCode);                  }              }              finally              {                  // close handle(s)                       if (pExistingTokenHandle != IntPtr.Zero)                      CloseHandle(pExistingTokenHandle);                  if (pDuplicateTokenHandle != IntPtr.Zero)                      CloseHandle(pDuplicateTokenHandle);              }          }            protected virtual void Dispose(bool disposing)          {              if (!disposed)              {                  RevertToSelf();                  disposed = true;              }          }            public void Dispose()          {              Dispose(true);          }      }  }  


案例:

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  using System.IO;    namespace ConsoleApplication5  {      class Program      {          static void Main(string[] args)          {              using (SharedTool tool = new SharedTool("administrator", "12345678", "192.168.1.101"))              {                  string selectPath = @"\\192.168.1.101\c$";                    var dicInfo = new DirectoryInfo(selectPath);//选择的目录信息                    DirectoryInfo[] dic = dicInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly);                  foreach (DirectoryInfo temp in dic)                  {                      Console.WriteLine(temp.FullName);                  }                    Console.WriteLine("---------------------------");                  FileInfo[] textFiles = dicInfo.GetFiles("*.*", SearchOption.TopDirectoryOnly);//获取所有目录包含子目录下的文件                  foreach (FileInfo temp in textFiles)                  {                      Console.WriteLine(temp.Name);                  }              }              Console.ReadKey();          }      }  }  



0 0