У меня работает следующее: Используя GPMC, я могу создавать объекты групповой политики на контроллере домена, когда:
- У меня есть приложение, работающее как консольное приложение, вошедшее в систему как пользователь домена.
- У меня установлено приложение как служба Windows учетной записи пользователя домена.
Однако, когда я запускаю службу как «локальная служба», я получаю исключение при доступе при попытке создать объект групповой политики:
System.UnauthorizedAccessException: доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))
в Microsoft.GroupPolicy.IGPMDomain.CreateGPO ()
Я использую код API LogonUser для делегирования создания:
public Impersonate(ILogManager logManager, IWindowsCredentials windowsCredentials)
{
logManager.WriteDebug("Current User: {0}", WindowsIdentity.GetCurrent().Name);
const int impersonationLevel = LOGON32_LOGON_INTERACTIVE;
if (!RevertToSelf())
throw new ImpersonateException("Impersonation failed to RevertToSelf.");
if (LogonUser(windowsCredentials.Username, windowsCredentials.Domain,
windowsCredentials.Password.ConvertToReadableString(), impersonationLevel,
LOGON32_PROVIDER_DEFAULT, ref _token) != 0)
{
if (DuplicateToken(_token, impersonationLevel, ref _tokenDuplicate) != 0)
{
var tempWindowsIdentity = new WindowsIdentity(_tokenDuplicate);
_impersonationContext = tempWindowsIdentity.Impersonate();
logManager.WriteDebug("Impersonation User: {0}", WindowsIdentity.GetCurrent().Name);
logManager.WriteDebug("Impersonation Level: {0}", tempWindowsIdentity.ImpersonationLevel);
}
else
{
if (_token != IntPtr.Zero)
CloseHandle(_token);
if (_tokenDuplicate != IntPtr.Zero)
CloseHandle(_tokenDuplicate);
throw new ImpersonateException(string.Format("Impersonation failed due to duplicateToken '{0}'.",
windowsCredentials.Username));
}
logManager.WriteDebug("Successfully impersonated: {0}", windowsCredentials.Username);
}
else
{
if (_token != IntPtr.Zero)
CloseHandle(_token);
throw new ImpersonateException(string.Format("Impersonation failed due to LogonUser '{0}'.",
windowsCredentials.Username));
}
}
На самом деле я распечатываю:
2012-02-01 09:58:55 [9] DEBUG - Создание нового объекта групповой политики с DisplayName 'Test222'.
2012-02-01 09:58:55 [9] DEBUG - текущий пользователь: NT AUTHORITY \ SYSTEM
2012-02-01 09:58:55 [9] DEBUG - Пользователь подражания: ABC \ joebob
2012-02-01 09:58:55 [9] DEBUG - Уровень олицетворения: олицетворение
Мне кажется, я все делаю правильно, но, возможно, вы не можете создавать объекты групповой политики с помощью делегирования, но я не могу найти доказательств, подтверждающих это. Есть идеи?