Uit advertentie laden. Excel in plaats van PowerShell: queries naar AD en systeemmeldingen “op de knie”

Goedemiddag lieve lezers en abonnees blijven we de mogelijkheden van Powershell en Active Directory verkennen. Zoals je je herinnert, bevinden al haar gebruikers- en computeraccounts zich in de NTDS.dit-database, alles is geweldig en gecentraliseerd. Wanneer een bedrijf meer dan één systeembeheerder heeft, kan er een situatie ontstaan ​​waarin rommel en onnodige inloggegevens zich ophopen. We zijn allemaal mensen en we kunnen sommige dingen vergeten, en op sommige momenten kunnen we afgeleid zijn, wat ook tot vergeten zal leiden belangrijke informatie. En we komen tot de conclusie dat de Actvie Directory zich niet ophoopt actieve gebruikers(ontslagen of vergeten), hoe dan ook, goed systeembeheerder moeten ze identificeren, uitschakelen en vervolgens desgewenst verwijderen, wat we zullen doen.

Via ADUC-module

De vorige keer gaf ik je al een voorbeeld van het gebruik van de Active-module Directory-gebruikers en computers, waarmee we zochten naar ontbrekende computers op het lokale netwerk die al een maand niet waren verschenen. Nu zullen we hetzelfde doen met gebruikersaccounts. Ik heb AD aanstaan Windows-server 2012 R2, open ADUC, druk hiervoor op WIN+R en voer dsa.msc in.

Voer in het geopende aanvraagformulier het volgende in:

  • Naam opvragen > voor mij zijn dit verloren gebruikers
  • Beschrijving indien nodig
  • Root aanvragen > hier kunt u het gehele domein laten staan, of opgeven op de gewenste OU

Klik dan op de aanvraagknop.

Op het tabblad gebruikers zien we het item “Aantal dagen sinds de laatste login”; ik heb dit bijvoorbeeld ingesteld op 60 dagen.

Als gevolg hiervan ontvangt u de lijst die u nodig heeft met inactieve werknemersaccounts.

Via powershell-snap-in

Hetzelfde kan worden gedaan via Powershell. Ik geef je meteen de code waarvan de taak is er wordt gezocht inactieve gebruikers Hiervoor heb ik een periode van 45 dagen gekozen, gebruikersgegevens uitgeschakeld en verplaatst naar een speciaal aangewezen OU.

$date_with_offset= (Get-datum).AddDays(-45)
$users = Get-ADUser -Properties LastLogonDate -Filter (LastLogonDate -lt $date_with_offset ) | Sorteer LastLogonDate
foreach ($user in $users) (set-aduser $user -enabled $false; move-adobject -identity $user -targetpath "ou=Fired,ou=Moskou L. gebruikers,ou=Locatie,dc=msk,dc= contoso,dc=com")
Get-ADUser -Eigenschappen LastLogonDate -Filter (LastLogonDate -lt $date_with_offset ) | Sorteer LastLogonDate | FT-naam, LastLogonDate -AutoSize | Uit-bestand c:\Script\users.txt

  • In de eerste regel declareer je een variabele waarin je de zoekterm instelt
  • Maak een variabele aan en maak een selectie op basis van de laatste inlogtijd
  • Gebruikers verplaatsen

  • Een rapport maken in een bestand

Nog meer nuttige dingen over het werken met de gebruiker. Voordat u onderstaande opdrachten gebruikt, moet u de Active Directory-module via de opdracht laden

Get-Help Get-ADUser

Toegewijd met behulp van kracht Shell voor AD-beheer. Als uitgangspunt heeft de auteur besloten om 10 algemene AD-beheertaken te nemen en te kijken hoe deze kunnen worden vereenvoudigd met behulp van PowerShell:

  1. Gebruikerswachtwoord opnieuw instellen
  2. Accounts activeren en deactiveren
  3. Ontgrendel gebruikersaccount
  4. Account verwijderen
  5. Zoek lege groepen
  6. Voeg gebruikers toe aan een groep
  7. Groepsleden vermelden
  8. Vind verouderde computeraccounts
  9. Deactiveer een computeraccount
  10. Zoek computers op type

Daarnaast houdt de auteur een blog bij (uiteraard met behulp van PowerShell), we raden aan een kijkje te nemen - jdhitsolutions.com/blog. En je kunt de meest actuele informatie van zijn Twitter krijgen twitter.com/jeffhicks.
Hieronder vindt u dus de vertaling van het artikel “Top 10 Active Directory-taken opgelost met PowerShell”.

Actieve controle Directory (AD) gebruikt Windows PowerShell– het is gemakkelijker dan je denkt, en ik wil het je bewijzen. U kunt eenvoudig de onderstaande scripts gebruiken om een ​​aantal AD-beheertaken op te lossen.

Vereisten

