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