Hoe u een lijst met groepsgebruikers uit een advertentie kunt downloaden. Scripts voor het ontladen van alle gebruikers uit MS Active Directory (ITGC). Snel rapporteren over de samenstelling van werkplekken, zonder tussenkomst van middelen of andere voorbereidingen

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. Activeren en deactiveren rekeningen
  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 cmdlets wilt gebruiken, moet u over een domeincontrollerniveau beschikken Windows-server 2008 R2, of u kunt Active Directory Management Gateway Service downloaden en installeren op oudere domeincontrollers (legacy 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 ( Configuratiescherm) 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 samAccountnaambeste 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: reset het gebruikerswachtwoord van met behulp van PowerShell 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 hebben verschillende definities van wanneer een computer- (of gebruikersaccount, wat dan ook) als verouderd wordt beschouwd en niet langer kan worden gebruikt. Voor mij let ik op die accounts waarvan de wachtwoorden al een bepaalde periode niet zijn gewijzigd. 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 HTML-rapporten maken en e-mailen - 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 het enige dat overblijft is laatste tip: hoe u een aangepaste eigenschap definieert met de naam 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

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), in ieder geval moet een goede systeembeheerder ze identificeren, uitschakelen en vervolgens indien gewenst verwijderen, en dat is 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 op 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

0

Ik heb het volgende werkscript dat controleert of grote lijst gebruikers in het CSV-bestand als lid van de AD-groep en schrijft de resultaten naar results.csv.

Ik weet niet zeker hoe ik het script moet converteren, zodat ik $group = "InfraLite" kan veranderen in $group = DC .\List_Of_AD_Groups.CSV .

Het script retourneert dus niet alleen overeenkomsten voor één AD-groep, maar ook overeenkomsten voor de 80 AD-groepen in Lijst_van_AD_groepen.csv. Het schrijven van JA/NEE voor elke AD-groep in een nieuwe CSV-kolom (of als dit niet mogelijk is, zal het maken van een afzonderlijk CSV-bestand voor elke groep met de resultaten hetzelfde doen.

Ik zou dit handmatig kunnen doen door de waarde van $group en de naam van het exportbestand te wijzigen en het script 80 keer opnieuw uit te voeren, maar daarvoor zou ik snel moeten zijn met PS

bijvoorbeeld resultaten.csv?:

NAAM AD_GROUP1 AD_GROUP2 AD_GROUP80 enz. user1 ja nee ja user2 nee nee ja user3 nee ja nee echo "UserName`InfraLite" >> results.csv $users = GC .\user_list.csv $group = "InfraLite" $members = Get-ADGroupMember -Identity $group -Recursive |

  • Selecteer -ExpandProperty SAMAccountName foreach ($user in $users) ( if ($members -contains $user) ( echo "$user $group`tYes" >> resultaten.csv ) else ( echo "$user`tNo" >> resultaten .csv) )
  • 2 antwoorden

    Sorteren:

0

Activiteit

Een triviale oplossing voor uw probleem zou zijn om uw bestaande code in een andere lus te plaatsen en voor elke groep een uitvoerbestand te maken:

$groups = Get-Content "C:\groups.txt" foreach ($group in $groups) ( $members = Get-ADGroupMember ... ... )

Een elegantere aanpak zou zijn om een ​​groepstoewijzingssjabloon te maken, deze voor elke gebruiker te klonen en een kopie te vullen met de groepslidmaatschappen van de gebruiker. Zoiets zou moeten werken:

0

$template = @() Get-Content "C:\groups.txt" | ForEach-Object ( $template[$_] = $false ) $groups = @() Get-ADGroup -Filter * | ForEach-Object ( $groups[$_.DistinguishedName] = $_.Name ) Get-ADUser -Filter * -Eigenschappen MemberOf | ForEach-Object ( $groupmap = $template.Clone() $_.MemberOf | ForEach-Object ( $groups[$_] ) | Where-Object ( $groupmap.ContainsKey($_) ) | ForEach-Object ( $groupmap [$_] = $true ) Nieuw-Object -Type PSObject -Eigenschap $groupmap ) | Export-Csv "C:\user_group_mapping.csv" -NoType

Ik speel hier al een tijdje mee en ik denk dat ik een manier heb gevonden om je precies te geven wat je zocht. Ik denk dat Ansgar aan de beurt was de juiste manier

, maar ik kon het niet laten doen wat erna kwam. Hij geeft aan dat hij op het moment van schrijven geen toegang heeft tot de AD-omgeving.

$UserArray = Get-Content "C:\Temp\Users.txt" $GroupArray = Get-Content "C:\Temp\Groups.txt" $OutputFile = "C:\Temp\Something.csv" # Een hashtabel instellen voor later gebruik $UserHash = New-Object -TypeName System.Collections.Hashtable # Buitenste lus om gebruikers en lidmaatschap toe te voegen aan UserHash $UserArray | ForEach-Object( $UserInfo = Get-ADUser $_ -Properties MemberOf # Stript de LPAP-syntaxis tot alleen de SAMAccountName van de groep $Memberships = $UserInfo.MemberOf | ForEach-Object( ($_.Split(",")) .replace("CN=","") ) #Het User=Membership-paar toevoegen aan de Hash $UserHash.Add($_,$Memberships) ) #Buitenste lus om een ​​object per gebruiker te maken $Results = $UserArray | ForEach-Object( # Maak eerst een eenvoudig object $User = New-Object -TypeName PSCustomObject -Property @( Name = $_ ) # Voeg dynamisch leden toe aan het object, gebaseerd op de $GroupArray $GroupArray | ForEach-Object ( #Checking $UserHash om te zien of de groep wordt weergegeven in de ledenlijst van de gebruiker $UserIsMember = $UserHash.($User.Name) -bevat $_ #Eigenschap toevoegen aan object en waarde $User | Add-Member -MemberType NoteProperty -Name $ _ -Value $UserIsMember ) #Het object teruggeven aan de variabele Return $User ) #Converteer de objecten naar een CSV en voer ze vervolgens uit $Results |

Laten we hopen dat alles logisch is. Ik heb zoveel mogelijk commentaar gegeven. Het zou heel gemakkelijk zijn om naar ADSI te converteren als RSAT niet is geïnstalleerd op de computer waarop u dit gebruikt. Als je het nodig hebt, laat het me weten, dan breng ik snel wat wijzigingen aan.

Wordt gebruikt voor het maken, wijzigen en verwijderen van directoryobjecten. De gebruiker kan de opdracht ook gebruiken ldifde om het schema uit te breiden, Active Directory-gebruikers- en groepsgegevens naar andere toepassingen of services te exporteren en de Active Directory Application Mode (ADAM) -service 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 momenteel op het netwerk is ingelogd. 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

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 van de meesten te ontvangen en te verwerken verschillende bronnen- 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 de aanvraag vooraf klaar te maken door op de knop “bewerken” te klikken en de gewenste kolommen te selecteren. 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 de benodigde attributen van elke klasse selecteren met behulp van de "extensie" - een pictogram met twee pijlen in 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 te doen als het bedrijfsportaal niet vriendelijk is voor 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. Laten we een rapport maken over de besturingssystemen die door het bedrijf worden gebruikt: hiervoor zullen we een verzoek aanmaken, maar deze keer zullen we in de navigator selecteren 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 een samenvattend diagram toevoegen, 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