ตรวจจับตัวเลือกไซต์ AD โดยใช้ PowerShell


9

ฉันจะใช้ PowerShell เพื่อค้นหาตัวเลือกไซต์ AD ได้อย่างไร+IS_INTER_SITE_AUTO_TOPOLOGY_DISABLEDใน PowerShell ฉันได้เล่นกับคำสั่งต่อไปนี้ แต่ไม่สามารถรับมันคายอะไรที่เป็นประโยชน์

Get-ADObject -Filter 'objectClass -eq "site"' -Searchbase (Get-ADRootDSE).ConfigurationNamingContext` -Properties options

คำตอบ:


17

แก้ไข # 3: การอัปเดตเอกสารอ้างอิง

แก้ไข # 2: การแก้ไขอีกครั้งเพราะฉันเขียนบางสิ่งใน PS เพื่อทำสิ่งที่คุณพยายามทำ มันอยู่ที่ด้านล่าง

ฉันจะไปข้างหน้าและยืนยันว่าไม่มี Powershell Friendly (tm)วิธีการทำมันในปัจจุบัน แต่แน่นอนคุณยังสามารถใช้ Powershell เพื่อสร้างแบบสอบถาม LDAP ที่จำเป็นเพื่อดูตัวเลือกเหล่านี้หากคุณต้องการ ตรวจสอบoptionsคุณสมบัติของNTDS Settingsวัตถุของแต่ละเซิร์ฟเวอร์ที่เชื่อมโยงกับเว็บไซต์โฆษณา:

ป้อนคำอธิบายรูปภาพที่นี่

นั่นคือแอตทริบิวต์ที่แน่นอนซึ่งเป็น bitmask ซึ่ง repadmin.exe ทำงาน Repadmin.exe ประกอบด้วยตัวแปล bitmask ที่เป็นมิตรในรหัส ADSIEdit MMC เช่นเดียวกับสแนปอิน อย่างไรก็ตามคุณจะต้องสร้างตัวแปล bitmask ขึ้นใหม่ใน Powershell

ตัวอย่างเช่นRepadmin /options <DC> [{+|-} IS_GC]เป็นคำสั่งที่ถูกต้องและตอนนี้เรารู้ว่าบิตที่มันทำงาน

นี่คือเอกสาร MSDN ที่ค่อนข้างเส็งเคร็งบนoptionsแอตทริบิวต์

เอกสาร MSDN ที่ดีขึ้นเกี่ยวกับoptionsคุณสมบัติ

คุณสมบัติตัวเลือก

บิตฟิลด์ซึ่งความหมายของบิตแตกต่างจาก objectClass ถึง objectClass สามารถเกิดขึ้นได้บน Inter-Site-Transport, การเชื่อมต่อ NTDS, NTDS-DSA, การตั้งค่าไซต์ NTDS และไซต์ลิงก์วัตถุ

และนี่คือตัวอย่างของการค้นหาตัวเลือกโดยใช้โอเปอเรเตอร์กฎการจับคู่แบบเก่า:

(&(objectCategory=nTDSDSA)(options:1.2.840.113556.1.4.803:=1))

ตัวกรองนี้ใช้ตัวดำเนินการกฎการจับคู่ LDAP_MATCHING_RULE_BIT_AND (1.2.840.113556.1.4.803) เพื่อค้นหาวัตถุ nTDSDSA ที่มีชุดบิตต่ำใน bitmask ของแอตทริบิวต์ตัวเลือก บิตลำดับต่ำซึ่งสอดคล้องกับค่าคงที่ NTDSDSA_OPT_IS_GC ที่กำหนดใน Ntdsapi.h ระบุวัตถุ nTDSDSA ของเซิร์ฟเวอร์แค็ตตาล็อกส่วนกลาง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับกฎการจับคู่ดูไวยากรณ์ตัวกรองการค้นหา

โอ้ววเสียงนั่นสนุก!

ค่าอื่น ๆ สำหรับ bitmask:

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นโดยที่คุณควรมีข้อมูลมากพอที่จะม้วนGet-ADSiteOptionsCmdlet ของคุณเอง... ถ้าคุณต้องการให้ฉันเขียนหนึ่งสำหรับคุณฉันจะมีค่าใช้จ่ายที่เจียมเนื้อเจียมตัวมาก ... ;)

แก้ไข:นี่คือลิงก์ Microsoft, Repadmin for Expertsซึ่งรายละเอียดความแตกต่างระหว่างoptionsและคำsiteoptionsสั่งย่อยของ repadmin:

โดยใช้คำสั่งย่อย siteoptions เราสามารถเปลี่ยนคุณสมบัติตัวเลือกที่เก็บไว้ในวัตถุการตั้งค่าไซต์ NTDS

สำหรับบิตแมปนั้น? มันเป็นเอกสารหรือไม่? ไม่แน่ใจ. หากคุณสามารถบอกฉันได้FORCE_KCC_WHISTLER_BEHAVIORว่าในการสัมภาษณ์ฉันจะจ้างคุณอย่างไร คุณช่างเป็นการโชว์ตัว MDMarra ;)

ดังนั้นเพียงเพื่อสรุปผลoptionsแอตทริบิวต์บนCN=NTDS Settingsวัตถุสำหรับแต่ละตัวควบคุมโดเมนที่สอดคล้องกับตัวเลือก DC-เฉพาะกล่าวคือrepadmin <DC> /optionsในขณะที่optionsแอตทริบิวต์บนวัตถุในแต่ละสอดคล้องเว็บไซต์CN=NTDS Site Settingsrepadmin /siteoptions

ดังนั้นเพื่อตอบคำถามของคุณในที่สุด การรับตัวเลือกไซต์โดยเฉพาะไม่ใช่ตัวเลือก DC:

ForEach($Site In (Get-ADObject -Filter 'objectClass -eq "site"' -Searchbase (Get-ADRootDSE).ConfigurationNamingContext)) 
{ 
    Get-ADObject "CN=NTDS Site Settings,$($Site.DistinguishedName)" -Properties Options 
}

หากไม่มีการตั้งค่าตัวเลือกไซต์ Powershell จะไม่ส่งคืน คุณอาจทำให้รหัสข้างบนง่ายขึ้นเล็กน้อย แต่นั่นคือการใช้สำนวนที่คุณเริ่มต้นด้วย หลังจากค้นหามากเกินไปในที่สุดฉันก็พบเอกสารในตัวเลือกไซต์ bitmask :

ตัวเลือกเว็บไซต์ Bitmask

ดังนั้นIS_INTER_SITE_AUTO_TOPOLOGY_DISABLEDที่คุณให้เป็นตัวอย่างที่คุณต้องการจะมองหาค่า0x00000010สำหรับoptionsแอตทริบิวต์

ป้อนคำอธิบายรูปภาพที่นี่

และจากการใช้ตัวอย่าง Powershell:

ตัวเลือกไซต์ด้วย Powershell


แก้ไข # 2:ฉันเขียนบางสิ่งบางอย่างวันนี้:

#Require -Version 3
#Require -Module ActiveDirectory
Function Get-ADSiteOptions
{
<#
.SYNOPSIS
    This Cmdlet gets Active Directory Site Options.
.DESCRIPTION
    This Cmdlet gets Active Directory Site Options.
    We can fill out the rest of this comment-based help later.
.LINK
    http://myotherpcisacloud.com
.NOTES
    Written by Ryan Ries, October 2013. ryanries09@gmail.com.
#>
    [CmdletBinding()]
    Param()
    BEGIN
    {
        Set-StrictMode -Version Latest

        # This enum comes from NtDsAPI.h in the Windows SDK.
        # Also thanks to Jason Scott for pointing it out to me. http://serverfault.com/users/23067/jscott
        Add-Type -TypeDefinition @" 
                                   [System.Flags]
                                   public enum nTDSSiteSettingsFlags {
                                   NTDSSETTINGS_OPT_IS_AUTO_TOPOLOGY_DISABLED            = 0x00000001,
                                   NTDSSETTINGS_OPT_IS_TOPL_CLEANUP_DISABLED             = 0x00000002,
                                   NTDSSETTINGS_OPT_IS_TOPL_MIN_HOPS_DISABLED            = 0x00000004,
                                   NTDSSETTINGS_OPT_IS_TOPL_DETECT_STALE_DISABLED        = 0x00000008,
                                   NTDSSETTINGS_OPT_IS_INTER_SITE_AUTO_TOPOLOGY_DISABLED = 0x00000010,
                                   NTDSSETTINGS_OPT_IS_GROUP_CACHING_ENABLED             = 0x00000020,
                                   NTDSSETTINGS_OPT_FORCE_KCC_WHISTLER_BEHAVIOR          = 0x00000040,
                                   NTDSSETTINGS_OPT_FORCE_KCC_W2K_ELECTION               = 0x00000080,
                                   NTDSSETTINGS_OPT_IS_RAND_BH_SELECTION_DISABLED        = 0x00000100,
                                   NTDSSETTINGS_OPT_IS_SCHEDULE_HASHING_ENABLED          = 0x00000200,
                                   NTDSSETTINGS_OPT_IS_REDUNDANT_SERVER_TOPOLOGY_ENABLED = 0x00000400,
                                   NTDSSETTINGS_OPT_W2K3_IGNORE_SCHEDULES                = 0x00000800,
                                   NTDSSETTINGS_OPT_W2K3_BRIDGES_REQUIRED                = 0x00001000  }
"@
        ForEach($Site In (Get-ADObject -Filter 'objectClass -eq "site"' -Searchbase (Get-ADRootDSE).ConfigurationNamingContext)) 
        {            
            $SiteSettings = Get-ADObject "CN=NTDS Site Settings,$($Site.DistinguishedName)" -Properties Options
            If(!$SiteSettings.PSObject.Properties.Match('Options').Count -OR $SiteSettings.Options -EQ 0)
            {
                # I went with '(none)' here to give it a more classic repadmin.exe feel.
                # You could also go with $Null, or omit the property altogether for a more modern, Powershell feel.
                [PSCustomObject]@{SiteName=$Site.Name; DistinguishedName=$Site.DistinguishedName; SiteOptions='(none)'} 
            }
            Else
            {
                [PSCustomObject]@{SiteName=$Site.Name; DistinguishedName=$Site.DistinguishedName; SiteOptions=[Enum]::Parse('nTDSSiteSettingsFlags', $SiteSettings.Options)}
            }
        }
    }
}

และที่นี่มันมีการใช้งาน:

Get-ADSiteOptions


โพสต์ที่ยอดเยี่ยม!
Simon Catlin

1
วิสต์เลอร์เป็นชื่อรหัสสำหรับยุค XP / 2003 ของระบบปฏิบัติการ ฉันสันนิษฐานว่าFORCE_KCC_WHISTLER_BEHAVIORจะบังคับให้ KCC รุ่นที่ใหม่กว่าใช้ตัวเลือกและอัลกอริทึมในยุค 2003 เท่านั้น สำหรับส่วนที่เหลือของโพสต์ของคุณฉันคิดอย่างนั้น ขอบคุณสำหรับการยืนยัน
MDMarra

4
Re: แก้ไข # 2 - คุณจะแต่งงานกับฉันไหม
MDMarra

มันเป็นดาวโบรมีน
Ryan Ries

3

เอกสารที่กล่าวถึงโดยไรอันละเว้น 2 ตัวเลือก NTDSettings ที่จำเป็นเพื่อสนับสนุนการรวมกันทั้งหมด กรุณาหาค่าเหล่านั้นด้านล่างที่พบในntdsapi.h:

Add-Type -TypeDefinition @"
    [System.Flags]
    public enum nTDSSiteSettingsFlags {
    NTDSSETTINGS_OPT_IS_AUTO_TOPOLOGY_DISABLED = 0x00000001,
    NTDSSETTINGS_OPT_IS_TOPL_CLEANUP_DISABLED = 0x00000002,
    NTDSSETTINGS_OPT_IS_TOPL_MIN_HOPS_DISABLED = 0x00000004,
    NTDSSETTINGS_OPT_IS_TOPL_DETECT_STALE_DISABLED = 0x00000008,
    NTDSSETTINGS_OPT_IS_INTER_SITE_AUTO_TOPOLOGY_DISABLED = 0x00000010,
    NTDSSETTINGS_OPT_IS_GROUP_CACHING_ENABLED = 0x00000020,
    NTDSSETTINGS_OPT_FORCE_KCC_WHISTLER_BEHAVIOR = 0x00000040,
    NTDSSETTINGS_OPT_FORCE_KCC_W2K_ELECTIONn = 0x00000080,
    NTDSSETTINGS_OPT_IS_RAND_BH_SELECTION_DISABLED = 0x00000100,
    NTDSSETTINGS_OPT_IS_SCHEDULE_HASHING_ENABLED = 0x00000200,
    NTDSSETTINGS_OPT_IS_REDUNDANT_SERVER_TOPOLOGY_ENABLED = 0x00000400,
    NTDSSETTINGS_OPT_W2K3_IGNORE_SCHEDULES = 0x00000800,
    NTDSSETTINGS_OPT_W2K3_BRIDGES_REQUIRED = 0x00001000
    }
"@

และ

SiteOptions=[Enum]::Parse('nTDSSiteSettingsFlags', $SiteSettings.Options)

สามารถทำให้ง่ายขึ้นโดย

SiteOptions=[nTDSSiteSettingsFlags]$SiteSettings.Options

ขอบคุณสำหรับข้อมูลเพิ่มเติม ฉันรวมไว้ในสคริปต์ของฉัน
Ryan Ries
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.