Als u PowerShell wilt gebruiken om AD te beheren, moet u aan verschillende vereisten voldoen. Ik ga demonstreren hoe de AD-cmdlets werken met een Windows 7-computer als voorbeeld.
Als u de cmdlets wilt gebruiken, moet u over een Windows Server 2008 R2-domeincontroller beschikken, of u kunt Active Directory Management Gateway Service downloaden en installeren op oudere DC's. Lees de documentatie zorgvuldig door voordat u met de installatie begint; Opnieuw opstarten van cd vereist.
Aan de clientzijde download en installeer (RSAT) voor Windows 7 of Windows 8. Op Windows 7 moet u openen in Bedieningspanelen hoofdstuk Programma's en kies In- of uitschakelen Windows-functies(Windows-functies in- of uitschakelen). Vinden Hulpprogramma's voor extern serverbeheer en vouw de sectie uit Hulpmiddelen voor rolbeheer. Selecteer de juiste 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 standaard alle tools geselecteerd). Nu zijn we klaar om te werken.

Afb.1 AD DS- en AD LDS-tools inschakelen

Ik ben ingelogd met een account met domeinbeheerdersrechten. Met de meeste cmdlets die ik laat zien, kunt u alternatieve referenties opgeven. In ieder geval raad ik aan de help te lezen ( Krijg hulp) en voorbeelden die ik hieronder zal demonstreren.
Start een PowerShell-sessie en importeer de module:

PS C:\> Importmodule ActiveDirectory

Door het importeren wordt een nieuwe PSDrive gemaakt, maar we zullen deze niet gebruiken. U kunt echter wel zien welke opdrachten beschikbaar zijn in de geïmporteerde module.

PS C:\> get-command -module ActiveDirectory

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

Taak 1: Reset het gebruikerswachtwoord

Laten we beginnen met een typische taak: het wachtwoord van een gebruiker opnieuw instellen. U kunt dit eenvoudig en eenvoudig doen met behulp van een cmdlet Set-ADAccountPassword. Het lastige is dat Nieuw wachtwoord moet worden gekwalificeerd als een beveiligde tekenreeks: een stuk tekst dat wordt gecodeerd en in het geheugen wordt opgeslagen voor de duur van een PowerShell-sessie. Laten we eerst een variabele maken met het nieuwe 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– 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: -Passthru, -Wat als, En -Bevestigen werk niet. Als je de voorkeur geeft aan een snelkoppeling, probeer dan dit:

PS C:\> Set-ADAccountPassword jfrost -NewPassword (ConvertTo-SecureString -AsPlainText -String "P@ssw0rd1z3" -force)

Als gevolg hiervan moet Jack zijn wachtwoord wijzigen de volgende keer dat hij inlogt, dus wijzig ik het account met Set-ADUser.

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

De resultaten van het uitvoeren van de cmdlet worden niet naar de console geschreven. Als dit nodig is, gebruik dan -WAAR. Maar ik kan erachter komen of de bewerking succesvol was of niet door de gebruikersnaam op te halen met behulp van de cmdlet Get-ADUser en het specificeren van de eigenschap Wachtwoord verlopen, zoals weergegeven 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 geef toe dat het opnieuw instellen van het wachtwoord ook eenvoudig is via een handomdraai Active Directory-gebruikers en computers consoles Microsoft-beheer Console (MMC). Maar met behulp van PowerShell Geschikt als u een taak moet delegeren, de bovengenoemde module niet wilt implementeren of een wachtwoord opnieuw wilt instellen als onderdeel van een groot geautomatiseerd IT-proces.

Taak 2: Accounts activeren en deactiveren

Laten we nu het account deactiveren. Laten we blijven samenwerken met Jack Frost. Deze code gebruikt de parameter –Wat als, die je kunt vinden in andere comadlets die wijzigingen aanbrengen om mijn opdracht te testen zonder deze uit te voeren.

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

Laten we het nu echt deactiveren:

PS C:\> Schakel ADAAccount jfrost uit

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

PS C:\> ADAccount jfrost inschakelen

Deze cmdlets kunnen worden gebruikt in een pijplijnexpressie, zodat u zoveel accounts kunt activeren of deactiveren als u wilt. Met deze code worden bijvoorbeeld alle accounts op de afdeling Sales gedeactiveerd

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

Schrijf er natuurlijk een filter voor Get-ADUser nogal ingewikkeld, maar dit is waar het gebruik van de parameter –Wat als samen met de cmdlet Schakel ADAccount uit komt te hulp.

Taak 3: Ontgrendel het gebruikersaccount

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

PS C:\> Ontgrendel-ADAAccount jfrost

De cmdlet ondersteunt ook para meters -Wat als En -Bevestigen.

Taak 4: Account verwijderen

Het maakt niet uit hoeveel gebruikers u verwijdert: u kunt dit eenvoudig doen met behulp van de cmdlet Verwijder-ADUser. Ik wil Jack Frost niet verwijderen, maar als ik dat zou willen, zou ik de volgende code gebruiken:

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

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

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

Met deze opdracht worden alle uitgeschakelde werknemers-OE-accounts gevonden en verwijderd die gedurende 180 dagen of langer niet zijn gewijzigd.

