[C#]访问共享文件夹或者磁盘(需要用户名密码)
Posted masonlu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C#]访问共享文件夹或者磁盘(需要用户名密码)相关的知识,希望对你有一定的参考价值。
有项目要求使用对方本地管理员访问访问对方D盘,网上找到一段API,刚开始可以使用一段时间,升级到1903就失效了,一脸懵逼啊
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();
以上是关于[C#]访问共享文件夹或者磁盘(需要用户名密码)的主要内容,如果未能解决你的问题,请参考以下文章
共享文件夹/盘加密方法:(指定电脑或者拥有用户名和密码才能访问)