• [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.101c$";  
      
                    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();  
            }  
        }  
    }  

    大神链接

  • 相关阅读:
    zyUpload+struct2完成文件上传
    js表单动态添加数据并提交
    Hibernate注解
    ueditor的配置和使用
    设计模式
    静态Include和动态Include测试并总结
    java笔试题
    perf使用示例1
    perf 简介
    ss简单使用
  • 原文地址:https://www.cnblogs.com/masonlu/p/11366051.html
Copyright © 2020-2023  润新知