Get-ADUser gebruiken om verschillende informatie over AD-domeingebruikers te krijgen. Hoe u een lijst kunt krijgen met geselecteerde AD-groepen waarvan een grote lijst met gebruikers lid is

Wordt gebruikt om directory-objecten te maken, wijzigen en verwijderen. De gebruiker kan ook de opdracht gebruiken ldifde om het schema uit te breiden, gebruikers- en groepsgegevens van Active Directory te exporteren naar andere toepassingen of services, en de ADAM-service (Active Directory Application Mode) te vullen met gegevens van andere directoryservices.

Syntaxis

ldifde [-i] [-F bestandsnaam] [-S server naam] [-C lijn1 lijn2] [-v] [-J pad] [-T poortnummer] [-D basis_DN] [-R ldap_filter] [-P regio] [-l LDAP_kenmerk_lijst] [-O LDAP_kenmerk_lijst] [-G] [-M] [-N] [-k] [-A ] [-B ] [-? ]

Opties

-i Specificeert de importmodus. Als de parameter niet is gedefinieerd, wordt standaard de exportmodus gebruikt. -Fbestandsnaam Specificeert de naam van het import- of exportbestand. -Sserver naam Specificeert de computer waarop de import- of exportbewerking moet worden uitgevoerd. Standaardprogramma ldifde zal draaien op de computer waar ldifde geïnstalleerd. -Clijn1 lijn2 Vervangt alle voorkomens lijnen1 inhoud lijnen2. Meestal gebruikt wanneer u gegevens van het ene domein naar het andere importeert en de DN-naam van het exporterende domein moet vervangen ( lijn 1), domeinnaam importeren ( lijn 2). -v Schakelt de uitgebreide logmodus in. -Jpad Specificeert de locatie van het logbestand. De standaardwaarde is het huidige pad. -Tpoortnummer Specificeert het LDAP-poortnummer (Lightweight Directory Access Protocol). De standaardwaarde is LDAP-poort 389. De globale cataloguspoort is 3268. -Dbasis_DN Specificeert de DN-naam van de zoekbasis om gegevens te exporteren. -RLDAP-filter Maakt een LDAP-zoekfilter voor gegevensexport. Het volgende filter exporteert bijvoorbeeld alle gebruikers met een bepaalde middelste naam: csvde -r (en (objectClass=Gebruiker)(sn=Achternaam)) -Pregio Specificeert het bereik van de zoekopdracht. De zoekbereikparameters zijn Baseren, Een niveau En onderboom. -lLDAP_kenmerk_lijst Specificeert een lijst met attributen die worden geretourneerd in de resultaten van een exportquery. Als deze parameter wordt weggelaten, worden alle kenmerken geretourneerd. -OLDAP_kenmerk_lijst Specificeert een lijst met kenmerken die moeten worden weggelaten uit de resultaten van de exportquery. Deze optie wordt meestal gebruikt bij het exporteren van objecten uit Active Directory en deze vervolgens importeren in een andere LDAP-compatibele directory. Als attributen niet worden ondersteund door een andere map, kunnen ze met deze optie worden uitgesloten van de resultatenset. -G Exclusief gepagineerde zoekopdrachten. -M Laat attributen weg die niet kunnen worden geschreven, zoals ObjectGUID En objectSID. -N Laat de export van binaire waarden weg. -k Negeert fouten tijdens de importbewerking en gaat door met verwerken. Het volgende is een volledige lijst met genegeerde fouten:

  • het object is al lid van de groep;
  • objectklasse-overtreding (wat betekent dat de opgegeven objectklasse niet bestaat) als het geïmporteerde object geen andere attributen heeft;
  • het object bestaat al;
  • schending van beperkingen;
  • het attribuut of de waarde bestaat al;
  • zo'n object bestaat niet.
-Agebruikersnaam onderscheiden_naam wachtwoord Hiermee geeft u op dat de opdracht moet worden uitgevoerd met behulp van het opgegeven gebruikersnaam onderscheiden_naam En wachtwoord -B. -Bgebruikersnaam domein wachtwoord Specificeert een opdracht die moet worden uitgevoerd met behulp van het opgegeven gebruikersnaam, domein en wachtwoord. Standaard wordt de opdracht uitgevoerd met de inloggegevens van de gebruiker die momenteel is aangemeld bij het netwerk. Kan niet worden gebruikt met parameter -A. -? Geeft een menu met opdrachten weer.

Opmerkingen

  • Met parameters -C je kunt constanten gebruiken #schemaNamingContext En #configuratieNamingContext in plaats van de DN-namen van de schemadirectorysectie en de configuratiedirectorysectie.
  • Bij het maken van een importbestand voor een opdracht ldifde, gebruik de waarde van type veranderen om het type wijzigingen in het importbestand te bepalen. Waarden van type veranderen weergegeven in onderstaande tabel.

Het volgende is een voorbeeld van een LDIF-indeling LDAP-importbestand dat de waarde gebruikt toevoegen:
DN: CN=geselecteerde_gebruiker,DC=domeinnaam
van type veranderen: toevoegen
CN: geselecteerde_gebruiker
beschrijving:bestandsomschrijving
objectklasse: gebruiker
objectklasse: geselecteerde_gebruiker

