Bagikan melalui


Metode SetSD dari kelas __SystemSecurity

Metode SetSD mengatur deskriptor keamanan untuk namespace tempat pengguna tersambung. Metode ini memerlukan pendeskripsi keamanan dalam format array byte biner. Jika Anda menulis skrip, gunakan metode SetSecurityDescriptor . Untuk informasi selengkapnya, lihat Mengamankan Namespace WMI dan Mengubah Keamanan Akses pada Objek yang Dapat Diamankan.

Jika Anda memprogram di C++, Anda dapat memanipulasi deskriptor keamanan biner menggunakan SDDL, dan metode konversi ConvertSecurityDescriptorToStringSecurityDescriptor dan ConvertStringSecurityDescriptorToSecurityDescriptor.

Pengguna harus memiliki izin WRITE_DAC , dan secara default, administrator memiliki izin tersebut. Satu-satunya bagian dari deskriptor keamanan yang digunakan adalah entri kontrol akses (ACE) yang tidak diwariskan dalam daftar kontrol akses diskresi (DACL). Dengan mengatur bendera CONTAINER_INHERIT di ACE, deskriptor keamanan memengaruhi namespace anak. ACE izinkan dan tolak diizinkan.

Catatan

Karena tolak dan izinkan ACE keduanya diizinkan dalam DACL, urutan ACE adalah penting. Untuk informasi selengkapnya, lihat Pengurutan ACE di DACL.

Sintaks

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

Parameter

SD [in]

Array byte yang membentuk deskriptor keamanan.

Menampilkan nilai

Mengembalikan HRESULT yang menunjukkan status panggilan metode. Untuk aplikasi pembuatan skrip dan Visual Basic, hasilnya dapat diperoleh dari OutParameters.ReturnValue. Untuk informasi selengkapnya, lihat Membuat Objek InParameters dan Mengurai Objek OutParameters.

Daftar berikut mencantumkan nilai pengembalian yang signifikan untuk SetSD.

S_OK

Metode berhasil dijalankan.

WBEM_E_ACCESS_DENIED

Penelepon tidak memiliki hak yang memadai untuk memanggil metode ini.

WBEM_E_METHOD_DISABLED

Mencoba menjalankan metode ini pada OS yang tidak mendukungnya.

WBEM_E_INVALID_OBJECT

SD tidak lulus tes validitas dasar.

WBEM_E_INVALID_PARAMETER

SD tidak valid karena salah satu hal berikut ini:

  • DACL hilang.
  • DACL tidak valid.
  • ACE memiliki bendera WBEM_FULL_WRITE_REP yang ditetapkan, dan bendera WBEM_PARTIAL_WRITE_REP atau WBEM_WRITE_PROVIDER tidak diatur.
  • ACE memiliki bendera INHERIT_ONLY_ACE yang ditetapkan tanpa bendera CONTAINER_INHERIT_ACE .
  • ACE memiliki set bit akses yang tidak diketahui.
  • ACE memiliki set bendera yang tidak ada dalam tabel.
  • ACE memiliki jenis yang tidak ada dalam tabel.
  • Pemilik dan grup hilang dari SD.

Untuk informasi selengkapnya tentang bendera entri kontrol akses (ACE), lihat Konstanta Keamanan WMI.

Keterangan

Untuk informasi selengkapnya tentang memodifikasi keamanan namespace secara terprogram atau manual, lihat Mengamankan Namespace WMI.

Contoh

Skrip berikut menunjukkan cara menggunakan SetSD untuk mengatur deskriptor keamanan namespace layanan untuk namespace layanan akar dan mengubahnya ke array byte yang diperlihatkan dalam 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

Sampel kode C# berikut menggunakan System.Security.AccessControl.RawSecurityDescriptor untuk menghitung, menyisipkan, dan menghapus objek CommonAce baru di RawSecurityDescriptor.DiscretionaryAcl lalu mengonversinya kembali ke array byte untuk menyimpannya melalui SetSD. SecurityIdentifier dapat diambil dengan menggunakan NTAccount dan 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);

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung
Windows Vista
Server minimum yang didukung
Windows Server 2008
Ruang nama
Semua namespace WMI

Lihat juga

Kelas Sistem WMI

__SystemSecurity

__SystemSecurity::GetSD

Konstanta Keamanan WMI

Win32_ACE

Win32_SecurityDescriptor

Mengamankan Namespace WMI