使用LogonUser来代替WNetAddConnection2A来访问共享文件夹

这边在本地测试通过,用这个方法不是用net use命令模拟,而是类似credential来装扮一个权限的账户来访问网络路径的文件。




 public class FromSharedFoldersInDomain :IDisposable
    {


        public static byte[] GetData(string remotePath, string fileName)
        {

            byte[] buffer = new byte[0];
            try
            {
                using (FromSharedFoldersInDomain iss = new FromSharedFoldersInDomain(@"administrator", remotePath, "A+12345678"))
                {
                    DirectoryInfo Dir = new DirectoryInfo(@"\\\\" + remotePath + "\\" + "hq");
                    FileStream fs = new FileStream(Dir.FullName + "\\"+fileName, FileMode.OpenOrCreate);
                    using (StreamReader stream = new StreamReader(fs))
                    {
                        buffer = new byte[fs.Length + 1];
                        fs.Read(buffer, 0, buffer.Length);
                    }
                    fs.Close();

                    //DirectoryInfo Dir = new DirectoryInfo(@"\\\\" + hostIp + "\\" + dirname);
                }
            }catch(Exception ex)
            {
                Logger.Info("FromSharedFoldersInDomain get byte array has encounter error:" + ex.ToString());

            }
               
         
            return buffer;
        }
          // 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 FromSharedFoldersInDomain(string sUsername, string sDomain, string sPassword)    
        {    
            // initialize tokens    
            IntPtr pExistingTokenHandle = new IntPtr(0);    
            IntPtr pDuplicateTokenHandle = new IntPtr(0);    
     
            try    
            {    
                // get handle to token    
                bool bImpersonated = LogonUser(sUsername, sDomain, sPassword,    
                    LOGON32_LOGON_NEWCREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref pExistingTokenHandle);    
     
                if (true == 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);    
        }    
    }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值