Détection des options de site AD à l'aide de PowerShell

9

Comment puis-je utiliser PowerShell pour trouver des options de site AD comme +IS_INTER_SITE_AUTO_TOPOLOGY_DISABLEDdans PowerShell? J'ai joué avec la commande suivante, mais je n'arrive pas à faire cracher quoi que ce soit d'utile.

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

Réponses:

17

Edit # 3: Mise à jour de la documentation de référence.

Edit # 2: Editing une fois de plus parce que j'ai écrit quelque chose dans PS pour faire exactement ce que vous essayez de faire. C'est en bas.

Je vais aller de l'avant et affirmer qu'il n'y a pas de façon de faire Powershell Friendly (tm) pour le moment. Mais bien sûr, vous pouvez toujours utiliser Powershell pour rendre la requête LDAP nécessaire pour voir ces options si vous le souhaitez vraiment. Découvrez l' optionsattribut de l' NTDS Settingsobjet de chaque serveur associé à un site AD:

entrez la description de l'image ici

Il s'agit de l'attribut exact, qui est un masque de bits, sur lequel repadmin.exe fonctionne. Repadmin.exe contient un traducteur de masque de bits convivial dans son code. Tout comme le composant logiciel enfichable MMC ADSIEdit. Cependant, vous devrez recréer ce traducteur de masque de bits dans Powershell.

Par exemple, Repadmin /options <DC> [{+|-} IS_GC]est une commande valide, et maintenant nous savons exactement quel bit sur lequel elle opère.

Voici la documentation MSDN relativement merdique sur l' optionsattribut.

Meilleure documentation MSDN sur l' optionsattribut.

Attribut d'options

Un champ de bits, où la signification des bits varie de objectClass à objectClass. Peut se produire sur le transport inter-sites, la connexion NTDS, NTDS-DSA, NTDS-Site-Settings et les objets Site-Link.

Et voici un exemple de recherche d'options à l'aide d'opérateurs de règles de correspondance à l'ancienne:

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

Ce filtre utilise l'opérateur de règle de correspondance LDAP_MATCHING_RULE_BIT_AND (1.2.840.113556.1.4.803) pour rechercher des objets nTDSDSA dont le bit de poids faible est défini dans le masque de bits de l'attribut options. Le bit de poids faible, qui correspond à la constante NTDSDSA_OPT_IS_GC définie dans Ntdsapi.h, identifie l'objet nTDSDSA d'un serveur de catalogue global. Pour plus d'informations sur les règles de correspondance, voir Syntaxe du filtre de recherche.

Oh mon garçon, ça a l'air amusant!

Quelques autres valeurs pour le masque de bits:

entrez la description de l'image ici

Donc, avec cela, vous devriez avoir suffisamment d'informations pour rouler votre propre Get-ADSiteOptionsCmdlet ... si vous voulez que j'en écrive un pour vous, je le ferai, pour une somme très modique ...;)

Edit: Voici le lien Microsoft, Repadmin for Experts , qui détaille la différence entre les sous options- siteoptionscommandes et de repadmin:

En utilisant la sous-commande siteoptions, nous pourrions changer l'attribut d'options stocké sur l'objet Paramètres de site NTDS.

Quant à ce bitmap? Est-il même documenté? Pas certain. Si vous pouvez me dire ce que FORCE_KCC_WHISTLER_BEHAVIORsignifie dans une interview, je vous embaucherai sur place. Vous êtes une telle démonstration, MDMarra. ;)

Donc, pour résumer, l' optionsattribut sur l' CN=NTDS Settingsobjet pour chaque contrôleur de domaine correspond aux options spécifiques au DC, c'est-à-dire repadmin <DC> /options, tandis que l' optionsattribut sur l' CN=NTDS Site Settingsobjet sous chaque site correspond repadmin /siteoptions.

Donc, pour enfin répondre à votre question. Obtenir spécifiquement des options de site, pas des options 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 aucune option de site n'est définie, Powershell ne les renvoie pas. Vous pourriez probablement simplifier un peu le code ci-dessus, mais cela utilise le langage avec lequel vous avez commencé. Après beaucoup trop de recherches, j'ai finalement trouvé la documentation sur le bitmask des options du site :

Options du site Bitmask

Donc, pour IS_INTER_SITE_AUTO_TOPOLOGY_DISABLEDcela que vous avez donné comme exemple, vous recherchez une valeur de 0x00000010pour l' optionsattribut.

entrez la description de l'image ici

Et en exécutant l'extrait Powershell:

Options de site avec Powershell


Edit # 2: Je vous ai écrit quelque chose aujourd'hui:

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

Et le voici en action:

Get-ADSiteOptions

Ryan Ries
la source
Un poste fantastique!
Simon Catlin du
1
Whistler était le nom de code de l'ère XP / 2003 des systèmes d'exploitation. Je suppose que FORCE_KCC_WHISTLER_BEHAVIORles versions ultérieures du KCC forceront à n'utiliser que les options et algorithmes de l'ère 2003. Quant au reste de votre message, je le pensais. Merci d'avoir confirmé.
MDMarra
4
Re: edit # 2 - Veux-tu m'épouser?
MDMarra
C'est une bromance étoilée.
Ryan Ries
3

La documentation mentionnée par Ryan omet 2 options NTDSettings nécessaires pour prendre en charge toutes les combinaisons. Veuillez trouver ci-dessous les valeurs trouvées dans 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
    }
"@

Et

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

peut être simplifié par

SiteOptions=[nTDSSiteSettingsFlags]$SiteSettings.Options
Axel Limousin
la source
Nous vous remercions de l'information supplémentaire. Je l'ai intégré à mon script.
Ryan Ries