Запуск службы Windows в разделе «Локальная служба» и правильное делегирование создания объекта групповой политики. - PullRequest
0 голосов
/ 01 февраля 2012

У меня работает следующее: Используя GPMC, я могу создавать объекты групповой политики на контроллере домена, когда:

  1. У меня есть приложение, работающее как консольное приложение, вошедшее в систему как пользователь домена.
  2. У меня установлено приложение как служба 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 - Уровень олицетворения: олицетворение

Мне кажется, я все делаю правильно, но, возможно, вы не можете создавать объекты групповой политики с помощью делегирования, но я не могу найти доказательств, подтверждающих это. Есть идеи?

...