[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#]访问共享文件夹或者磁盘(需要用户名密码)的主要内容,如果未能解决你的问题,请参考以下文章

新手如何映射共享盘 为 本地磁盘

共享文件夹/盘加密方法:(指定电脑或者拥有用户名和密码才能访问)

怎么用C#访问共享文件夹

ubuntu中共享了一个文件,但是\\地址的时候需要root密码

ASP.NET 从受密码保护的网络共享中读取文件

文件共享设定,本地权限和共享权限。