C#怎么访问共享目录

来源:互联网 发布:软件使用说明文档 编辑:程序博客网 时间:2024/04/29 04:12

用C#访问共享目录总是出现权限问题,让人很头疼,研究了很久找到一种办法,贴上代码:

 public class IdentityScope : 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 IdentityScope(string sUsername,string sPassword, string sDomain)            {                // 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);            }        }   


通过IdentityScope传入目标机器的IP,用户名和密码就可以访问到共享目录了。

如何使用如下:

using (IdentityScope iss = new IdentityScope(targetLoginName, targetPassword,targetIP)) {           //你的代码         }


 

原创粉丝点击