Taak 5: Lege groepen vinden

Het beheren van groepen 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 (-Niet ($_ | get-adgroupmember)) | Selecteer Naam

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

PS C:\> get-adgroup -filter "members -notlike "*" -AND GroupScope -eq "Universal"" -SearchBase "OU=Groepen,OU=Werknemers,DC=Globomantics, DC=lokaal" | Selecteer Naam, Groep*

Met deze opdracht worden alle universele groepen gevonden die geen lidmaatschap hebben van OE-groepen en worden enkele eigenschappen weergegeven. 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, al vind ik dit een beetje lastig:

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

Ik heb de pipeline-expressie tussen haakjes gebruikt om alle gebruikers te vinden die het 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 groep Chicago Employees. Het maakt niet uit of we te maken hebben met 5 of 5000 gebruikers, het bijwerken van groepslidmaatschappen duurt slechts enkele seconden. Deze uitdrukking kan ook worden geschreven met VoorElk-Object wat is misschien handiger:

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

Taak 7: Maak een lijst van groepsleden

Misschien wil je weten wie er in een bepaalde groep zit. U moet bijvoorbeeld periodiek nagaan wie lid is van de groep Domeinadministrators:

PS C:\> Get-ADGroupMember "Domeinbeheerders"

Figuur 4 toont het resultaat.


Rijst. 4. Leden van de groep Domeinadministrators

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

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

Als u de andere kant op wilt gaan - zoek in welke groepen een gebruiker zich bevindt - gebruik dan de gebruikerseigenschap LidVan:

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

Ik heb de parameter gebruikt -Eigenschap uitvouwen namen weergeven LidVan zoals lijnen.

Taak 8: Vind verouderde computeraccounts

Deze vraag wordt mij vaak gesteld: “Hoe vind ik verouderde computeraccounts?” En ik antwoord altijd: “Wat is voor jou achterhaald?” Bedrijven bepalen wanneer rekening computer (of gebruiker, het maakt niet uit) wordt als verouderd beschouwd en kan niet verder worden gebruikt. Wat mij betreft, ik let op die accounts waarvan de wachtwoorden al een tijdje niet zijn gewijzigd. bepaalde periode tijd. Deze periode is voor mij 90 dagen - als de computer tijdens deze periode het wachtwoord en het domein niet heeft gewijzigd, is deze hoogstwaarschijnlijk offline en verouderd. Cmdlet gebruikt Get-ADComputer:

PS C:\> get-adcomputer -filter "Wachtwoordlastset -lt "1/1/2012"" -eigenschappen *| Selecteer naam,wachtwoordlaatsteset

Het filter werkt prima 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

Een andere optie: laten we aannemen dat u zich minimaal op functioneel niveau bevindt Windows-domein 2003. Filter op eigenschap Laatste aanmeldingstijdstempel. Deze waarde is het aantal intervallen van 100 nanoseconden sinds 1 januari 1601 en wordt opgeslagen in GMT, dus het werken met deze waarde is een beetje lastig:

PS C:\> get-adcomputer -filter "LastlogonTimestamp -gt 0" -eigenschappen * | selecteer naam,laatste logontijdstempel, @(Name="LastLogon";Expression=(::FromFileTime ($_.Lastlogontimestamp))),wachtwoordlastset | Sorteer LastLogonTimeStamp


Rijst. 6. Converteer de LastLogonTimeStamp-waarde naar een bekend formaat

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

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

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

PS C:\> Get-ADComputer -Filter "(lastlogontimestamp -lt $cutoff) -or (lastlogontimestamp -notlike "*")" -property * | Selecteer Naam,Laatste aanmeldingTijdstempel,WachtwoordLaatsteSet

De bovenstaande code vindt dezelfde computers als in Figuur 5.

Taak 9: Deactiveer het computeraccount

Als u inactieve of verouderde accounts tegenkomt, wilt u deze misschien deactiveren. Dit is vrij eenvoudig te doen. We zullen dezelfde cmdlet gebruiken waarmee we met gebruikersaccounts werkten. Je kunt het verduidelijken door gebruik te maken van samAccountnaam rekening.

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

Of gebruik een pijplijnexpressie:

PS C:\> get-adcomputer "chi-srv01" | Schakel ADAccount uit

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

PS C:\> get-adcomputer -filter "Wachtwoordlastset -lt "1/1/2012"" -eigenschappen *| Schakel ADAccount uit

Taak 10: Zoek computers op type

Ik krijg ook vaak de vraag hoe ik computeraccounts kan vinden op type, zoals servers of werkstations. Dit vergt enige creativiteit van uw kant. Er is niets in AD dat een server van een client onderscheidt, behalve misschien het besturingssysteem. Als uw computer Windows Server 2008 gebruikt, moet u een paar extra stappen uitvoeren.
Eerst moet u een lijst met besturingssystemen verkrijgen en vervolgens filteren we accounts op beschikbare besturingssystemen.

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

De resultaten worden getoond in Figuur 7.


