Detección de opciones de sitio de AD mediante PowerShell

9

¿Cómo puedo usar PowerShell para encontrar opciones de sitios de AD como +IS_INTER_SITE_AUTO_TOPOLOGY_DISABLEDen PowerShell? He estado jugando con el siguiente comando, pero no consigo que escupe nada útil.

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

Respuestas:

17

Edición n. ° 3: Actualización de la documentación de referencia.

Edición n. ° 2: Edición una vez más porque escribí algo en PS para hacer exactamente lo que estás tratando de hacer. Está en el fondo.

Voy a seguir adelante y afirmar que no hay una forma de hacerlo Powershell Friendly (tm) en este momento. Pero, por supuesto, aún puede usar Powershell para hacer la consulta LDAP necesaria para ver estas opciones si realmente lo desea. Consulte el optionsatributo del NTDS Settingsobjeto de cada servidor que está asociado a un sitio de AD:

ingrese la descripción de la imagen aquí

Ese es el atributo exacto, que es una máscara de bits, en el que repadmin.exe funciona. Repadmin.exe contiene un amigable traductor de máscara de bits en su código. Al igual que el complemento ADSIEdit MMC. Sin embargo, necesitaría recrear ese traductor de máscara de bits en Powershell.

Por ejemplo, Repadmin /options <DC> [{+|-} IS_GC]es un comando válido, y ahora sabemos exactamente en qué bit opera.

Aquí está la documentación relativamente mala de MSDN sobre el optionsatributo.

Mejor documentación de MSDN sobre el optionsatributo.

Atributo de opciones

Un campo de bits, donde el significado de los bits varía de objectClass a objectClass. Puede ocurrir en Inter-Site-Transport, NTDS-Connection, NTDS-DSA, NTDS-Site-Settings y Site-Link.

Y aquí hay un ejemplo de búsqueda de opciones utilizando operadores de reglas de coincidencia de la vieja escuela:

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

Este filtro utiliza el operador de regla de coincidencia LDAP_MATCHING_RULE_BIT_AND (1.2.840.113556.1.4.803) para buscar objetos nTDSDSA que tengan el bit de orden inferior establecido en la máscara de bits del atributo de opciones. El bit de orden inferior, que corresponde a la constante NTDSDSA_OPT_IS_GC definida en Ntdsapi.h, identifica el objeto nTDSDSA de un servidor del Catálogo global. Para obtener más información acerca de las reglas coincidentes, consulte Búsqueda de sintaxis de filtro.

¡Oh, chico, eso suena divertido!

Algunos otros valores para la máscara de bits:

ingrese la descripción de la imagen aquí

Entonces con eso deberías tener suficiente información para tirar tu propio Get-ADSiteOptionsCmdlet ... si quieres que te escriba uno, lo haré, por una tarifa muy modesta ...;)

Editar: Aquí está el enlace de Microsoft, Repadmin for Experts , que detalla la diferencia entre optionsy los siteoptionssubcomandos de repadmin:

Al usar el subcomando siteoptions, podríamos cambiar el atributo de opciones almacenado en el Objeto de configuración del sitio NTDS.

¿En cuanto a ese mapa de bits? ¿Está incluso documentado? No estoy seguro. Si puede decirme qué FORCE_KCC_WHISTLER_BEHAVIORsignifica en una entrevista, lo contrataré en el acto. Eres un presumido, MDMarra. ;)

Para resumir, el optionsatributo en el CN=NTDS Settingsobjeto para cada controlador de dominio corresponde a las opciones específicas de DC, es decir repadmin <DC> /options, mientras que el optionsatributo en el CN=NTDS Site Settingsobjeto debajo de cada sitio corresponde repadmin /siteoptions.

Entonces, para finalmente responder a tu pregunta. Obteniendo específicamente opciones de sitio, no opciones de DC:

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

Si no hay opciones de sitio establecidas, Powershell no las devolverá. Probablemente podría simplificar un poco el código anterior, pero eso es usar el lenguaje con el que comenzó. Después de buscar demasiado, finalmente encontré la documentación en la máscara de bits de opciones del sitio :

Opciones de sitio de máscara de bits

Entonces, para IS_INTER_SITE_AUTO_TOPOLOGY_DISABLEDeso que dio como ejemplo, estaría buscando un valor 0x00000010para el optionsatributo.

ingrese la descripción de la imagen aquí

Y de ejecutar el fragmento Powershell:

Opciones de sitio con Powershell


Edición n.º 2: hoy te escribí algo:

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

Y aquí está en acción:

Get-ADSiteOptions

Ryan Ries
fuente
¡Una publicación fantástica!
Simon Catlin
1
Whistler era el nombre en clave para la era XP / 2003 de los sistemas operativos. Supongo FORCE_KCC_WHISTLER_BEHAVIORque obligará a las versiones posteriores del KCC a usar solo opciones y algoritmos de la era 2003. En cuanto al resto de tu publicación, creo que sí. Gracias por confirmar.
MDMarra
44
Re: edit # 2 - ¿Te casarías conmigo?
MDMarra
Es un bromance estrellado.
Ryan Ries
3

La documentación mencionada por Ryan omite 2 opciones de NTDSettings necesarias para admitir todas las combinaciones. A continuación encontrará los valores encontrados en 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
    }
"@

Y

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

puede ser simplificado por

SiteOptions=[nTDSSiteSettingsFlags]$SiteSettings.Options
Axel Limousin
fuente
Gracias por la información adicional. Lo he incorporado a mi guión.
Ryan Ries