zoukankan      html  css  js  c++  java
  • 利用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();
  • 相关阅读:
    php7 安装mssql 扩展
    CentOS 7使用yum安装MYSQL
    PLSQL Developer 连接Linux 下Oracle的安装与配置
    VNC 在ubuntu desktop下只显示空白桌面
    Spring Boot 学习系列(11)—tomcat参数配置建
    Spring Boot 学习系列(10)—SpringBoot+JSP的使
    Spring Boot 学习系列(09)—自定义Bean的顺序加载
    Spring Boot 学习系列(08)—自定义servlet、filter及listener
    Spring Boot 学习系列(07)—properties文件读取
    Spring Boot 学习系列(06)—采用log4j2记录日志
  • 原文地址:https://www.cnblogs.com/yanchao/p/1083481.html
Copyright © 2011-2022 走看看