Voorbeelden

Om alleen de DN-naam, algemene naam, voornaam, achternaam en telefoonnummer van de geretourneerde objecten te extraheren, typt u:
-l uitgesproken naam, CN, Naam, SN, telefoon
Om de globally unique identifier (GUID) voor een object uit te sluiten, typt u:
-O wanneer_gemaakt, wanneer_gewijzigd, object-GUID

Scripts voor het ontladen van alle gebruikers uit MS Active Directory (ITGC)

Ivan Piskunov

Een van de standaard auditprocedures ITGC voor catalogus Active Directory is om een ​​download van alle domeingebruikers te krijgen. Op basis van de verkregen gegevens worden testprocedures verder vormgegeven, bijvoorbeeld het bestuderen van de lijst met beheerders of het identificeren van gebruikers met een verlopen wachtwoord. De meest efficiënte manier om zo'n ontlading te genereren is door gebruik te maken van de standaardinterface PowerShell , waarvan we voorbeelden in dit artikel zullen bespreken.

1. Snel uploaden via PowerShell-script

Hieronder staat een PowerShell-script, als een van de gemakkelijkste en snelste manieren om een ​​lijst van alle gebruikers van een AD-domein in CSV-formaat te krijgen, die zonder problemen door dezelfde Excel kan worden geopend.

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = "LDAP://ou=Users,ou=Departmets,dc=test,dc=en" $objSearcher.Filter = "(&(objectCategory=person) (!userAccountControl:1.2.840.113556.1.4.803:=2))" $users = $objSearcher.FindAll() # Aantal accounts $users.Count $users | ForEach-Object ($user = $_.Properties New-Object PsObject -Property @( Titel = $user.description Afdeling = $user.department Login = $user.userprincipalname Telefoon = $user.telephonenumber Kamer = $user.physicaldeliveryofficename Naam = $gebruiker.cn ) ) | Exporteren-Csv -NoClobber -Codering utf8 -Pad C: lijst_domein_gebruikers.csv

Om het script op uw systeem te laten werken, moet u het enigszins corrigeren, namelijk de benodigde parameters invoeren, d.w.z. zoals in dit voorbeeld zijn dit de parameters Gebruikers in de divisie Afdelingen in het domein Test.ru. Geef ook het pad op naar de locatie waar het bestand is opgeslagen. lijst_domein_gebruikers.csv

Na het uitladen, indien direct open lijst_domein_gebruikers.csv , zal er in een onleesbare vorm uitzien, maar met behulp van standaardtools kunnen we het gemakkelijk in het formaat brengen dat we nodig hebben. Excel openen lijst_domein_gebruikers.csv , selecteer de eerste kolom, ga dan naar het tabblad "Gegevens" en klik op "Tekst per kolom". Selecteer Gescheiden en klik op Volgende. Klaar!

!Opmerking dat dit script niet meer dan 1000 gebruikers zal weergeven. Het is best geschikt voor een klein bedrijf, maar degenen die een groot aantal gebruikers in het domein hebben, moeten hun toevlucht nemen tot de hieronder beschreven methoden.

2. Geavanceerde PowerShell-cmdlet om downloads van Active Directory-gebruikers op te halen

Met de Active Directory Module voor Windows PowerShell-tool (geïntroduceerd in Windows Server 2008 R2 en hoger) kunt u cmdlets maken die verschillende bewerkingen uitvoeren met AD-directory-objecten. Gebruik de cmdlet om informatie over gebruikers en hun eigenschappen te krijgen Get-ADUser.

Beginnen start een Powershell-venster met beheerdersrechten en importeer de Active Directory-module voor verdere actie:
Import-Module active directory

Naar maak een lijst van alle domeinaccounts en voer de opdracht uit:

Get-ADUser-filter *

Naar volledige informatie weergeven over alle beschikbare attributen gebruiker tuser, voer de opdracht uit

Get-ADUser -identiteit tuser -properties *


We zijn bijvoorbeeld geïnteresseerd in informatie over wachtwoord wijzigen datum en tijd waarop het verloopt . Het resultaat van de uitvoering van de opdracht kan worden geëxporteerd naar een tekstbestand:

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Naam, PasswordExpired, PasswordLastSet, PasswordNeverExpires > C:tempusers.txt

Of meteen uploaden naar CSV , die later gemakkelijk naar Excel zal worden geëxporteerd (bovendien zullen we met behulp van sort-object de tabel sorteren op de kolom PasswordLastSet en ook een where-voorwaarde toevoegen - de gebruikersnaam moet de tekenreeks "Dmitry" bevatten)

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | waar ($_.naam –zoals "*Dmitry*") | sort-object PasswordLastSet | select-object Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires | Export-csv -path c:tempuser-password-expires-2015.csv

