次の方法で共有


__SystemSecurity クラスの SetSD メソッド

SetSD メソッドは、ユーザーが接続されている名前空間のセキュリティ記述子を設定します。 このメソッドには、バイナリ バイト配列形式のセキュリティ記述子が必要です。 スクリプトを記述する場合は、SetSecurityDescriptor メソッドを使用します。 詳細については、「WMI 名前空間のセキュリティ保護」と「セキュリティ保護可能なオブジェクトのアクセス セキュリティの変更」を参照してください。

C++ でプログラミングする場合は、SDDL と、変換メソッド ConvertSecurityDescriptorToStringSecurityDescriptor および ConvertStringSecurityDescriptorToSecurityDescriptor を使用してバイナリ セキュリティ記述子を操作できます。

ユーザーには WRITE_DAC アクセス許可が必要です。管理者は既定でそのアクセス許可を持っています。 使用されるセキュリティ記述子の唯一の部分は、随意アクセス制御リスト (DACL) の非継承アクセス制御エントリ (ACE) です。 ACE に CONTAINER_INHERIT フラグを設定すると、セキュリティ記述子は子名前空間に影響します。 許可 ACE と拒否 ACE の両方を使用できます。

注意

DACL では拒否 ACE と許可 ACE の両方を使用できるため、ACE の順序が重要です。 詳細については、「DACL 内の ACE の順序」を参照してください。

構文

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

このメソッドがサポートされていない OS で実行しようとしました。

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 に、CONTAINER_INHERIT_ACE フラグなしで INHERIT_ONLY_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 を使用して RawSecurityDescriptor.DiscretionaryAcl 内の新しい CommonAce オブジェクトを列挙、挿入、削除し、それをバイト配列に変換して 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 名前空間のセキュリティ保護