• 利用win32 API来实现跨域的共享访问


    最近遇到一个问题,有个跨两个domain的工程 其中一个进程需要跨域访问另外一个domain的share folder。 这个进程是一个service 是以 local system 帐号运行的 所以访问不了。如果用户直接启动这个exe的话 是可以访问的。 因为远程的sharefolder 已经开了 所有的共享权限。
    一开始想用imperson(假装)的方法 就是让进程的某一段代码 假装用另外一个帐号运行 但是发现这样的假装只能使用本地的帐号 不能假装跨机器 远程的帐号。 所以是不行的

    后来只能用win32API来 模拟net use的映射磁盘来实现:
            [DllImport ("advapi32.dll")]
            
    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)]
            
    public static extern int DuplicateToken(IntPtr hToken, int impersonationlevel, ref IntPtr hNewToken);

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

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

            [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);



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

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

                
    int result = MapNetworkResource(ref mynetfolder, Password .Text  , UserName . Text , 0);
                
    //MessageBox.Show("the following process is started with account "+textBox2 .Text );
                Process myprocess = new Process();
                myprocess.StartInfo.FileName 
    = "z:/test.exe";
                myprocess.Start();
  • 相关阅读:
    Linux 下用 Python 连接 MSSql Server 2008
    这周我加星(4)
    几个受益终身的英文缩写
    这周我加星(1)
    证据
    这周我加星(3)
    代友招人────3D 客户端程序员
    人在广州,力撑陈 Sir
    谁不会成为 Linux(ubuntu)的用户
    这周我加星(5)
  • 原文地址:https://www.cnblogs.com/yanchao/p/1083481.html
Copyright © 2020-2023  润新知