Toegewijd aan het gebruik van PowerShell om AD te beheren. Als uitgangspunt besloot de auteur om 10 typische AD-beheertaken te nemen en te kijken hoe deze kunnen worden vereenvoudigd met behulp van PowerShell:

  1. Stel het gebruikerswachtwoord opnieuw in
  2. Accounts activeren en deactiveren
  3. Ontgrendel gebruikersaccount
  4. Verwijder je account
  5. Zoek lege groepen
  6. Voeg gebruikers toe aan een groep
  7. Maak een lijst van groepsleden
  8. Vind verouderde computeraccounts
  9. Computeraccount deactiveren
  10. Zoek computers op type

Daarnaast houdt de auteur een blog bij (uiteraard op PowerShell), we raden aan om een ​​kijkje te nemen - jdhitsolutions.com/blog. En het meest up-to-date dat je kunt krijgen van zijn twitter twitter.com/jeffhicks.
Dus hieronder is de vertaling van het artikel "Top 10 Active Directory-taken opgelost met PowerShell".

Active Directory (AD) beheren met Windows PowerShell is eenvoudiger dan u denkt, en ik wil het u bewijzen. U kunt eenvoudig de onderstaande scripts nemen en ze gebruiken om een ​​aantal AD-beheertaken op te lossen.

Vereisten

Om PowerShell te gebruiken om AD te beheren, moet aan een aantal vereisten worden voldaan. Ik ga demonstreren hoe AD-cmdlets werken op een voorbeeld van een Windows 7-machine.
Om de cmdlets te gebruiken, moet u een Windows Server 2008 R2-domeincontroller hebben, of u kunt de Active Directory Management Gateway Service downloaden en installeren op verouderde DC's. Lees de documentatie zorgvuldig door voor installatie; Opnieuw opstarten is vereist.
Download en installeer (RSAT) aan de clientzijde voor Windows 7 of Windows 8. In Windows 7 moet u openen Controle panelen hoofdstuk Programma's en kies Windows-onderdelen in-of uitschakelen. Vinden Beheerprogramma's voor externe servers en vouw de sectie uit Tools voor rolbeheer. Selecteer geschikte items voor AD DS en AD LDS Tools, let er vooral op dat het item moet worden geselecteerd Active Directory-module voor Windows PowerShell, zoals weergegeven in figuur 1. (In Windows 8 zijn alle tools standaard geselecteerd). Nu zijn we klaar om te werken.

Afbeelding 1 AD DS- en AD LDS-tools inschakelen

Ik ben ingelogd met een account met domeinbeheerdersrechten. Bij de meeste cmdlets die ik u laat zien, kunt u alternatieve inloggegevens opgeven. Ik raad in ieder geval aan om de help ( Hulp krijgen) en voorbeelden die ik hieronder zal demonstreren.
Start een PowerShell-sessie en importeer de module:

PS C:\>Import-module ActiveDirectory

De import maakt een nieuwe PSDrive aan, maar die gaan we niet gebruiken. U kunt echter wel zien welke opdrachten er in de geïmporteerde module staan.

PS C:\> get-command -module ActiveDirectory

Het mooie van deze opdrachten is dat als ik een opdracht voor één AD-object kan gebruiken, deze voor 10, 100 en zelfs 1000 kan worden gebruikt. Laten we eens kijken hoe sommige van deze cmdlets werken.

Taak 1: Gebruikerswachtwoord resetten

Laten we beginnen met een typische taak: het wachtwoord van een gebruiker opnieuw instellen. U kunt dit eenvoudig en eenvoudig doen via de cmdlet Set-ADAccountPassword. Het lastige is dat het nieuwe wachtwoord moet worden gekwalificeerd als een veilige tekenreeks: een stuk tekst dat wordt versleuteld en in het geheugen wordt opgeslagen voor de duur van de PowerShell-sessie. Laten we eerst een variabele maken met een nieuw wachtwoord:
PS C:\> $new=Read-Host "Voer het nieuwe wachtwoord in" -AsSecureString

Voer vervolgens een nieuw wachtwoord in:

Nu kunnen we het account extraheren (met behulp van samAccountnaam is de beste optie) en stel een nieuw wachtwoord in. Hier is een voorbeeld voor gebruiker Jack Frost:

PS C:\> Set-ADAccountPassword jfrost -NewPassword $new

Helaas is er een bug met deze cmdlet: -doorgang, -wat als, En -Bevestigen werkt niet. Als je de voorkeur geeft aan de snelkoppeling, probeer dan het volgende:

PS C:\>Set-ADAccountPassword jfrost -NewPassword(ConvertTo-SecureString -AsPlainText -String" [e-mail beveiligd]"-kracht)

Uiteindelijk heb ik Jack nodig om zijn wachtwoord te wijzigen de volgende keer dat ik inlog, en ik werk het account bij met Set-ADUser.

PS C:\> Set-ADUser jfrost -ChangePasswordAtLogon $True

De resultaten van de uitvoering van de cmdlet worden niet naar de console geschreven. Als het nodig is, gebruik dan -WAAR. Maar ik kan erachter komen of de bewerking succesvol was of niet door de gebruikersnaam te extraheren met behulp van de cmdlet Get-ADUser en het specificeren van de eigenschap WachtwoordVerlopen zoals getoond in figuur 2.


