.NET 在网络上创建映射磁盘 (在服务器a上创建服务器b的共享磁盘并访问目录)

 

1、 在文件服务器上创建共享目录,并新建访问账户。比如共享目录为:\\192.168.0.9\share访问账户为:administrator 密码为:123.com

 

2、 在WEB服务器上新建用户:administrator 密码为:123.com,用户组选择默认的administrator组即可。

 

3、 在WEB项目中新建公共类WNetHelper

public class WNetHelper
    {
        [DllImport("mpr.dll", EntryPoint = "WNetAddConnection2")]


        private static extern uint WNetAddConnection2(NetResource lpNetResource, string lpPassword, string lpUsername, uint dwFlags);


        [DllImport("Mpr.dll", EntryPoint = "WNetCancelConnection2")]


        private static extern uint WNetCancelConnection2(string lpName, uint dwFlags, bool fForce);


        [StructLayout(LayoutKind.Sequential)]


        public class NetResource
        {


            public int dwScope;


            public int dwType;


            public int dwDisplayType;


            public int dwUsage;


            public string lpLocalName;


            public string lpRemoteName;


            public string lpComment;


            public string lpProvider;


        }
        ///  


        /// 为网络共享做本地映射 


        ///
 


        /// 访问用户名(windows系统需要加计算机名,如:comp-1\user-1) 


        /// 访问用户密码 


        /// 网络共享路径(如:\\192.168.0.9\share) 


        /// 本地映射盘符 


        ///  
        public static uint WNetAddConnection(string username, string password, string remoteName, string localName)
        {


            NetResource netResource = new NetResource();
            
            netResource.dwScope = 2;


            netResource.dwType = 1;


            netResource.dwDisplayType = 3;


            netResource.dwUsage = 1;


            netResource.lpLocalName = localName;


            netResource.lpRemoteName = remoteName.TrimEnd('\\');


            uint result = WNetAddConnection2(netResource, password, username, 0);


            return result;


        }


        public static uint WNetCancelConnection(string name, uint flags, bool force)
        {
            uint nret = WNetCancelConnection2(name, flags, force);


            return nret;


        }


    }
}

4、为IIS指定运行账户user-1   要实现此功能,有两种办法:

a) 在web.config文件中的节点下,添加如下配置:
b) 在WEB项目中添加公用类LogonImpersonate

 public class LogonImpersonate : IDisposable
    {


        static public string DefaultDomain
        {


            get
            {
                return ".";


            }


        }


        const int LOGON32_LOGON_INTERACTIVE = 2;


        const int LOGON32_PROVIDER_DEFAULT = 0;


        [System.Runtime.InteropServices.DllImport("Kernel32.dll")]


        extern static int FormatMessage(int flag, ref IntPtr source, int msgid, int langid, ref string buf, int size, ref IntPtr args);


        [System.Runtime.InteropServices.DllImport("Kernel32.dll")]
        extern static bool CloseHandle(IntPtr handle);


        [System.Runtime.InteropServices.DllImport("Advapi32.dll", SetLastError = true)]


        extern static bool LogonUser(


        string lpszUsername,


        string lpszDomain,


        string lpszPassword,


        int dwLogonType,


        int dwLogonProvider,


        ref IntPtr phToken


        );


        IntPtr token;


        System.Security.Principal.WindowsImpersonationContext context;


        public LogonImpersonate(string username, string password)
        {


            if (username.IndexOf("\\") == -1)
            {
                Init(username, password, DefaultDomain);
            }


            else
            {


                string[] pair = username.Split(new char[] { '\\' }, 2);


                Init(pair[1], password, pair[0]);


            }


        }


        public LogonImpersonate(string username, string password, string domain)
        {


            Init(username, password, domain);


        }


        void Init(string username, string password, string domain)
        {


            if (LogonUser(username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token))
            {


                bool error = true;


                try
                {
                    context = System.Security.Principal.WindowsIdentity.Impersonate(token);


                    error = false;


                }


                finally
                {
                    if (error)


                        CloseHandle(token);
                }


            }
            else
            {


                int err = System.Runtime.InteropServices.Marshal.GetLastWin32Error();


                IntPtr tempptr = IntPtr.Zero;


                string msg = null;


                FormatMessage(0x1300, ref tempptr, err, 0, ref msg, 255, ref tempptr);


                throw (new Exception(msg));


            }


        }


        ~LogonImpersonate()
        {
            Dispose();
        }


        public void Dispose()
        {
            if (context != null)
            {


                try
                {
                    context.Undo();
                }


                finally
                {
                    CloseHandle(token);


                    context = null;
                }


            }


        }


    }
}

在访问映射磁盘之前首先调用此类为IIS更换运行用户:LogonImpersonate imper = new LogonImpersonate("administrator", "123.com");

5、在访问共享目录前,调用WNetHelper.WNetAddConnection,添加磁盘映射

  

 public static bool CreateDirectory(string path)
        {
            uint state = 0;


            if (!Directory.Exists("Z:"))
            {
                state = WNetHelper.WNetAddConnection(@"administrator", "123.com", @"\\192.168.1.72\test$", "Z:");
            }


            if (state.Equals(0))
            {
                Directory.CreateDirectory(path);
                return true;
            }


            else
            {
                throw new Exception("添加网络驱动器错误,错误号:" + state.ToString());
            }


        }

6、完成。


你可能感兴趣的:(c#编程)