Rijst. 7. De besturingssysteemlijst ophalen

Ik wil alle computers vinden met een server-besturingssysteem:

PS C:\> Get-ADComputer -Filter "OperatingSystem -achtige "*Server*"" -eigenschappen Besturingssysteem,OperatingSystem ServicePack | Selecteer Naam,Op* | formaat-lijst

De resultaten worden getoond in Figuur 8.

Net als bij andere AD Get-cmdlets kunt u zoekparameters aanpassen en de aanvraag indien nodig beperken tot specifieke organisatie-eenheden. Alle expressies die ik heb getoond, kunnen worden geïntegreerd in grotere PowerShell-expressies. U kunt bijvoorbeeld sorteren, groeperen, filters toepassen, exporteren naar CSV of aanmaken en verzenden naar HTML-mail rapporten - allemaal vanuit PowerShell! In dit geval hoeft u geen enkel script te schrijven.
Hier is een bonus: een rapport over de leeftijd van het gebruikerswachtwoord, opgeslagen in een HTML-bestand:

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

Hoewel deze uitdrukking er misschien een beetje intimiderend uitziet, is deze eenvoudig te gebruiken met minimale kennis van PowerShell. En er blijft nog maar één laatste advies over: hoe definieer je een aangepaste eigenschap genaamd WachtwoordLeeftijd. De waarde vertegenwoordigt de kloof tussen vandaag en de eigenschap PasswordLastSet. Vervolgens sorteer ik de resultaten voor mijn nieuwe woning. Figuur 9 toont de uitvoer voor mijn kleine testdomein.

Bijgewerkt:
Het bericht bevat een vertaling van het artikel op de portal

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

Syntaxis