Rijst. 2. Resultaten van de Get-ADUser-cmdlet met de eigenschap PasswordExpired

Kort gezegd: het opnieuw instellen van het wachtwoord van een gebruiker met PowerShell is helemaal niet moeilijk. Ik moet bekennen dat het resetten van het wachtwoord ook gemakkelijk is in een handomdraai. Active Directory-gebruikers en computers consoles Microsoft Management Console (MMC). Maar het gebruik van PowerShell is prima als u een taak moet delegeren, de bovengenoemde module niet wilt implementeren of uw wachtwoord opnieuw wilt instellen als onderdeel van een groot geautomatiseerd IT-proces.

Taak 2: Accounts activeren en deactiveren

Laten we nu het account deactiveren. We blijven samenwerken met Jack Frost. Deze code gebruikt de parameter -wat als, die u mogelijk ziet in andere cmdlets die wijzigingen aanbrengen om mijn opdracht te testen zonder deze uit te voeren.

PS C:\> Uitschakelen-ADAccount jfrost -whatif Wat als: Operatie "Set" uitvoeren op doel "CN=Jack Frost, OU=staff,OU=Testing,DC=GLOBOMANTICS,DC=local".

En laten we nu echt deactiveren:

PS C:\> Uitschakelen-ADAccount jfrost

En welke cmdlet zal ons helpen wanneer het tijd is om het account te activeren?

PS C:\> Activeer-ADAccount jfrost

Deze cmdlets kunnen worden gebruikt in een pijplijnexpressie, zodat u zoveel accounts kunt activeren of deactiveren als u wilt. Deze code deactiveert bijvoorbeeld alle accounts op de verkoopafdeling (Sales)

PS C:\> get-aduser -filter "afdeling -eq "verkoop"" | uitschakelen-adaccount

Natuurlijk, het schrijven van een filter voor Get-ADUser nogal ingewikkeld, maar dit is waar het gebruik van de parameter -wat als samen met de cmdlet ADAaccount uitschakelen komt te hulp.

Taak 3: ontgrendel het gebruikersaccount

Denk aan een situatie waarin Jack zijn account heeft geblokkeerd terwijl hij probeerde een nieuw wachtwoord in te voeren. In plaats van te proberen zijn account te vinden via de GUI, kan de ontgrendelingsprocedure worden uitgevoerd met een eenvoudige opdracht.

PS C:\> Ontgrendel-ADAaccount jfrost

De cmdlet ondersteunt ook parameters -wat als En -Bevestigen.

Taak 4: account verwijderen

Het maakt niet uit hoeveel gebruikers u verwijdert - het is eenvoudig te doen met een cmdlet Verwijder-ADUser. Ik wil Jack Frost niet verwijderen, maar als ik zou willen, zou ik deze code gebruiken:

PS C:\> Remove-ADUser jfrost -whatif Wat als: bewerking "Verwijderen" uitvoeren op doel "CN=Jack Frost,OU=staff,OU=Testing,DC=GLOBOMANTICS,DC=local".

Of ik kan meerdere gebruikers invoeren en verwijderen met één simpele opdracht:

PS C:\> get-aduser -filter "enabled -eq "false"" -property WhenChanged -SearchBase "OU=Werknemers, DC=Globomantics,DC=Local" | waar ($_.WhenChanged -le (Get-Date).AddDays(-180)) | Verwijder-ADuser -whatif

Met deze opdracht worden alle gedeactiveerde Employees OU-accounts gevonden en verwijderd die 180 dagen of langer niet zijn gewijzigd.

Taak 5: Lege groepen zoeken

Groepsmanagement is een eindeloze en ondankbare taak. Er zijn veel manieren om lege groepen te vinden. Sommige uitdrukkingen werken mogelijk beter dan andere, afhankelijk van uw organisatie. De onderstaande code vindt alle groepen in het domein, inclusief ingebouwde groepen.

PS C:\> get-adgroup -filter * | waar (-Not ($_ | get-adgroupmember)) | selecteer naam

Als je groepen hebt met honderden leden, kan het gebruik van deze opdracht lang duren; Get-ADGroupMember controleert elke groep. Als u kunt beperken of aanpassen, zal het beter zijn.
Hier is een andere benadering:

PS C:\> get-adgroup -filter "members -notlike "*" -AND GroupScope -eq "Universal"" -SearchBase "OU=Groups,OU=Employees,DC=Globomantics, DC=local" | Selecteer naam, groep*

Met deze opdracht worden alle Universal-groepen gezocht die geen lid zijn van een OE-groep en worden enkele eigenschappen afgedrukt. Het resultaat wordt getoond in figuur 3.


Rijst. 3. Zoek en filter universele groepen

Taak 6: Gebruikers toevoegen aan een groep

Laten we Jack Frost toevoegen aan de Chicago IT-groep:

PS C:\> add-adgroupmember "chicago IT" -Leden jfrost

