2

次のコードは機能しません。

IntPtr token = Win32Dll.LogonUser(“user1”, “mydomain”, “password1”);
WindowsIdentity id = new WindowsIdentity(token);
WindowsImpersonationContext ic = id.Impersonate();
byte[] unprotectedBytes = ProtectedData.Unprotect(passwordBytes, null, DataProtectionScope.CurrentUser);
password = Encoding.Unicode.GetString(unprotectedBytes);
ic.Undo();

パスワードは復号化されません。

MSDNによると

「偽装中にこのメソッドを使用すると、次のエラーが表示される場合があります:「キーは指定された状態での使用には無効です。このエラーは、メソッドを呼び出す前に、偽装するユーザーのプロファイルを読み込むことで防ぐことができます。」

4

2 に答える 2

1

DPAPI が機能するには、ユーザーのログオン資格情報から部分的に派生したユーザーのキー情報が必要です。このデータは、ユーザーのプロファイルと共に保存されます。これが、ユーザーがユーザーのプロファイルをロードする必要があるため、実行されていないプロセスです。

LoadUserProfile() から返されたデータを使用して、UnloadUserProfile() を呼び出す必要があります。

必要なことは次のとおりです。

LogonUser()
Impersonate()
LoadUserProfile()
Encrypt()
UnloadUserProfile()
RevertImpersonation() (.NET では Undo())

途中のすべてのステップで、GetLastError() を使用してエラーをチェックする必要があります。

このすべてのことを行うには、基本的にプロセスが管理者アカウントである必要があることに注意してください。ユーザーのプロファイルをロードするには、バックアップと復元の権限が必要です。LoadUserProfile を呼び出したときに特権が保持されていないというエラーが発生した場合は、次のことを行う必要があります。

a) アプリケーション アカウントにバックアップ権限と復元権限があることを確認します
。b) 権限が有効になっていますが、デフォルトでは無効になっています。

AdjustTokenPrivileges() http://msdn.microsoft.com/en-us/library/aa375202(VS.85).aspxを使用して特権を有効にすることができます。

于 2010-04-08T16:05:24.027 に答える
0

これは自分で試したことはありませんが、LoadUserProfileアンマネージ API 呼び出しを試すことができます。詳細については、こちらをご覧ください

関連する SO の質問がいくつかあります。

于 2010-03-23T19:32:50.923 に答える