Come faccio a passare le credenziali a una macchina in modo da poter usare Microsoft.Win32.RegistryKey.OpenRemoteBaseKey () su di esso?
-
23-09-2019 - |
Domanda
Questa API .NET funziona bene se sto cercando di aprire il Registro di sistema in una macchina che è nello stesso dominio come lo sono io (e il mio utente connesso dispone dei diritti di amministratore sul computer di destinazione).
Diventa difficile se si tratta di una macchina fuori-di-dominio con un diverso, l'utente amministrativo locale (di cui io ho la password).
Ho cercato di usare WNetUseConnection () (che mi ha servito bene in passato, in situazioni in cui ciò che volevo era quello di leggere un file su disco remoto) prima di chiamare OpenRemoteBaseKey (), ma niente da fare -. ho ottenere un accesso negato un'eccezione
Chiaramente, devo passare le credenziali in qualche altro modo, ma come?
Soluzione
Quello che ho usato con successo per accedere ai file su un computer è il seguente codice:
#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
E poi per la firma in parte, basta usare:
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();
}
Come si può vedere, "Annulla ()" farà che non sei più l'accesso come quell'utente. Quindi non usare prima il gioco è fatto. Ma non dimenticate di usarlo!