Ja, zo simpel is het. Je kunt ook gemakkelijk honderden gebruikers aan groepen toevoegen, hoewel het naar mijn mening een beetje onhandig is:

PS C:\> Add-ADGroupMember "Chicago Employees" -member (get-aduser -filter "city -eq "Chicago"")

Ik heb de pijplijnuitdrukking tussen haakjes gebruikt om alle gebruikers te vinden die een City-eigendom in Chicago hebben. De code tussen haakjes wordt uitgevoerd en de resulterende objecten worden doorgegeven aan de parameter –Member. Elk gebruikersobject wordt toegevoegd aan de Chicago Employees-groep. Het maakt niet uit of we te maken hebben met 5 of 5000 gebruikers, het duurt maar een paar seconden om groepslidmaatschappen bij te werken. Deze uitdrukking kan ook worden geschreven met Voor elk object wat misschien handiger is:

PS C:\> Get-ADUser -filter "city -eq "Chicago"" | foreach(Add-ADGroupMember "Chicago Employees" -Member $_)

Taak 7: een lijst met groepsleden weergeven

Misschien wilt u weten wie er in een bepaalde groep zit. U moet bijvoorbeeld regelmatig controleren wie er in de groep Domeinadministrators zit:

PS C:\> Get-ADGroupMember "Domeinbeheerders"

Figuur 4 toont het resultaat.


Rijst. 4. Leden van de groep Domeinadministrators

De cmdlet voert een AD-object uit voor elk groepslid. Hoe zit het met geneste groepen? Mijn Chicago All Users-groep is een verzameling geneste groepen. Om een ​​lijst van alle accounts te krijgen, hoef ik alleen maar de parameter te gebruiken –Recursief.

PS C:\> Get-ADGroupMember "Chicago Alle gebruikers" -Recursief | Selecteer DistinguishedName

Als je de andere kant op wilt - om te zien tot welke groepen de gebruiker behoort - gebruik dan de gebruikerseigenschap Lid van:

PS C:\> get-aduser jfrost -property Lid van | Selecteer -ExpandProperty memberOf CN=NewTest,OU=Groups,OU=Employees, DC=GLOBOMANTICS,DC=local CN=Chicago Test,OU=Groups,OU=Employees, DC=GLOBOMANTICS,DC=local CN=Chicago IT,OU= Groepen,OU=Werknemers, DC=GLOBOMANTICS,DC=lokaal CN=Chicago Verkoopgebruikers,OU=Groepen,OU=Werknemers, DC=GLOBOMANTICS,DC=lokaal

Ik heb de parameter gebruikt -Eigendom uitvouwen om de namen weer te geven Lid van zoals snaren.

Taak 8: vind verouderde computeraccounts

Ik krijg vaak de vraag: “Hoe vind ik verouderde computeraccounts?”. En ik antwoord altijd: "Wat is voor jou achterhaald?" Bedrijven verschillen in hun definitie van wanneer een computeraccount (of gebruikersaccount, wat dan ook) als verouderd en niet langer bruikbaar wordt beschouwd. Wat mij betreft, ik let op die accounts waarvan de wachtwoorden gedurende een bepaalde periode niet zijn gewijzigd. Deze periode is voor mij 90 dagen - als de computer het wachtwoord en het domein gedurende deze periode niet heeft gewijzigd, is deze hoogstwaarschijnlijk offline en verouderd. Cmdlet gebruikt Get-ADComputer:

PS C:\> get-adcomputer -filter "Passwordlastset -lt "1/1/2012"" -properties *| Selecteer naam, wachtwoord laatste set

Het filter werkt uitstekend met een harde waarde, maar deze code wordt bijgewerkt voor alle computeraccounts waarvan het wachtwoord sinds 1 januari 2012 niet is gewijzigd. De resultaten worden weergegeven in figuur 5.


Rijst. 5. Vind verouderde computeraccounts

Of stel dat u zich op zijn minst op het domeinfunctionaliteitsniveau van Windows 2003 bevindt. Filter op eigenschap LastLogontimeStamp. Deze waarde is het aantal intervallen van 100 nanoseconden sinds 1 januari 1601 en is opgeslagen in GMT, dus het werken met deze waarde is een beetje lastig:

PS C:\> get-adcomputer -filter "LastlogonTimestamp -gt 0" -properties * | selecteer naam,lastlogontimestamp, @(Name="LastLogon";Expressie=(::FromFileTime ($_.Lastlogontimestamp))),wachtwoordlastset | SortLastLogonTimeStamp


Rijst. 6. Converteer de LastLogonTimeStamp-waarde naar de bekende indeling

Om een ​​filter te maken, moet ik een datum, zoals 1 januari 2012, converteren naar het juiste formaat. De conversie gebeurt in FileTime:

PS C:\> $cutoff=(Get-datum "1/1/2012").ToFileTime() PS C:\> $cutoff 129698676000000000

Nu kan ik deze variabele gebruiken in het filter voor Get-ADComputer:

PS C:\> Get-ADComputer -Filter "(lastlogontimestamp -lt $cutoff) -of (lastlogontimestamp -notlike "*")" -property * | Selecteer Naam,LastlogonTimestamp,WachtwoordLastSet

De bovenstaande code vindt dezelfde computers die werden getoond in figuur 5.

Taak 9: deactiveer het computeraccount

Misschien wilt u ze deactiveren wanneer u inactieve of verouderde accounts vindt. Om dit te doen is vrij eenvoudig. We gebruiken dezelfde cmdlet die we gebruikten met gebruikersaccounts. Je kunt het verfijnen met behulp van samAccountnaam rekening.

PS C:\> Disable-ADAccount -Identity "chi-srv01$" -whatif Wat als: Operatie "Set" uitvoeren op doel "CN=CHI-SRV01, CN=Computers,DC=GLOBOMANTICS,DC=local".

Of gebruik een pijplijnexpressie:

PS C:\> get-adcomputer "chi-srv01" | ADAaccount uitschakelen

Ik kan mijn code ook gebruiken om verouderde accounts te vinden en ze allemaal te deactiveren:

PS C:\> get-adcomputer -filter "Passwordlastset -lt "1/1/2012"" -properties *| ADAaccount uitschakelen

Taak 10: Vind computers op type

Er wordt mij ook vaak gevraagd hoe ik computeraccounts op type kan vinden, zoals servers of werkstations. Dit vraagt ​​enige creativiteit van jouw kant. Er is niets in AD dat de server van de client onderscheidt, behalve misschien het besturingssysteem. Als op uw computer Windows Server 2008 wordt uitgevoerd, moet u een paar extra stappen uitvoeren.
Eerst moet u een lijst met besturingssystemen krijgen en vervolgens filteren we accounts op beschikbaar besturingssysteem.

PS C:\> Get-ADComputer -Filter * -Eigenschappen Besturingssysteem | Selecteer Besturingssysteem -uniek | Sorteer besturingssysteem

De resultaten worden weergegeven in figuur 7.


Rijst. 7. Pak de OS-lijst uit

Ik wil alle computers vinden met een server-besturingssysteem:

PS C:\> Get-ADComputer -Filter "OperatingSystem -like "*Server*"" -properties OperatingSystem,OperatingSystem ServicePack | Selecteer Naam,Op* | format-lijst

De resultaten worden weergegeven in figuur 8.

Net als bij andere AD Get-cmdlets kunt u de zoekparameters aanpassen en de query indien nodig beperken tot specifieke organisatie-eenheden. Alle expressies die ik heb getoond, kunnen worden geïntegreerd in grote PowerShell-expressies. U kunt bijvoorbeeld sorteren, groeperen, filters toepassen, exporteren naar CSV of HTML-rapporten maken en e-mailen - allemaal vanuit PowerShell! In dit geval hoeft u geen enkel script te schrijven.
Hier is een bonus voor u: een gebropgeslagen in een HTML-bestand:

PS C:\> Get-ADUser -Filter "Ingeschakeld -eq "True" -AND PasswordNeverExpires -eq "False"" -Eigenschappen PasswordLastSet,PasswordNeverExpires,PasswordExpired | Selecteer DistinguishedName,Name,pass*,@(Name="PasswordAge"; Expression=((Get-Date)-$_.PasswordLastSet)) |sorteer PasswordAge -Descending | ConvertTo-Html -Title "Password Age Report" | Out-File c:\Work\pwage.htm !}

Hoewel deze uitdrukking er misschien een beetje intimiderend uitziet, is hij met een minimale kennis van PowerShell gemakkelijk te gebruiken. En dan is er alleen nog de laatste tip: hoe definieer je een custom property genaamd WachtwoordLeeftijd. De waarde is het verschil tussen vandaag en de eigenschap PasswordLastSet. Vervolgens sorteer ik de resultaten voor mijn nieuwe woning. Figuur 9 toont de uitvoer voor mijn kleine testdomein.

Update:
De post bevat een vertaling van het artikel op de portal

In de commentaren op het vorige artikel herinnerden ze zich de boekhouding in Excel in plaats van 1C. Laten we eens kijken hoeveel u Excel kent. Vandaag laat ik je zien hoe je gegevens uit Active Directory kunt halen en ermee kunt werken zonder macro's en PowerShell - alleen met reguliere Office-mechanismen. U kunt bijvoorbeeld eenvoudig analyses krijgen over het gebruik van besturingssystemen in uw organisatie als u nog niet beschikt over zoiets als Microsoft SCOM. Nou ja, of gewoon opwarmen en afgeleid worden van de scripts.


Natuurlijk kunt u de gegevens zoals in de onderstaande voorbeelden verkrijgen met slechts één regel in PowerShell. Maar ten eerste is PowerShell te saai, en ten tweede kan Excel gegevens dynamisch bijwerken - de resulterende documenten kunnen op internet worden gepubliceerd en het bijwerken ervan vergeten.

