Поделиться через


Метод SetSD класса __SystemSecurity

Метод SetSD задает дескриптор безопасности для пространства имен, к которому подключен пользователь. Для этого метода требуется дескриптор безопасности в формате массива двоичных байтов. При написании скрипта используйте метод SetSecurityDescriptor . Дополнительные сведения см. в разделах Защита пространств имен WMI и Изменение безопасности доступа для защищаемых объектов.

При программировании на C++ можно управлять двоичным дескриптором безопасности с помощью SDDL и методов преобразования ConvertSecurityDescriptorToStringSecurityDescriptor и ConvertStringSecurityDescriptorToSecurityDescriptor.

Пользователь должен иметь разрешение WRITE_DAC , и по умолчанию это разрешение имеет администратор. Единственной частью дескриптора безопасности, которая используется, является запись ненаследованного управления доступом (ACE) в списке управления доступом на уровне пользователей (DACL). Устанавливая флаг CONTAINER_INHERIT в ACE, дескриптор безопасности влияет на дочерние пространства имен. Разрешены как разрешить, так и запретить ACE.

Примечание

Так как запретить и разрешить ACE разрешены в DACL, важен порядок ACE. Дополнительные сведения см. в разделе Упорядочение ACE в DACL.

Синтаксис

HRESULT SetSD(
  [in] uint8 SD[]
);

Параметры

SD [in]

Массив байтов, составляющий дескриптор безопасности.

Возвращаемое значение

Возвращает HRESULT , указывающее состояние вызова метода. Для сценариев и приложений Visual Basic результат можно получить из OutParameters.ReturnValue. Дополнительные сведения см. в разделах Построение объектов InParameters и Анализ объектов OutParameters.

В следующем списке перечислены возвращаемые значения, важные для SetSD.

S_OK

Метод выполнен успешно.

WBEM_E_ACCESS_DENIED

Вызывающий объект не имеет достаточных прав для вызова этого метода.

WBEM_E_METHOD_DISABLED

Предпринята попытка запустить этот метод в операционной системе, которая его не поддерживает.

WBEM_E_INVALID_OBJECT

SD не проходит базовые тесты на допустимость.

WBEM_E_INVALID_PARAMETER

Sd является недопустимым из-за одного из следующих:

  • Отсутствует DACL.
  • DaCL недопустим.
  • В ACE установлен флаг WBEM_FULL_WRITE_REP , а флаг WBEM_PARTIAL_WRITE_REP или WBEM_WRITE_PROVIDER не установлен.
  • В ACE установлен флаг INHERIT_ONLY_ACE без флага CONTAINER_INHERIT_ACE .
  • ACE имеет неизвестный бит доступа.
  • В ACE установлен флаг, которого нет в таблице.
  • ACE имеет тип, которого нет в таблице.
  • Владелец и группа отсутствуют в SD.

Дополнительные сведения о флагах записи управления доступом (ACE) см. в разделе Константы безопасности WMI.

Комментарии

Дополнительные сведения об изменении безопасности пространства имен программными средствами или вручную см. в разделе Защита пространств имен WMI.

Примеры

В следующем сценарии показано, как с помощью SetSD задать дескриптор безопасности пространства имен для корневого пространства имен и изменить его на массив байтов, показанный в strSD.

' Hard-coded security descriptor
strSD = array( 1, 0, 4,129,72, 0, 0, 0, _ 
              88, 0, 0,  0, 0, 0, 0, 0, _
              20, 0, 0,  0, 2, 0,52, 0, _
               2, 0, 0,  0, 0, 2,24, 0, _
              63, 0, 6,  0, 1, 2, 0, 0, _
               0, 0, 0,  5,32, 0, 0, 0, _
              32, 2, 0,  0, 0, 2,20, 0, _
              63, 0, 6,  0, 1, 1, 0, 0, _
               0, 0, 0,  1, 0, 0, 0, 0, _
               1, 2, 0,  0, 0, 0, 0, 5, _
              32, 0, 0,  0,32, 2, 0, 0, _
               1, 2, 0,  0, 0, 0, 0, 5, _
              32, 0, 0,  0,32, 2, 0, 0)

' Connect to WMI and the root namespace.
Set oSvc = CreateObject( _
                         "WbemScripting.SWbemLocator"). _
                         ConnectServer(,"Root\Cimv2")

' Get the single __SystemSecurity object in this namespace.
Set oSecurity = oSvc.Get("__SystemSecurity=@")

' Change the namespace security.
nReturn = oSecurity.SetSD(strSD)
WScript.Echo "ReturnValue " & nReturn

В следующем примере кода C# используется System.Security.AccessControl.RawSecurityDescriptor для перечисления, вставки и удаления новых объектов CommonAce в RawSecurityDescriptor.DiscretionaryAcl, а затем преобразования его обратно в массив байтов для сохранения с помощью SetSD. SecurityIdentifier можно получить с помощью NTAccount и Translate.

 byte[] sdValueByteArray = new Byte[0];

            string accountName = "My User or Group";

            AceFlags aceFlags = AceFlags.ContainerInherit;

            int accessRights = 131107; // Search for Namespace Access Rights Constants and build an Flags enum

            RawSecurityDescriptor rawSecurityDescriptor = new RawSecurityDescriptor(sdValueByteArray, 0);

            NTAccount ntAccount = new NTAccount(accountName);

            IdentityReference identityReference = ntAccount.Translate(typeof(SecurityIdentifier));

            if (identityReference == null)

            {

                string message = string.Format("The IdentityReference of NTAccount '{0}' is null.", accountName);

                throw new Exception(message);

            }

            SecurityIdentifier securityIdentifier = identityReference as SecurityIdentifier;

            if (securityIdentifier == null)

            {

                string message = "The IdentityReference of NTAccount '{0}' is not an SecurityIdentifier.";

                throw new Exception(message);

            }

            CommonAce commonAce;

            foreach (GenericAce genericAce in rawSecurityDescriptor.DiscretionaryAcl)

            {

                commonAce = genericAce as CommonAce;

                if (commonAce == null)

                {

                    continue;

                }

                if (commonAce.SecurityIdentifier.Value.Equals(securityIdentifier.Value, StringComparison.OrdinalIgnoreCase))

                {

                    return;

                }

            }

            commonAce = new CommonAce(aceFlags, AceQualifier.AccessAllowed, (int)accessRights, securityIdentifier, false, null);

            rawSecurityDescriptor.DiscretionaryAcl.InsertAce(rawSecurityDescriptor.DiscretionaryAcl.Count, commonAce);

Требования

Требование Значение
Минимальная версия клиента
Windows Vista
Минимальная версия сервера
Windows Server 2008
Пространство имен
Все пространства имен WMI

См. также раздел

Системные классы WMI

__SystemSecurity

__SystemSecurity::GetSD

Константы безопасности WMI

Win32_ACE

Win32_SecurityDescriptor

Защита пространств имен WMI