Метод 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 |