Wykrywanie opcji witryny AD za pomocą programu PowerShell

9

Jak mogę użyć PowerShell, aby znaleźć opcje witryny AD, takie jak +IS_INTER_SITE_AUTO_TOPOLOGY_DISABLEDw PowerShell? Grałem z następującą komendą, ale nie mogę zmusić jej do wyplucia czegoś przydatnego.

Get-ADObject -Filter 'objectClass -eq "site"' -Searchbase (Get-ADRootDSE).ConfigurationNamingContext` -Properties options
MDMarra
źródło

Odpowiedzi:

17

Edycja nr 3: Aktualizacja dokumentacji referencyjnej.

Edycja nr 2: Edycja jeszcze raz, ponieważ napisałem coś w PS, aby zrobić dokładnie to, co próbujesz zrobić. Jest na dole.

Zamierzam śmiało stwierdzić, że obecnie nie ma na to sposobu Powershell Friendly (TM) . Ale oczywiście możesz nadal używać programu Powershell, aby zapytanie LDAP było konieczne, aby zobaczyć te opcje, jeśli naprawdę chcesz. Sprawdź optionsatrybut NTDS Settingsobiektu każdego serwera, który jest powiązany z witryną AD:

wprowadź opis zdjęcia tutaj

To jest dokładnie ten atrybut, który jest maską bitową, na której działa repadmin.exe. Repadmin.exe zawiera przyjazny kod tłumacza maski bitowej w swoim kodzie. Podobnie jak przystawka ADSIEdit MMC. Jednak trzeba będzie ponownie utworzyć tego translatora maski bitowej w programie Powershell.

Na przykład Repadmin /options <DC> [{+|-} IS_GC]jest poprawnym poleceniem, a teraz wiemy dokładnie, na którym bicie działa.

Oto relatywnie kiepska dokumentacja MSDN tego optionsatrybutu.

Lepsza dokumentacja MSDN dla optionsatrybutu.

Opcje Atrybut

Pole bitowe, w którym znaczenie bitów różni się w zależności od objectClass do objectClass. Może wystąpić w przypadku transportu między lokacjami, połączenia NTDS, NTDS-DSA, ustawień NTDS i obiektów Site-Link.

A oto przykład wyszukiwania opcji za pomocą oldskulowych operatorów reguł dopasowywania:

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

Ten filtr używa operatora reguły dopasowywania LDAP_MATCHING_RULE_BIT_AND (1.2.840.113556.1.4.803) w celu znalezienia obiektów nTDSDSA, które mają ustawiony bit niskiego rzędu w masce bitowej atrybutu options. Bit niskiego rzędu, który odpowiada stałej NTDSDSA_OPT_IS_GC zdefiniowanej w Ntdsapi.h, identyfikuje obiekt nTDSDSA serwera wykazu globalnego. Aby uzyskać więcej informacji o dopasowywaniu reguł, zobacz Składnia filtru wyszukiwania.

Och, chłopcze, to brzmi zabawnie!

Niektóre inne wartości dla maski bitowej:

wprowadź opis zdjęcia tutaj

Powinieneś więc mieć wystarczającą ilość informacji, aby rzucić własne Get-ADSiteOptionsCmdlet ... jeśli chcesz, żebym napisał jeden dla ciebie, zrobię to za bardzo skromną opłatą ...;)

Edycja: Oto link Microsoft, Repadmin dla Ekspertów , który szczegółowo przedstawia różnicę między optionsi siteoptionspodpoleceń z repadmin:

Używając podkomendy siteoptions, możemy zmienić atrybut options przechowywany w obiekcie ustawień witryny NTDS.

Co do tej bitmapy? Czy to w ogóle jest udokumentowane? Niepewny. Jeśli możesz mi powiedzieć, co FORCE_KCC_WHISTLER_BEHAVIORoznacza w wywiadzie, zatrudnię cię na miejscu. Jesteś taki popisowy, MDMarra. ;)

Podsumowując, optionsatrybut na CN=NTDS Settingsobiekcie dla każdego kontrolera domeny odpowiada opcjom specyficznym dla kontrolera domeny, tj. repadmin <DC> /optionsPodczas gdy optionsatrybut na CN=NTDS Site Settingsobiekcie w każdej witrynie odpowiada repadmin /siteoptions.

Tak, aby w końcu odpowiedzieć na twoje pytanie. Uzyskiwanie konkretnych opcji witryny, a nie opcji DC:

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

Jeśli nie ustawiono opcji witryny, PowerShell nie zwróci ich. Prawdopodobnie możesz trochę uprościć powyższy kod, ale używasz języka, z którym zacząłeś. Po zbyt wielu poszukiwaniach w końcu znalazłem dokumentację dotyczącą maski bitowej opcji strony :

Opcje strony Maska bitowa

Więc na IS_INTER_SITE_AUTO_TOPOLOGY_DISABLEDktóre dał jako przykład, chcesz być patrząc na wartości 0x00000010dla optionsatrybutu.

wprowadź opis zdjęcia tutaj

I od uruchomienia fragmentu PowerShell:

Opcje strony z Powershell


Edytuj # 2: Napisałem ci dzisiaj coś:

#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. [email protected].
#>
    [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)}
            }
        }
    }
}

I oto jest w akcji:

Get-ADSiteOptions

Ryan Ries
źródło
Fantastyczny post!
Simon Catlin
1
Whistler był kryptonimem epoki systemów operacyjnych XP / 2003. Zakładam, FORCE_KCC_WHISTLER_BEHAVIORże zmusi późniejsze wersje KCC do używania tylko opcji i algorytmów z 2003 roku. Co do reszty twojego postu, tak myślałem. Dziękuję za potwierdzenie.
MDMarra
4
Re: edytuj # 2 - Wyjdziesz za mnie?
MD Marra
To gwiazda z gwiazdami.
Ryan Ries
3

Dokumentacja wymieniona przez Ryana pomija 2 NTDSettings opcje niezbędne do obsługi wszystkich kombinacji. Poniżej znajdują się wartości znalezione w 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
    }
"@

I

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

można uprościć przez

SiteOptions=[nTDSSiteSettingsFlags]$SiteSettings.Options
Axel Limousin
źródło
Dziękujemy za dodatkowe informacje. Włączyłem to do mojego skryptu.
Ryan Ries