私は結局2〜3年前に同様のことをしたヘルパークラスを見つけました。ヘルパーはIDisposableをを実装し、これだけのように「使用」でファイルのアクセスコードをラップ: -
using (Impersonate imp = new Impersonate())
{
// Code in here will run under the identity specified in the helper
}
そして、ここでは(私はいくつかのスペースを節約するために「usings」を削除したヘルパークラスのコードです)。あなたは、ユーザーアカウントがコンストラクタでハードコードされて気づくでしょう:
internal class Impersonate : IDisposable
{
private const int LOGON32_LOGON_INTERACTIVE = 2;
private const int LOGON32_PROVIDER_DEFAULT = 0;
private bool _disposed = false;
private WindowsImpersonationContext _context = null;
[DllImport("advapi32.dll")]
private static extern int LogonUserA(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool RevertToSelf();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern bool CloseHandle(IntPtr handle);
internal Impersonate()
{
WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
string domain = "<whatever>";
string username = "<whatever>";
string password = "<whatever>";
try
{
if (RevertToSelf())
{
if (LogonUserA(username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
_context = tempWindowsIdentity.Impersonate();
}
}
}
}
finally
{
if (token != IntPtr.Zero)
{
CloseHandle(token);
}
if (tokenDuplicate != IntPtr.Zero)
{
CloseHandle(tokenDuplicate);
}
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// Dispose any managed resources here.
}
// Stop the impersonation.
_context.Undo();
_disposed = true;
}
}
}
それをやってみると、私はあなたが乗る方法を知ってみましょう...
をアンドリュー
ASP.Netアプリケーション全体を特定のユーザーに偽装したいのですか、または別のユーザーに偽装したいだけですか(たとえば、メソッド呼び出し中)? –
一時的に...ファイルアクセス用です。各ユーザーはアプリにログインします(フォームのログイン)。アプリは、アプリサーバーのADに対してユーザーを認証します。一般的に、ユーザはapppoolのアイデンティティの下でアプリケーションを動作させることができます。ただし、ファイルアクセスが必要なユーザーもいます。私はその後、ユーザーとして(私は彼らのログインの詳細があるので)偽装したい。また、すべてのユーザーがサーバーにファイルアクセス権を持つわけではありません。 – eych