ldifde [-i] [-F bestandsnaam] [-S servernaam] [-C lijn1 lijn2] [-v] [-J pad] [-T poortnummer] [-D DN_basis] [-R filter_LDAP] [-P regio] [-l LDAP_kenmerklijst] [-O LDAP_kenmerklijst] [-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. -Sservernaam Specificeert de computer waarop de import- of exportbewerking moet worden uitgevoerd. Standaardprogramma ldifde wordt uitgevoerd op de computer waarop ldifde geïnstalleerd. -Clijn1 lijn2 Vervangt alle exemplaren lijnen1 inhoud lijnen2. Meestal gebruikt wanneer u gegevens van het ene domein naar het andere importeert en de DN-naam moet vervangen van het domein dat de export uitvoert ( lijn1), domeinnaam importeren ( lijn2). -v Schakelt gedetailleerde 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 standaard LDAP-poort is 389. Poort mondiale catalogus is 3268. -DDN_basis Specificeert de DN-naam van de zoekbasis voor gegevensexport. -RLDAP-filter Creëert een LDAP-zoekfilter voor gegevensexport. Het volgende filter exporteert bijvoorbeeld alle gebruikers met een specifieke middelste naam: csvde -r (en(objectClass=Gebruiker)(sn=Achternaam)) -Pregio Specificeert het zoekgebied. De zoekbereikparameters zijn Baseren, Eén niveau En Subboom. -lLDAP_kenmerklijst Specificeert de lijst met kenmerken die worden geretourneerd in de resultaten van de exportaanvraag. Als deze parameter wordt weggelaten, worden alle attributen geretourneerd. -OLDAP_kenmerklijst Specificeert een lijst met kenmerken die moeten worden weggelaten uit de resultaten van de exportaanvraag. Deze optie wordt doorgaans gebruikt bij het exporteren van objecten uit Active Directory en deze vervolgens importeren in een andere LDAP-compatibele directory. Als er kenmerken zijn die niet door een andere catalogus worden ondersteund, kunnen deze met deze optie worden uitgesloten van de resultatenset. -G Elimineert paginazoekopdrachten. -M Laat attributen weg die niet kunnen worden geschreven, zoals ObjectGUID En objectSID. -N Laat de export van binaire waarden achterwege. -k Negeert fouten tijdens de importbewerking en gaat door met de verwerking. Hieronder staat volledige lijst genegeerde fouten:

  • het object is al lid van de groep;
  • een schending van de objectklasse (wat betekent dat de opgegeven objectklasse niet bestaat) als het geïmporteerde object geen andere attributen heeft;
  • het object bestaat al;
  • overtreding van de beperking;
  • het attribuut of de waarde bestaat al;
  • zo'n object bestaat niet.
-Aonderscheidende_naam_wachtwoord Specificeert de uitvoering van een opdracht met behulp van de opgegeven onderscheidende_naam_gebruikersnaam En wachtwoord -B. -Bgebruikersnaam domeinwachtwoord Specificeert de 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 zich in het systeem bevindt huidige moment geregistreerd op het netwerk. Kan niet worden gebruikt met parameter -A. -? Geeft een menu met opdrachten weer.

Opmerkingen

  • Met parameter -C Je kunt constanten gebruiken #schemaNamingContext En #configurationNamingContext in plaats van de DN-namen van de schemamappartitie en de configuratiemappartitie.
  • Bij het maken van een importbestand voor een opdracht ldifde, gebruik de waarde veranderType om het type wijzigingen in het importbestand te bepalen. Waarden veranderType staan ​​in de onderstaande tabel.

Hieronder ziet u een voorbeeld van een LDAP-importbestand in LDIF-indeling waarin de waarde wordt gebruikt toevoegen:
DN: CN=geselecteerde_gebruiker,DC=domeinnaam
wijzigingstype: toevoegen
CN: geselecteerde_gebruiker
beschrijving:bestandsbeschrijving
objectKlasse: gebruiker
objectKlasse: geselecteerde_gebruiker

Voorbeelden

Om alleen de DN-naam te extraheren, gemeenschappelijke naam, voornaam, achternaam en telefoonnummer van de geretourneerde objecten, voer in:
-l onderscheidende_naam, CN, Naam, S.N. telefoon
Om een ​​Globally Unique Identifier (GUID) voor een object uit te sluiten, voert u het volgende in:
-O wanneer_gemaakt, wanneer_gewijzigd, object_GUID

Het is geen geheim dat Microsoft sinds de eerste versie van PowerShell probeert er het belangrijkste hulpmiddel van te maken Windows-beheer. En in veel opzichten werkt het! Vandaag zullen we aan de hand van eenvoudige voorbeelden PowerShell-mogelijkheden laten zien die kunnen worden gebruikt om te verkrijgen diverse informatie over Active Directory-gebruikers en hun kenmerken.

Opmerking. Voorheen moest u, om informatie te verkrijgen over de kenmerken van AD-gebruikersaccounts, verschillende hulpmiddelen gebruiken: de ADUC-console (inclusief), een hulpprogramma, enz. De keuze voor het hulpmiddel was meestal gebaseerd op de taak die moest worden uitgevoerd en de programmeervaardigheden van de beheerder.

PowerShell 2.0 introduceerde een speciale module voor het werken met Active Directory - (geïntroduceerd in Windows Server 2008 R2), waarvan de cmdlets u in staat stellen verschillende manipulaties uit te voeren met AD-directoryobjecten. Om informatie over gebruikers te verkrijgen domein Actief Directory en hun eigenschappen-cmdlet Get-ADUser. U kunt de cmdlet Get-ADUser gebruiken om de waarde van elk kenmerk van een bestaand gebruikersaccount in AD op te halen. Daarnaast kunt u diverse selectiecriteria opgeven en lijsten met domeingebruikers en hun attributen genereren.

In dit voorbeeld laten we u zien hoe u de PowerShell Get-ADUser-cmdlet gebruikt om informatie op te halen over wanneer het wachtwoord van een gebruiker voor het laatst is gewijzigd en wanneer dit verloopt.

Start het Powershll-venster met beheerdersrechten en importeer de Active Directory-module met de opdracht:

Importmodule activedirectory

Advies. In Windows Server 2012 en hoger kunt u dit item sinds de module overslaan Powershell actief Directory is standaard verbonden.

In clientbesturingssystemen (bijvoorbeeld Windows 10) moet u, om de Get-AdUser-commandant te laten werken, de juiste versie van RSAT installeren en de component in het configuratiescherm inschakelen Active Directory-module voor Windows PowerShell(Hulpprogramma's voor extern serverbeheer -> Hulpprogramma's voor rolbeheer -> AD DS en AD LDS-hulpprogramma's -> AD DS-hulpprogramma's).

U kunt als volgt een volledige lijst van alle argumenten voor de Get-ADUser-cmdlet krijgen:

Help Get-ADUser

Om een ​​lijst met alle domeinaccounts weer te geven, voert u de opdracht uit:

Get-ADUser-filter *

Het formaat van de geretourneerde lijst is niet erg handig in gebruik, slechts enkele fundamentele 10 van de meer dan 120 attributen en eigenschappen van gebruikersaccounts worden weergegeven (DN, SamAccountName, Naam, UPN, enz.). Daarnaast zien we dat er geen informatie over het tijdstip van de laatste wachtwoordwijziging.

Om volledige informatie over alle beschikbare attributen van de gebruiker-tuser weer te geven, voert u de opdracht uit:

Get-ADUser -identiteit tuuser -eigenschappen *

We zien dus een volledige lijst met AD-gebruikerskenmerken en hun waarden die aan het gebruikersaccount zijn gekoppeld. Vervolgens gaan we verder met het formatteren van de uitvoer van de Get-ADUser-cmdlet, zodat de velden die we nodig hebben worden weergegeven. Wij zijn geïnteresseerd in de kenmerken:

  • Wachtwoord verlopen
  • WachtwoordLaatsteSet
  • WachtwoordNeverExpires

Laten we de opdracht uitvoeren:

Get-ADUser tuuser -eigenschappen WachtwoordExpired, WachtwoordLastSet, WachtwoordNeverExpires

Nu bevatten de gebruikersgegevens informatie over de datum van wachtwoordwijziging en het tijdstip waarop deze verloopt. Laten we de informatie in een handiger tabelvorm presenteren:

Get-ADUser -filter * -eigenschappen WachtwoordExpired, WachtwoordLastSet, WachtwoordNeverExpires | ft Naam, WachtwoordExpired, WachtwoordLastSet, WachtwoordNeverExpires

Gebruik de parameter om gebruikersgegevens van een specifieke OE weer te geven Zoekbasis:

Get-ADUser -SearchBase ‘OU=Moskou,DC=winitpro,DC=loc’ -filter * -eigenschappen WachtwoordExpired, WachtwoordLastSet, WachtwoordNeverExpires | ft Naam, WachtwoordExpired, WachtwoordLastSet, WachtwoordNeverExpires

Het resultaat van de opdracht kan worden geëxporteerd naar een tekstbestand:

Get-ADUser -filter * -eigenschappen WachtwoordExpired, WachtwoordLastSet, WachtwoordNeverExpires | ft Naam, WachtwoordExpired, WachtwoordLastSet, WachtwoordNeverExpires > C:\temp\users.txt

Of in CSV, dat in de toekomst gemakkelijk naar Excel zal worden geëxporteerd (aanvullend met behulp van sorteerobject Laten we de tabel sorteren op de kolom PasswordLastSet en ook een voorwaarde toevoegen waar– de gebruikersnaam moet de string “Dmitry” bevatten:

Get-ADUser -filter * -eigenschappen WachtwoordExpired, WachtwoordLastSet, WachtwoordNeverExpires | waar ($_.name –zoals “*Dmitry*”) | sorteerobject WachtwoordLastSet | select-object Naam, WachtwoordExpired, WachtwoordLastSet, WachtwoordNeverExpires | Export-csv -pad c:\temp\user-password-expires-2015.csv

U kunt dus een tabel bouwen met alle benodigde attributen Actieve gebruikers Directory.

Om een ​​lijst met AD-gebruikersaccounts te verkrijgen op basis van een specifiek kenmerk, gebruikt u de parameter –Filter. Als argumenten voor deze parameter kunt u de waarde van bepaalde Active Directory-gebruikerskenmerken opgeven, waardoor de cmdlet Get-ADUser wordt toegepast op gebruikers die aan de filtercriteria voldoen.

Uitvoer van AD-gebruikers waarvan de naam begint met Roman:

Get-ADUser -filter (naam -zoals "Roman*")

Get-ADUser -Filter (SamAccountName -achtige "*") | Meetobject

Lijst met alle actieve (niet geblokkeerde) accounts in AD:

Get-ADUser -Filter (ingeschakeld -eq "True") | Selecteer-Object SamAccountName,Naam,Achternaam,Voornaam | Formaattabel

Lijst met accounts met verlopen wachtwoord:

Get-ADUser -filter (ingeschakeld -eq $True) -eigenschappen wachtwoordverlopen | waar($_.Wachtwoordverlopen)

Lijst met actieve accounts met e-mailadressen:

Get-ADUser -Filter ((mail -ne "null") -en (Ingeschakeld -eq "true")) -Eigenschappen Achternaam,Voornaam,mail | Selecteer-Objectnaam, Achternaam, Voornaam, E-mail | Formaattabel

Taak: voor een lijst met accounts die zijn opgeslagen in een tekstbestand (één account per regel), moet u het telefoonnummer van de gebruiker in AD ophalen en de informatie uploaden naar een tekst-csv-bestand (kan eenvoudig worden geïmporteerd in Esxel).

Import-Csv c:\ps\usernsme_list.csv | ForEach ( Get-ADUser -identity $_.user -Eigenschappennaam, telefoonnummer | Selecteer naam, telefoonnummer | Export-CSV c:\ps\export_ad_list.csv -Append -Encoding UTF8 )

Met het volgende voorbeeld kunt u een bedrijfsadresboek downloaden als csv-bestand, dat later in Outlook of Mozilla Thunderbird kan worden geïmporteerd:

Get-ADUser -Filter ((mail -ne "null") -en (Ingeschakeld -eq "true")) -Eigenschappen Achternaam,Voornaam,mail | Selecteer-Objectnaam, Achternaam, Voornaam, E-mail | Export-Csv -NoTypeInformation -Encoding utf8 -delimiter "," $env:temp\mail_list.csv

Gebruikers die hun wachtwoord de afgelopen 90 dagen niet hebben gewijzigd:

$90_Days = (Get-Date).adddays(-90) Get-ADUser -filter ((wachtwoordlastset -le $90_days))

$user = Get-ADUser winadmin -Eigenschappen thumbnailPhoto $user.thumbnailPhoto | Set-Content winadmin.jpg -Coderbyte

Lijst met groepen waartoe het gebruikersaccount behoort

Get-AdUser winadmin -Eigenschappenlidvan | Selecteer lidvan -eigenschaplidvan uitvouwen

In de opmerkingen bij het vorige artikel herinnerden we ons over 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 standaard Office-mechanismen. U kunt bijvoorbeeld eenvoudig analyses krijgen van het gebruik van het besturingssysteem in uw organisatie als u nog niet over zoiets als Microsoft SCOM beschikt. Nou ja, of gewoon even opwarmen en je gedachten afleiden van de scripts.


Uiteraard kunt u de gegevens zoals in de onderstaande voorbeelden letterlijk met één regel in PowerShell verkrijgen. Maar ten eerste is PowerShell te saai, en ten tweede kan Excel gegevens dynamisch bijwerken - de resulterende documenten kunnen online worden gepubliceerd en vergeten dat ze moeten worden bijgewerkt.

Om met gegevens te werken, zal ik het Power Query-mechanisme gebruiken. Voor Office 2010 en 2013 zul je een plugin moeten installeren; Microsoft Office 2016 heeft deze module al 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, naar Exchange, Oracle en Facebook. Meer details over het mechanisme en de ingebouwde scripttaal “M” zijn al geschreven op Habré, maar ik zal een paar gebruiksvoorbeelden bekijken Power-query om gegevens uit Active Directory op te halen.

Opwarming: laten we eens kijken wanneer onze gebruikers zijn ingelogd

Het verzoek aan de domeindatabase zelf wordt aangemaakt op het tabblad “Gegevens – Nieuw verzoek – Uit andere bronnen – Uit Active Directory”.



Geef de gegevensbron op.


U moet een domeinnaam selecteren en de benodigde verbindingsgegevens opgeven. Selecteer vervolgens het type objecten, in dit voorbeeld: gebruiker. Rechts in het voorbeeldvenster is de query al actief en wordt een voorbeeld van de gegevens weergegeven.



Wij bereiden een aanvraag voor en bewonderen de preview.


U dient uw verzoek eerst voor te bereiden door op de knop “Bewerken” te klikken en te selecteren vereiste kolommen. In wezen zijn deze kolommen klassen. Elk van hen bevat een reeks specifieke kenmerken van een Active Directory-object, behalve de hoofdkolom weergavenaam, wat zelf een attribuut is. Ik zal me concentreren op de lessen gebruiker, persoon, bovenkant En beveiligingPrincipaal. Nu moet je selecteren vereiste attributen van elke klasse met behulp van de “extensie” - een pictogram met twee pijlen bij de kolomkop:

  • Klas gebruiker uitbreiden door te kiezen lastLogonTijdstempel En userAccountControl;
  • V persoon laten we kiezen Telefoonnummer;
  • V bovenkantwanneeraangemaakt;
  • en binnen beveiligingPrincipaalSamAccountnaam.


Wij breiden het verzoek uit.


Laten we nu het filter instellen: om te voorkomen dat accounts worden geblokkeerd, moet het attribuut userAccountControl de waarde 512 of 66048 hebben. Het filter kan in uw omgeving anders zijn. U kunt meer over het kenmerk lezen in de Microsoft-documentatie.



Een filter toepassen.


Soms detecteert Excel het gegevensformaat onjuist, vooral de waarde van het kenmerk lastLogonTimestamp. Als een dergelijk ongeluk u plotseling overkomt, kunt u het juiste formaat instellen op het tabblad “Converteren”.

Nu moet de userAccountControl-kolom worden verwijderd - deze is helemaal niet nodig in het display. En klik op “Downloaden en sluiten”.


Het resultaat is een bord dat nog een kleine finishing touch nodig heeft. Hernoem de kolommen bijvoorbeeld naar iets leesbaarder. En aanpassen automatische update gegevens.


Automatische updates bij het openen van een tabel of bij time-out worden geconfigureerd op het tabblad “Gegevens” in “Eigenschappen”.



Gegevensupdate instellen.


Nadat het instellen van de update is voltooid, kunt u de tafel veilig aan de personeelsafdeling of de beveiligingsdienst geven - laat hen weten wie zich wanneer op het systeem heeft aangemeld.


De aanvraagcode in de “M”-taal staat onder de spoiler.

let Source = ActiveDirectory.Domains("domain.ru"), domain.ru = Source()[#"Objectcategorieën"], user1 = domain.ru(), #"Remote Columns" = Table.RemoveColumns(user1,( "organizationalPerson", "shadowAccount", "posixAccount", "msExchOmaUser", "msExchBaseClass", "msExchIMRecipient", "msExchCertificateInformation", "msExchMultiMediaUser", "msExchMailStorage", "msExchCustomAttributes", "mailRecipient", "distinguishedName")), #"Uitgebreid element securityPrincipal" = Table.ExpandRecordColumn(#"Verwijderde kolommen", "securityPrincipal", ("sAMAccountName"), ("sAMAccountName")), #"Uitgebreid element top" = Table.ExpandRecordColumn(#"Uitgebreid element securityPrincipal ", "top", ("whenCreated"), ("whenCreated")), #"Uitgebreid element person" = Table.ExpandRecordColumn(#"Uitgebreid element top", "person", ("telephoneNumber"), ("telephoneNumber ")), #"Expanded element user" = Table.ExpandRecordColumn(#"Expanded element person", "user", ("lastLogonTimestamp", "userAccountControl"), ("lastLogonTimestamp", "userAccountControl")), #"Rows met filter toegepast" = Table.SelectRows(#"Uitgebreid gebruikerselement", elk ( = 512 of = 66048)), #"Gewijzigd type" = Table.TransformColumnTypes(#"Rijen met filter toegepast",(("lastLogonTimestamp", type datetime))), #"Remoted columns1" = Table.RemoveColumns(#"Changed type",("userAccountControl")) in #"Remoted columns1"

Een adresboek maken, of wat u wanneer moet doen bedrijfsportaal niet bevriend met AD

Een andere optie met behulp van Excel in combinatie met Active Directory - dit is de vorming van een adresboek op basis van AD-gegevens. Dat is duidelijk adresboek Het is alleen relevant als het domein in orde is.


Laten we een aanvraag voor een object maken gebruiker, breid de klas uit gebruiker V mail, en klasse persoon V Telefoonnummer. Laten we alle kolommen verwijderen, behalve onderscheidenNaam– de domeinstructuur herhaalt de structuur van de onderneming, dus de namen Organisatorische eenheden overeenkomen met de namen van de afdelingen. Op dezelfde manier kunnen beveiligingsgroepen worden gebruikt als basis voor afdelingsnamen.


Nu vanaf de lijn CN=Gebruikersnaam, OU=Boekhoudingsafdeling, OU=Divisies, DC=domein, DC=ru u moet de afdelingsnaam rechtstreeks extraheren. De eenvoudigste manier om dit te doen is door de scheidingstekens op het tabblad Transformeren te gebruiken.



Het extraheren van de tekst.


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



Voer scheidingstekens in.


Nu u het filter gebruikt, kunt u onnodig afsnijden OU, zoals geblokkeerde gebruikers en ingebouwd, configureer het sorteren en laad gegevens in de tabel.



Weergave van de overzichtstabel.

Snel rapporteren over de samenstelling van werkplekken, zonder tussenkomst van middelen of andere voorbereidingen

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



Wij doen een aanvraag voor het computerobject.


Laten we de kolomklassen verlaten computer En bovenkant en breid ze uit:

  • Klas computer uitbreiden door te kiezen cn, besturingssysteem, besturingssysteemServicePack En besturingssysteemversie;
  • in de klas bovenkant laten we kiezen wanneeraangemaakt.


Geavanceerd verzoek.


Indien gewenst kunt u alleen een rapport maken over serverbesturingssystemen. Filter bijvoorbeeld 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 jaartal. 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 halen het jaar uit het tijdstip waarop de computer het domein binnenkwam.


Nu hoeft u alleen nog maar de kolom weergavenaam als onnodig te verwijderen en het resultaat te laden. De gegevens zijn klaar. Nu kunt u ermee werken zoals met een gewone tafel. Laten we eerst een draaitabel maken op het tabblad "Invoegen" - " Draaitabel" Laten we akkoord gaan met de keuze van de gegevensbron en de velden configureren.



Veldinstellingen voor draaitabel.


Nu hoeft u alleen nog maar het ontwerp naar uw smaak aan te passen en het resultaat te bewonderen:



Overzichtstabel voor computers in AD.


Indien gewenst kunt u toevoegen samenvattend schema, ook op het tabblad Invoegen. Voeg toe in de "Categorie" (of in de "Rijen", naar smaak). besturingssysteem, naar gegevens ― cn. Op het tabblad “Ontwerp” kun je het type diagram kiezen dat je leuk vindt; Ik gaf de voorkeur aan het cirkeldiagram.



Cirkeldiagram.


Nu is duidelijk zichtbaar dat, ondanks de voortdurende update, het totaal aantal werkstations met Windows XP en servers met Windows 2003 behoorlijk groot is. En er is iets om naar te streven.


De aanvraagcode staat onder de spoiler.

let Source = ActiveDirectory.Domains("domain.ru"), domain.ru = Source()[#"Objectcategorieën"], computer1 = domain.ru(), #"Remote Columns" = Table.RemoveColumns(computer1,( "user", "organizationalPerson", "person")), #"Andere verwijderde kolommen" = Table.SelectColumns(#"Remoted columns",("displayName", "computer", "top")), #"Item uitvouwen computer" = Table.ExpandRecordColumn(#"Andere externe kolommen", "computer", ("cn", "operatingSystem", "operatingSystemServicePack", "operatingSystemVersion"), ("cn", "operatingSystem", "operatingSystemServicePack", " operatingSystemVersion")), #"Extended top" = Table.ExpandRecordColumn(#"Uitgebreide computer", "top", ("whenCreated"), ("whenCreated")), #"Geëxtraheerd jaar" = Table.TransformColumns( #" Uitgebreid element top",(("whenCreated", Date.Year))), #"Remoted columns1" = Table.RemoveColumns(#"Extracted year",("displayName")) in #"Remoted columns1"

Tags toevoegen