У меня есть служба Windows, которая работает под системной учетной записью локального компьютера.Внутри этой службы он пытается прочитать удаленный INI-файл, который находится в удаленной общей папке.Код, пытающийся прочитать этот файл, обернут в олицетворение с использованием LogonUser (ниже приведена упрощенная версия кода, чтобы понять, что он делает).Олицетворение успешно начинает олицетворение настроенного пользователя, однако в тот момент, когда он пытается прочитать удаленный INI-файл, найденный на удаленном сетевом ресурсе, выдается исключение UnauthorizedAccessException.Это происходит, даже если настроенный пользователь имеет права на чтение / запись на удаленном компьютере.Когда я изменяю код, чтобы удалить все олицетворения, и вместо этого запускаю службу Windows в качестве настроенного пользователя, весь доступ к удаленному INI-файлу успешен.Я бы предпочел использовать олицетворение, чтобы получить доступ к этому файлу, а не взламывать, например, запускать службу от имени пользователя.Кто-нибудь может увидеть ошибки с кодом олицетворения в примере?Есть ли что-то, что мне нужно сделать на моем 64-битном компьютере Vista, чтобы включить это?Существуют ли определенные разрешения для активных каталогов, которые необходимо включить моим ИТ-сотрудникам?
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;
}