ローカルマシンのシステムアカウントで実行されるWindowsサービスがあります。このサービスの内部では、リモート共有フォルダで使用できるリモート.iniファイルを読み取ろうとします。このファイルを読み取ろうとしているコードは、LogonUserを使用して偽装されています(単純化されたコードは、以下のとおりです)。偽装は、構成されたユーザーを偽装するのに成功しますが、リモートネットワーク共有上にあるリモートのiniファイルを読み取ろうとすると、UnauthorizedAccessExceptionがスローされます。これは、構成されたユーザーがリモートマシンに対して読み取り/書き込みアクセス許可を持っている場合でも発生します。すべての偽装を削除するコードを変更し、Windowsサービスを構成済みのユーザーとして実行すると、リモートの.iniファイルへのすべてのアクセスが成功します。私は、ユーザーとしてサービスを実行するなどのハッキングではなく、このファイルへのアクセスを得るためになりすましを使用することをお勧めします。この例の偽装コードで誰かがエラーを見ることができますか?これを有効にするためにVista 64ビットボックスで何かする必要がありますか? IT同僚が有効にするために必要なアクティブなディレクトリのアクセス許可がありますか?Windowsサービスは、偽装中にリモート共有からファイルを読み取るとUnauthorizedAccessExceptionを取得します
private WindowsImpersonationContext _impersonatedUser;
private IntPtr _token;
// Declare signatures for Win32 LogonUser and CloseHandle APIs
[DllImport("advapi32.dll", SetLastError = true)]
static extern bool LogonUser(
string principal,
string authority,
string password,
LogonSessionType logonType,
LogonProvider logonProvider,
out IntPtr token);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool CloseHandle(IntPtr handle);
enum LogonSessionType : uint
{
Interactive = 2,
Network,
Batch,
Service,
NetworkCleartext = 8,
NewCredentials
}
enum LogonProvider : uint
{
Default = 0, // default for platform (use this!)
WinNT35, // sends smoke signals to authority
WinNT40, // uses NTLM
WinNT50 // negotiates Kerb or NTLM
}
....
var result = LogonUser(exchangeUserId, exchangeDomain,
password,
LogonSessionType.Network,
LogonProvider.Default,
out _token);
var id = new WindowsIdentity(_token);
_impersonatedUser = id.Impersonate();
try
{
//Validate access to the file on the remote computer/share
File.GetAccessControl(remoteFileAvailableInSharedFolder);
}
catch (UnauthorizedAccessException unauthorized)
{
...
}
....
// Stop impersonation and revert to the process identity
if (_impersonatedUser != null)
{
_impersonatedUser.Undo();
_impersonatedUser = null;
}
if (_token != IntPtr.Zero)
{
CloseHandle(_token);
_token = IntPtr.Zero;
}
ユーザーアカウントとして実行される場合、ファイルから別のアカウントを偽装することはできますか? – bryanmac
実際にファイルにアクセスするためにユーザーアカウントを使用しようとしましたか? –
別のLogonSessionTypeとLogonProviderを試してください.NewCredentialsとWinNT35を使用することをお勧めします。 – Thinhbk