C# 如何将凭据传递给计算机,以便在其上使用Microsoft.Win32.RegistryKey.OpenRemoteBaseKey()?

C# 如何将凭据传递给计算机,以便在其上使用Microsoft.Win32.RegistryKey.OpenRemoteBaseKey()?,c#,.net,registry,credentials,remote-access,C#,.net,Registry,Credentials,Remote Access,如果我试图在与我位于同一域的计算机中打开注册表(并且我登录的用户在目标计算机上具有管理员权限),则可以正常工作 如果它是一台域外机器,并且有一个不同的本地管理用户(我确实拥有该用户的密码),那么它就会变得很棘手 在调用OpenRemoteBaseKey()之前,我尝试使用(在过去我想要读取远程磁盘文件的情况下,这对我很有用),但没有成功——我得到了一个访问被拒绝的异常 显然,我必须以其他方式传递凭据,但如何传递?我成功地使用以下代码访问计算机上的文件: #region imports

如果我试图在与我位于同一域的计算机中打开注册表(并且我登录的用户在目标计算机上具有管理员权限),则可以正常工作

如果它是一台域外机器,并且有一个不同的本地管理用户(我确实拥有该用户的密码),那么它就会变得很棘手

在调用OpenRemoteBaseKey()之前,我尝试使用(在过去我想要读取远程磁盘文件的情况下,这对我很有用),但没有成功——我得到了一个访问被拒绝的异常


显然,我必须以其他方式传递凭据,但如何传递?

我成功地使用以下代码访问计算机上的文件:

    #region imports 
        [DllImport("advapi32.dll", SetLastError = true)] 
        private static extern bool LogonUser(string 
        lpszUsername, string lpszDomain, string lpszPassword, 
        int dwLogonType, int dwLogonProvider, ref 
IntPtr phToken); 


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

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, 
        SetLastError = true)] 
        public extern static bool DuplicateToken(IntPtr 
        existingTokenHandle, 
        int SECURITY_IMPERSONATION_LEVEL, ref IntPtr 
        duplicateTokenHandle); 
        #endregion 
        #region logon consts 
        // logon types 
        const int LOGON32_LOGON_INTERACTIVE = 2; 
        const int LOGON32_LOGON_NETWORK = 3; 
        const int LOGON32_LOGON_NEW_CREDENTIALS = 9; 

        // logon providers 
        const int LOGON32_PROVIDER_DEFAULT = 0; 
        const int LOGON32_PROVIDER_WINNT50 = 3; 
        const int LOGON32_PROVIDER_WINNT40 = 2; 
        const int LOGON32_PROVIDER_WINNT35 = 1; 
        #endregion 
然后,对于部分登录,只需使用:

        IntPtr token = IntPtr.Zero; 

        bool isSuccess = LogonUser("username", "domain", "password", 
        LOGON32_LOGON_NEW_CREDENTIALS, 
        LOGON32_PROVIDER_DEFAULT, ref token); 
        using (WindowsImpersonationContext person = new WindowsIdentity(token).Impersonate()) 
        { 
        //do your thing 
         person.Undo(); 
        } 

正如您可能看到的,“Undo()”将使您不再作为该用户登录。所以在你完成之前不要使用它。但别忘了使用它

我是否可以将“token”变量保留很长一段时间,然后在tame中的不同位置使用“using/Undo()”块使用相同的标记?我想是的。实际登录的是模拟。我使用的是一个“GetImpersonation()”,它返回如上所述的WindowsImpersonationContext,但不会返回person.Undo()使person变量不能用于将来的访问?我的计划是调用LogonUser(),保留“token”指针,然后使用与您完全相同的各种using块,每个using块都创建一个新的WindowsImpersonationContext对象。或者我可能不会每次调用Undo(),只使用(person){something();},然后使用(person){something\u else();},然后当我确定不再需要进一步的连接时,person.Undo()?那么每次都会处理对象,但无法撤消它(我想)。也许只是让person挂起,不需要“使用”,而是显式调用dispose