代码之家  ›  专栏  ›  技术社区  ›  BlueRaja - Danny Pflughoeft

通过网络复制文件(需要身份验证)

  •  7
  • BlueRaja - Danny Pflughoeft  · 技术社区  · 15 年前

    是否有某种方法可以作为本地(非网络)用户进行身份验证,以便在.NET中通过网络复制文件?

    net use 不是一个选择,我似乎不能 LogonUser 工作。

    有什么想法吗?


    [编辑] 下面是一些代码:

    public class UserImpersonator : IDisposable
    {
        private WindowsImpersonationContext _impersonationContext;
        private IntPtr _userHandle = IntPtr.Zero;
    
        [DllImport("advapi32.dll", SetLastError = true)]
        private static extern bool LogonUser(
            string lpszUsername,
            string lpszDomain,
            string lpszPassword,
            int dwLogonType,
            int dwLogonProvider,
            out IntPtr phToken
            );
    
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool CloseHandle(IntPtr hHandle);
    
        public UserImpersonator(string username, string password)
        {
            LogonUser(username, "", password, (int)LogonType.LOGON32_LOGON_NETWORK,
                      (int)LogonProvider.LOGON32_PROVIDER_DEFAULT, out _userHandle);
            _impersonationContext = WindowsIdentity.Impersonate(_userHandle);
        }
    
        public void Dispose()
        {
            CloseHandle(_userHandle);
            _impersonationContext.Undo();
        }
    
        private enum LogonType : int
        {
            LOGON32_LOGON_INTERACTIVE = 2,
            LOGON32_LOGON_NETWORK = 3,
            LOGON32_LOGON_BATCH = 4,
            LOGON32_LOGON_SERVICE = 5,
            LOGON32_LOGON_UNLOCK = 7,
            LOGON32_LOGON_NETWORK_CLEARTEXT = 8,
            LOGON32_LOGON_NEW_CREDENTIALS = 9,
        }
    
        private enum LogonProvider
        {
            LOGON32_PROVIDER_DEFAULT = 0,
        }
    }
    

    当我包裹 File.Copy 操作在 using(new UserImpersonator(username, password)) 我得到:

    System.IO.IOException:登录失败:未知用户名或密码错误。

    但是,如果我首先尝试连接到资源管理器中的共享(当它请求时输入身份验证信息),则 文件复制 作品。上面的代码似乎一点作用也没有。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Community Mohan Dere    8 年前

    可以将wnetuseconnection与p/invokes一起使用。

    查看此线程:

    Accessing a Shared File (UNC) From a Remote, Non-Trusted Domain With Credentials

        2
  •  1
  •   Community Mohan Dere    8 年前

    我可以告诉你我交给你的答案吗 here ?它应该能满足你的需要。

        3
  •  0
  •   Steven Sudit    15 年前

    您确实需要登录到域控制器上属于组成员的本地帐户,或者直接登录到DC帐户。不过,如果没有更多的信息,我不知道你在做什么。你能寄密码吗?

    编辑

    好的,我看到两个问题。

    主要问题是,您正在为LogonUser的域参数传递一个空字符串。尝试输入本地计算机或网络DC的名称。

    另一个问题是,您需要使用批处理或交互式登录,而不是网络登录。网络登录为您提供了一个模拟令牌,而不是主登录,这可能会阻止您访问网络资源,除非启用了委派。

    而且,一旦你完成了这项工作,你就需要完全删除intptr并用一个安全手柄替换它。

    推荐文章