Om met gegevens te werken, zal ik de Power Query-engine gebruiken. Voor Office 2010 en 2013 moet u de plug-in installeren, deze module is al in Microsoft Office 2016 ingebouwd. Helaas is de standaardeditie niet genoeg voor ons, we hebben Professional nodig.


Het mechanisme zelf is ontworpen om gegevens uit verschillende bronnen te ontvangen en te verwerken - van de oude ODBC en tekstbestanden tot Exchange, Oracle en Facebook. Meer details over het mechanisme en de ingebouwde scripttaal "M" zijn al geschreven op Habré, maar ik zal een paar voorbeelden analyseren van het gebruik van Power Query om gegevens uit Active Directory te halen.

Opwarming: bekijk wanneer onze gebruikers zijn ingelogd

De query naar de domeindatabase zelf wordt aangemaakt op het tabblad "Gegevens - Nieuwe query - Uit andere bronnen - Uit Active Directory".



Geef de gegevensbron op.


U moet een domeinnaam selecteren en de benodigde gegevens voor de verbinding opgeven. Vervolgens kiezen we het type objecten, in dit voorbeeld - gebruiker. Aan de rechterkant van het voorbeeldvenster wordt de query al uitgevoerd en wordt een voorbeeld van de gegevens weergegeven.



We bereiden het verzoek voor, bewonderen de preview.


U dient de zoekopdracht van tevoren voor te bereiden door op de knop "bewerken" te klikken en de gewenste kolommen te selecteren. In feite zijn deze kolommen klassen.Elk van hen bevat een reeks specifieke attributen van een Active Directory-object, behalve de hoofdkolom. Weergavenaam, wat zelf een attribuut is. Ik blijf bij de lessen gebruiker, persoon, bovenkant En beveiligingPrincipaal. Nu moet je de benodigde attributen van elke klasse selecteren met behulp van de "extensie" - een pictogram met twee pijlen bij de kolomkop:

  • Klas gebruiker uitbreiden door te kiezen lastLogonTimestamp En gebruikersaccount controle;
  • V persoon kiezen telefoon nummer;
  • V bovenkantwanneerGemaakt;
  • en in beveiligingPrincipaalSamAccountnaam.


De vraag uitbreiden.


Laten we nu een filter instellen: in het bijzonder, om geen geblokkeerde accounts te krijgen, moet het kenmerk userAccountControl een waarde hebben van 512 of 66048. Het filter kan in uw omgeving anders zijn. U kunt meer lezen over het kenmerk in de Microsoft-documentatie.



Een filter toepassen.


Soms bepaalt Excel ten onrechte het gegevensformaat, met name de waarden van het attribuut lastLogonTimestamp. Als zo'n ongeluk plotseling gebeurde, kunt u op het tabblad "Converteren" het juiste formaat instellen.

Nu zou de kolom userAccountControl moeten worden verwijderd - deze is helemaal niet nodig op het display. En klik op "Downloaden en sluiten".


Het resultaat was een bord, waar je nog best wat aan moet denken. Hernoem bijvoorbeeld kolommen naar iets leesbaars. En stel automatische gegevensupdates in.


Automatische update bij het openen van een tabel of door time-out is geconfigureerd in het tabblad "Gegevens" in de "Eigenschappen".



Instellingen voor gegevensupdates.


Nadat de update-instelling is voltooid, kunt u de tafel veilig aan het personeel van de personeelsafdeling of de beveiligingsdienst geven - laat hen weten wie en wanneer het systeem is binnengekomen.


Vraag code aan in de "M"-taal onder de spoiler.

