最近遇到一个问题,有个跨两个domain的工程 其中一个进程需要跨域访问另外一个domain的share folder。 这个进程是一个service 是以 local system 帐号运行的 所以访问不了。如果用户直接启动这个exe的话 是可以访问的。 因为远程的sharefolder 已经开了 所有的共享权限。
一开始想用imperson(假装)的方法 就是让进程的某一段代码 假装用另外一个帐号运行 但是发现这样的假装只能使用本地的帐号 不能假装跨机器 远程的帐号。 所以是不行的
后来只能用win32API来 模拟net use的映射磁盘来实现:
 [DllImport ("advapi32.dll")]
        [DllImport ("advapi32.dll")]
 public static extern int LogonUserEx(string lpszUserName, string lpzsDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
        public static extern int LogonUserEx(string lpszUserName, string lpzsDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

 [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
 public static extern int DuplicateToken(IntPtr hToken, int impersonationlevel, ref IntPtr hNewToken);
        public static extern int DuplicateToken(IntPtr hToken, int impersonationlevel, ref IntPtr hNewToken);

 [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
 public static extern bool RevertToSelf();
        public static extern bool RevertToSelf();

 [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
 public static extern bool CloseHandle(IntPtr handle);
        public static extern bool CloseHandle(IntPtr handle);

 [DllImport("mpr.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [DllImport("mpr.dll", CharSet = CharSet.Auto, SetLastError = true)]
 public static extern int WNetAddConnection2A(ref NETRESOURCE lpNetResource, [MarshalAs(UnmanagedType.LPStr)] string Password, [MarshalAs(UnmanagedType.LPStr)] string Username, int flag);
        public static extern int WNetAddConnection2A(ref NETRESOURCE lpNetResource, [MarshalAs(UnmanagedType.LPStr)] string Password, [MarshalAs(UnmanagedType.LPStr)] string Username, int flag);



 NETRESOURCE mynetfolder = new NETRESOURCE();
            NETRESOURCE mynetfolder = new NETRESOURCE();
 mynetfolder.lpLocalName = "Z:";
            mynetfolder.lpLocalName = "Z:";
 string path = textBox4 .Text ;
            string path = textBox4 .Text ;
 //s.
            //s.
 mynetfolder.lpRemoteName = path;
            mynetfolder.lpRemoteName = path;
 mynetfolder.dwDisplayType = 3;
            mynetfolder.dwDisplayType = 3;
 mynetfolder.dwScope = 2;
            mynetfolder.dwScope = 2;
 mynetfolder.dwUsage = 1;
            mynetfolder.dwUsage = 1;

 //MessageBox.Show(path);
            //MessageBox.Show(path);
 mynetfolder.dwType = 0x1;
            mynetfolder.dwType = 0x1;
 mynetfolder.lpProvider = null;
            mynetfolder.lpProvider = null;

 int result = MapNetworkResource(ref mynetfolder, Password .Text  , UserName . Text , 0);
            int result = MapNetworkResource(ref mynetfolder, Password .Text  , UserName . Text , 0);
 //MessageBox.Show("the following process is started with account "+textBox2 .Text );
            //MessageBox.Show("the following process is started with account "+textBox2 .Text );
 Process myprocess = new Process();
            Process myprocess = new Process();
 myprocess.StartInfo.FileName = "z:/test.exe";
            myprocess.StartInfo.FileName = "z:/test.exe";
 myprocess.Start();
            myprocess.Start();
一开始想用imperson(假装)的方法 就是让进程的某一段代码 假装用另外一个帐号运行 但是发现这样的假装只能使用本地的帐号 不能假装跨机器 远程的帐号。 所以是不行的
后来只能用win32API来 模拟net use的映射磁盘来实现:
 [DllImport ("advapi32.dll")]
        [DllImport ("advapi32.dll")] public static extern int LogonUserEx(string lpszUserName, string lpzsDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
        public static extern int LogonUserEx(string lpszUserName, string lpzsDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
 [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern int DuplicateToken(IntPtr hToken, int impersonationlevel, ref IntPtr hNewToken);
        public static extern int DuplicateToken(IntPtr hToken, int impersonationlevel, ref IntPtr hNewToken);
 [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool RevertToSelf();
        public static extern bool RevertToSelf();
 [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)] public static extern bool CloseHandle(IntPtr handle);
        public static extern bool CloseHandle(IntPtr handle);
 [DllImport("mpr.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [DllImport("mpr.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern int WNetAddConnection2A(ref NETRESOURCE lpNetResource, [MarshalAs(UnmanagedType.LPStr)] string Password, [MarshalAs(UnmanagedType.LPStr)] string Username, int flag);
        public static extern int WNetAddConnection2A(ref NETRESOURCE lpNetResource, [MarshalAs(UnmanagedType.LPStr)] string Password, [MarshalAs(UnmanagedType.LPStr)] string Username, int flag);


 NETRESOURCE mynetfolder = new NETRESOURCE();
            NETRESOURCE mynetfolder = new NETRESOURCE(); mynetfolder.lpLocalName = "Z:";
            mynetfolder.lpLocalName = "Z:"; string path = textBox4 .Text ;
            string path = textBox4 .Text ; //s.
            //s. mynetfolder.lpRemoteName = path;
            mynetfolder.lpRemoteName = path; mynetfolder.dwDisplayType = 3;
            mynetfolder.dwDisplayType = 3; mynetfolder.dwScope = 2;
            mynetfolder.dwScope = 2; mynetfolder.dwUsage = 1;
            mynetfolder.dwUsage = 1;
 //MessageBox.Show(path);
            //MessageBox.Show(path); mynetfolder.dwType = 0x1;
            mynetfolder.dwType = 0x1; mynetfolder.lpProvider = null;
            mynetfolder.lpProvider = null;
 int result = MapNetworkResource(ref mynetfolder, Password .Text  , UserName . Text , 0);
            int result = MapNetworkResource(ref mynetfolder, Password .Text  , UserName . Text , 0); //MessageBox.Show("the following process is started with account "+textBox2 .Text );
            //MessageBox.Show("the following process is started with account "+textBox2 .Text ); Process myprocess = new Process();
            Process myprocess = new Process(); myprocess.StartInfo.FileName = "z:/test.exe";
            myprocess.StartInfo.FileName = "z:/test.exe"; myprocess.Start();
            myprocess.Start();
 

 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号