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();
- }
- }
- }