let Source = ActiveDirectory.Domains("domain.ru"), domain.ru = Source()[#"Object Categories"], user1 = domain.ru(), #"Remote Columns" = Table.RemoveColumns(user1,( "organizationalPerson", "shadowAccount", "posixAccount", "msExchOmaUser", "msExchBaseClass", "msExchIMRecipient", "msExchCertificateInformation", "msExchMultiMediaUser", "msExchMailStorage", "msExchCustomAttributes", "mailRecipient", "distinguishedName")), #"Uitgebreide securityPrincipal" = Table.ExpandRecordColumn(#"Externe kolommen", "securityPrincipal", ("sAMAccountName"), ("sAMAccountName"), #"Uitgevouwen top" = Table.ExpandRecordColumn(#"Uitgebreide securityPrincipal ", "top ", ("whenCreated"), ("whenCreated")), #"Uitgevouwen persoon" = Table.ExpandRecordColumn(#"Uitgevouwen top", "persoon", ("telephoneNumber"), ("telephoneNumber ")), #" Uitgebreide gebruiker" = Table.ExpandRecordColumn(#"Uitgevouwen persoon", "gebruiker", ("lastLogonTimestamp", "userAccountControl"), ("lastLogonTimestamp", "userAccountControl")), #"Strings met filter toegepast" = Table.SelectRows (#"Uitgevouwen elementgebruiker", elk ( = 512 of = 66048)), #"Gewijzigd type" = Table.TransformColumnTypes(#"Rijen met filter toegepast",(("lastLogonTimestamp", type datetime))), #" Verwijderde kolommen1" = Table.RemoveColumns(#"Gewijzigd type",("userAccountControl")) in #"Verwijderde kolommen1"

We maken een adresboek aan, of wat te doen als het bedrijfsportaal geen vrienden is met AD

Een andere mogelijkheid om Excel in combinatie met Active Directory te gebruiken, is het aanleggen van een adresboek op basis van AD-gegevens. Het is duidelijk dat het adresboek alleen up-to-date is als het domein in orde is.


Maak een aanvraag voor een object gebruiker, breid de klas uit gebruiker V mail, en de klas persoon V telefoon nummer. Verwijder alle kolommen behalve uitgesproken naam— de structuur van het domein herhaalt de structuur van de onderneming; dus de namen Organisatie-eenheden overeenkomen met de afdelingsnamen. Evenzo kunnen beveiligingsgroepen worden gebruikt als basis voor OE-namen.


Nu vanaf de lijn CN=Gebruikersnaam, OU=Accounting Department, OU=Afdelingen, DC=domein, DC=ru u moet de naam van de afdeling rechtstreeks extraheren. De eenvoudigste manier om dit te doen is door de scheidingstekens op het tabblad Transformeren te gebruiken.



We extraheren de tekst.


Als scheidingstekens gebruik ik OU= En ,OU=. In principe is een komma voldoende, maar ik speel op safe.



Voer scheidingstekens in.


Nu met behulp van het filter kunt u overbodig afsnijden u zoals geblokkeerde gebruikers en Ingebouwd, stel sorteren in en laad de gegevens in de tabel.



Uitzicht op de finaletafel.

Snel rapport over de samenstelling van werkplekken, zonder tussenkomst van agenten en andere voorbereidingen

Laten we nu proberen een bruikbare tabel te maken door gegevens op computers te krijgen. Laten we een rapport maken over de besturingssystemen die door het bedrijf worden gebruikt: hiervoor zullen we een verzoek maken, maar in de navigator zullen we deze keer selecteren computer.



We doen een verzoek op het computerobject.


Verlaat de kolomklassen computer En bovenkant en breid ze uit:

  • Klas computer uitbreiden door te kiezen cn, besturingssysteem, operatingSystemServicePack En operatingSystemVersion;
  • in de klas bovenkant kiezen wanneerGemaakt.


Uitgebreid verzoek.


Indien gewenst kunt u alleen een rapport maken over serverbesturingssystemen. Pas bijvoorbeeld een filter toe op het kenmerk operatingSystem of operatingSystemVersion. Ik zal dit niet doen, maar ik zal de weergave van de aanmaaktijd corrigeren - ik ben alleen geïnteresseerd in het jaar. Om dit te doen, selecteert u op het tabblad "Conversie" de kolom die we nodig hebben en selecteert u "Jaar" in het menu "Datum".



We extraheren het jaar vanaf het moment dat de computer het domein betrad.


Nu blijft het om de weergavenaamkolom als onnodig te verwijderen en het resultaat te laden. De gegevens zijn klaar. Nu kunt u ermee werken zoals met een gewone tafel. Om te beginnen maken we een draaitabel op het tabblad "Invoegen" - "Draaitabel". We gaan akkoord met de keuze van de gegevensbron en stellen de velden in.



Draaitabelveldinstellingen.


Nu blijft het om het ontwerp naar smaak aan te passen en het resultaat te bewonderen:



Draaitabel voor computers in AD.


Optioneel kunt u een overzichtsgrafiek toevoegen, ook op het tabblad "Invoegen". Voeg toe in de "Categorieën" (of in de "Rijen", naar smaak). besturingssysteem, in de gegevens cn. Op het tabblad "Ontwerper" kunt u het type diagram kiezen dat u leuk vindt, ik gaf de voorkeur aan het cirkeldiagram.



Cirkeldiagram.


Nu kun je duidelijk zien dat, ondanks de lopende update, het totale aantal werkstations met Windows XP en servers met Windows 2003 vrij groot is. En er is iets om naar te streven.


Vraag code aan onder de spoiler.

let Source = ActiveDirectory.Domains("domain.ru"), domain.ru = Source()[#"Object Categories"], computer1 = domain.ru(), #"Remote Columns" = Table.RemoveColumns(computer1,( "user", "organizationalPerson", "person")), #"Andere externe kolommen" = Table.SelectColumns(#"Externe kolommen",("displayName", "computer", "top")), #"Uitgevouwen element computer" = Table.ExpandRecordColumn(#"Andere kolommen op afstand", "computer", ("cn", "operatingSystem", "operatingSystemServicePack", "operatingSystemVersion"), ("cn", "operatingSystem", "operatingSystemServicePack", " operatingSystemVersion"), #"Expanded top" = Table.ExpandRecordColumn(#"Expanded computer", "top", ("whenCreated"), ("whenCreated")), #"Extracted year" = Table.TransformColumns( #"Expanded top",(("whenCreated", Date.Year))), #"Removed columns1" = Table.RemoveColumns(#"Extracted year",("displayName")) in #"Removed columns1"

Labels toevoegen