Erkennen von AD Site-Optionen mithilfe von PowerShell


9

Wie kann ich PowerShell verwenden, um AD-Site-Optionen wie +IS_INTER_SITE_AUTO_TOPOLOGY_DISABLEDin PowerShell zu finden? Ich habe mit dem folgenden Befehl herumgespielt, kann ihn aber nicht dazu bringen, etwas Nützliches auszuspucken.

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

Antworten:


17

Edit # 3: Aktualisieren der Referenzdokumentation.

Edit # 2: Noch einmal bearbeiten, weil ich etwas in PS geschrieben habe, um genau das zu tun, was Sie versuchen. Es ist ganz unten.

Ich werde weitermachen und behaupten, dass es derzeit keinen Powershell Friendly (tm) Weg gibt, dies zu tun. Natürlich können Sie Powershell auch weiterhin verwenden, um die LDAP-Abfrage erforderlich zu machen, damit diese Optionen angezeigt werden, wenn Sie dies wirklich möchten. Überprüfen Sie das optionsAttribut des NTDS SettingsObjekts jedes Servers, der einer AD-Site zugeordnet ist:

Geben Sie hier die Bildbeschreibung ein

Das ist das genaue Attribut, bei dem es sich um eine Bitmaske handelt, mit der repadmin.exe arbeitet. Repadmin.exe enthält einen benutzerfreundlichen Bitmaskenübersetzer in seinem Code. Ebenso wie das ADSIEdit MMC-Snap-In. Sie müssten diesen Bitmaskenübersetzer jedoch in Powershell neu erstellen.

Zum Beispiel Repadmin /options <DC> [{+|-} IS_GC]ist ein gültiger Befehl, und jetzt wissen wir genau, mit welchem ​​Bit er arbeitet.

Hier ist die relativ beschissene MSDN-Dokumentation zum optionsAttribut.

Bessere MSDN-Dokumentation zum optionsAttribut.

Optionsattribut

Ein Bitfeld, in dem die Bedeutung der Bits von Objektklasse zu Objektklasse variiert. Kann bei Inter-Site-Transport-, NTDS-Connection-, NTDS-DSA-, NTDS-Site-Settings- und Site-Link-Objekten auftreten.

Und hier ist ein Beispiel für die Suche nach Optionen mithilfe von Matching-Regeloperatoren der alten Schule:

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

Dieser Filter verwendet den Übereinstimmungsregeloperator LDAP_MATCHING_RULE_BIT_AND (1.2.840.113556.1.4.803), um nTDSDSA-Objekte zu finden, für die das Bit niedriger Ordnung in der Bitmaske des Optionsattributs festgelegt ist. Das niederwertige Bit, das der in Ntdsapi.h definierten Konstante NTDSDSA_OPT_IS_GC entspricht, identifiziert das nTDSDSA-Objekt eines globalen Katalogservers. Weitere Informationen zu Übereinstimmungsregeln finden Sie unter Suchfiltersyntax.

Oh Mann, hört sich das lustig an!

Einige andere Werte für die Bitmaske:

Geben Sie hier die Bildbeschreibung ein

Damit sollten Sie genug Informationen haben, um Ihr eigenes Get-ADSiteOptionsCmdlet zu rollen ... wenn Sie möchten, dass ich eines für Sie schreibe, werde ich es für eine sehr bescheidene Gebühr tun ...;)

Bearbeiten: Hier ist der Microsoft-Link Repadmin für Experten , der den Unterschied zwischen den Unterbefehlen repadmin optionsund siteoptionsbeschreibt:

Mithilfe des Unterbefehls siteoptions können wir das im NTDS-Site-Einstellungsobjekt gespeicherte Optionsattribut ändern.

Wie für diese Bitmap? Ist es überhaupt dokumentiert? Nicht sicher. Wenn Sie mir sagen können, was FORCE_KCC_WHISTLER_BEHAVIORin einem Interview bedeutet, werde ich Sie sofort einstellen. Du bist so ein Showoff, MDMarra. ;)

Zusammenfassend entspricht das optionsAttribut auf dem CN=NTDS SettingsObjekt für jeden Domänencontroller den DC-spezifischen Optionen, dh repadmin <DC> /options, während das optionsAttribut auf dem CN=NTDS Site SettingsObjekt unter jedem Standort entspricht repadmin /siteoptions.

Also, um endlich deine Frage zu beantworten. Erhalten spezifischer Site-Optionen, nicht DC-Optionen:

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

Wenn keine Site-Optionen festgelegt sind, gibt Powershell diese nicht zurück. Sie könnten den obigen Code wahrscheinlich ein wenig vereinfachen, aber das verwendet die Sprache, mit der Sie begonnen haben. Nachdem ich viel zu viel gesucht hatte, fand ich endlich die Dokumentation auf der Bitmask der Site-Optionen :

Site Options Bitmaske

Also für , IS_INTER_SITE_AUTO_TOPOLOGY_DISABLEDdass Sie als ein Beispiel gab, dann würden Sie für einen Wert von suchen 0x00000010für das optionsAttribut.

Geben Sie hier die Bildbeschreibung ein

Und vom Ausführen des Powershell-Snippets:

Site-Optionen mit Powershell


Edit # 2: Ich habe dir heute etwas geschrieben:

#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)}
            }
        }
    }
}

Und hier ist es in Aktion:

Get-ADSiteOptions


Ein fantastischer Beitrag!
Simon Catlin

1
Whistler war der Codename für die XP / 2003-Ära der Betriebssysteme. Ich gehe FORCE_KCC_WHISTLER_BEHAVIORdavon aus, dass spätere Versionen des KCC gezwungen werden werden, nur Optionen und Algorithmen aus dem Jahr 2003 zu verwenden. Was den Rest Ihres Beitrags betrifft, habe ich mir das gedacht. Danke für die Bestätigung.
MDMarra

4
Re: edit # 2 - Willst du mich heiraten?
MDMarra

Es ist eine sternenkreuzte Bromance.
Ryan Ries

3

In der von Ryan erwähnten Dokumentation fehlen 2 NTDSettings-Optionen, die zur Unterstützung aller Kombinationen erforderlich sind. Nachfolgend finden Sie die Werte in :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
    }
"@

Und

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

kann vereinfacht werden durch

SiteOptions=[nTDSSiteSettingsFlags]$SiteSettings.Options

Vielen Dank für die zusätzlichen Informationen. Ich habe es in mein Skript aufgenommen.
Ryan Ries
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.