私はそれにMicrosoft.Win32.RegistryKey.OpenRemoteBaseKeyを()を使用することができますので、どのように私はマシンに資格情報を渡すのですか?
-
23-09-2019 - |
質問
この.NET API には、[OK]を動作します私は私は(と私のログオンしているユーザーは、ターゲット・マシンの管理者権限を持っている)と同じドメイン内のマシンでレジストリを開くしようとしています。
それは(私がパスワードを持っている人の)異なる、ローカルの管理者ユーザーとアウトオブドメインマシンの場合、それがトリッキー取得します。
私は WNetUseConnection()を使用しようとしました>前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();
}
あなたが見るかもしれませんが、、「元に戻す()は、」あなたはもはや、そのユーザーとしてサインインしていることを確認しません。あなたが行っている前だから、それを使用しないでください。しかし、それを使用することを忘れないでください!
所属していません StackOverflow