Hur man laddar ner en lista över användare från Active Directory. Använder Get-ADUser för att få diverse information om AD-domänanvändare

Skript för att ladda ner alla användare från MS Active Directory (ITGC)

Ivan Piskunov

En av de vanliga revisionsrutinerna ITGC för katalogen Active Directory är att få en nedladdning av alla domänanvändare. Baserat på erhållen data bildas sedan testprocedurer, till exempel genom att studera listan över administratörer eller identifiera användare med ett utgånget lösenord. Det mest effektiva sättet att skapa en sådan uppladdning skulle vara att använda ett standardgränssnitt PowerShell , exempel som vi kommer att överväga i den här artikeln

1. Snabbuppladdning med ett PowerShell-skript

Nedan finns ett PowerShell-skript som ett av de enklaste och snabbaste sätten att få en lista över alla AD-domänanvändare i CSV-format, som kan öppnas utan problem i Excel.

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = "LDAP://ou=Users,ou=Departmets,dc=test,dc=ru" $objSearcher.Filter = "(&(objectCategory=person) (!userAccountControl:1.2.840.113556.1.4.803:=2))" $users = $objSearcher.FindAll() # Antal konton $users.Count $users | ForEach-Object ( $user = $_.Properties New-Object PsObject -Property @( Position = $user.description Department = $user.department Login = $user.userprincipalname Telefon = $user.telephonenumber Rum = $user.physicaldeliveryofficename Fullständig namn = $user.cn ) ) | Export-Csv -NoClobber -Encoding utf8 -Path C: list_domain_users.csv

För att skriptet ska fungera på ditt system måste du korrigera det något, nämligen ange de nödvändiga parametrarna, dvs. som i detta exempel är dessa parametrar Användare på avdelningen Avdelningar i domänen Test.ru. Och ange även sökvägen till där filen sparas list_domain_users.csv

Efter lossning, om du öppnar den omedelbart list_domain_users.csv , kommer dock att se oläslig ut, men med hjälp av standardmedel kan vi enkelt föra den till det format vi behöver. Öppna i Excel list_domain_users.csv , välj den första kolumnen, gå sedan till fliken "Data" och klicka på "Text efter kolumner". Välj "avgränsad" och klicka på "Nästa". Redo!

!Det är nödvändigt att notera att detta skript inte kommer att visa fler än 1000 användare. Det är ganska lämpligt för ett litet företag, men för de som har ett stort antal användare i sin domän bör de tillgripa metoderna som beskrivs nedan.

2. Avancerad PowerShell-cmdlet för att hämta Active Directory-användaruppladdningar

Active Directory Module for Windows PowerShell-verktyget (introducerat i Windows Server 2008 R2 och högre) låter dig skapa cmdlets som utför olika manipulationer med AD-katalogobjekt. Cmdleten används för att få information om användare och deras egenskaper Get-ADUser.

Att börja starta ett Powershell-fönster med administratörsrättigheter och importera Active Directory-modulen för ytterligare åtgärder:
Import-Modul activedirectory

Till lista alla domänkonton Låt oss köra kommandot:

Get-ADUser -filter *

Till visa fullständig information om alla tillgängliga attribut användaranvändare, kör kommandot

Get-ADUser -identity tuser -egenskaper *


Vi är till exempel intresserade av information om datum för lösenordsändring och tid när det upphör . Resultatet av kommandot kan exporteras till en textfil:

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

Eller direkt ladda upp till CSV , vilket kommer att vara bekvämt att exportera till Excel i framtiden (dettare, med hjälp av sort-object kommer vi att sortera tabellen efter kolumnen PasswordLastSet och även lägga till ett where-villkor - användarnamnet måste innehålla strängen "Dmitry")

Get-ADUser -filter * -egenskaper PasswordExpired, PasswordLastSet, PasswordNeverExpires | där ($_.name –som “*Dmitry*”) | sort-object PasswordLastSet | select-object Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires | Export-csv -sökväg c:tempuser-password-expires-2015.csv

I kommentarerna till föregående artikel kom vi ihåg redovisning i Excel istället för 1C. Tja, låt oss kolla hur mycket du kan Excel. Idag ska jag visa dig hur du hämtar data från Active Directory och arbetar med det utan makron och PowerShell – bara med vanliga Office-mekanismer. Du kan till exempel enkelt få analyser om användningen av operativsystem i din organisation om du inte redan har något som Microsoft SCOM. Tja, eller bara värm upp och ta tankarna bort från manusen.


Naturligtvis kan du få data som i exemplen nedan bokstavligen med en rad i PowerShell. Men för det första är PowerShell för tråkigt, och för det andra kan Excel dynamiskt uppdatera data - de resulterande dokumenten kan publiceras online och glömma att uppdatera dem.

För att arbeta med data kommer jag att använda Power Query-mekanismen. För Office 2010 och 2013 måste du installera ett plugin Microsoft Office 2016 har redan denna modul inbyggd. Tyvärr räcker inte standardutgåvan för oss, vi kommer att behöva Professional.


Mekanismen i sig är utformad för att ta emot och bearbeta data från en mängd olika källor - från gamla ODBC- och textfiler, till Exchange, Oracle och Facebook. Mer information om mekanismen och det inbyggda skriptspråket "M" har redan skrivits på Habré, men jag ska titta på ett par exempel på hur man använder Power Query för att hämta data från Active Directory.

Uppvärmning: Låt oss se när våra användare loggat in

Förfrågan till själva domändatabasen skapas på fliken "Data ― Ny begäran ― Från andra källor ― Från Active Directory".



Ange datakällan.


Du måste välja ett domännamn och ange nödvändig anslutningsinformation. Därefter kommer vi att välja typen av objekt, i det här exemplet - användare. Till höger i förhandsgranskningsfönstret körs frågan redan och visar en förhandsgranskning av data.



Vi förbereder en förfrågan och beundrar förhandsvisningen.


Du bör förbereda begäran i förväg genom att klicka på knappen "redigera" och välja önskade kolumner. Dessa kolumner är i huvudsak klasser. Var och en av dem innehåller en uppsättning specifika attribut för ett Active Directory-objekt, förutom huvudkolumnen visningsnamn, vilket i sig är ett attribut. Jag kommer att fokusera på klasser användare, person, topp Och säkerhetRektor. Nu måste du välja de nödvändiga attributen från varje klass med hjälp av "tillägget" - en ikon med två pilar vid kolumnrubriken:

  • Klass användare utöka genom att välja lastLogonTimestamp Och userAccountControl;
  • V person låt oss välja telefonnummer;
  • V toppnär den skapades;
  • och i säkerhetRektorSamAccountName.


Vi utökar begäran.


Låt oss nu ställa in filtret: i synnerhet, för att inte få blockerade konton, måste userAccountControl-attributet ha ett värde på 512 eller 66048. Filtret kan vara annorlunda i din miljö. Du kan läsa mer om attributet i Microsofts dokumentation.



Använda ett filter.


Ibland upptäcker Excel dataformatet felaktigt, särskilt värdet på lastLogonTimestamp-attributet. Om en sådan olycka plötsligt drabbar dig kan du ställa in rätt format på fliken "Konvertera".

Nu ska userAccountControl-kolumnen raderas - den behövs inte alls i displayen. Och klicka på "Ladda ner och stäng".


Resultatet är en tallrik som bara behöver lite finputsning. Döp till exempel om kolumnerna till något mer läsbart. Och ställ in automatisk datauppdatering.


Automatisk uppdatering vid öppning av en tabell eller vid timeout konfigureras på fliken "Data" i "Egenskaper".



Ställer in datauppdatering.


Efter att inställningen av uppdateringen är klar kan du säkert ge tabellen till personalavdelningen eller säkerhetstjänsten - låt dem veta vem som loggat in i systemet och när.


Förfrågningskoden på "M"-språket finns under spoilern.

let Source = ActiveDirectory.Domains("domain.ru"), domain.ru = Source()[#"Objektkategorier"], user1 = domain.ru(), #"Remote Columns" = Table.RemoveColumns(user1,( "organizationalPerson", "shadowAccount", "posixAccount", "msExchOmaUser", "msExchBaseClass", "msExchIMRecipient", "msExchCertificateInformation", "msExchMultiMediaUser", "msExchMailStorage", "msExchCustomAttributes", "mailRecipiented", "mailRecipiented" #"Expanded element securityPrincipal" = Table.ExpandRecordColumn(#"Removed columns", "securityPrincipal", ("sAMAccountName"), ("sAMAccountName")), #"Expanded element top" = Table.ExpandRecordColumn(#"Expanded element securityPrincipal ", "top", ("whenCreated"), ("whenCreated")), #"Expanded element person" = Table.ExpandRecordColumn(#"Expanded element top", "person", ("telephoneNumber"), ("telephoneNumber ")), #"Expanded element user" = Table.ExpandRecordColumn(#"Expanded element person", "user", ("lastLogonTimestamp", "userAccountControl"), ("lastLogonTimestamp", "userAccountControl")), #"Rows med filter tillämpat" = Table.SelectRows(#"Utökat användarelement", vardera ( = 512 eller = 66048)), #"Ändrad typ" = Table.TransformColumnTypes(#"Rader med filter tillämpat",(("lastLogonTimestamp", skriv datetime))), #"Remoted columns1" = Table.RemoveColumns(#"Changed type",("userAccountControl")) i #"Remoted columns1"

Skapa en adressbok, eller vad man ska göra när företagsportalen inte är vän med AD

Ett annat alternativ för att använda Excel i kombination med Active Directory är att skapa en adressbok baserad på AD-data. Det är klart att adressboken kommer att vara uppdaterad endast om domänen är i ordning.


Låt oss skapa en begäran om ett objekt användare, utöka klassen användare V post, och klass person V telefonnummer. Låt oss ta bort alla kolumner utom distinguishedName― domänstrukturen upprepar företagets struktur, så namnen Organisatoriska enheter motsvarar avdelningarnas namn. På samma sätt kan säkerhetsgrupper användas som grund för avdelningsnamn.


Nu från linjen CN=Användarnamn, OU=Redovisningsavdelning, OU=Divisioner, DC=domän, DC=ru du måste extrahera avdelningsnamnet direkt. Det enklaste sättet att göra detta är att använda avgränsningstecken på fliken Transform.



Extraherar texten.


Som avgränsare använder jag OU= Och ,OU=. I princip räcker det med komma, men jag spelar det säkert.



Ange avgränsare.


Nu genom att använda filtret kan du skära bort onödigt OU, som blockerade användare och inbyggt, konfigurera sortering och ladda data i tabellen.



Vy över sammanfattningstabellen.

Snabbrapport om arbetsstationernas sammansättning, utan införande av medel eller andra förberedelser

Låt oss nu försöka skapa en användbar tabell genom att hämta data på datorer. Låt oss göra en rapport om de operativsystem som används av företaget: för detta kommer vi att skapa en begäran, men den här gången väljer vi i navigatorn dator.



Vi gör en begäran om datorobjektet.


Låt oss lämna kolumnklasserna dator Och topp och utöka dem:

  • Klass dator utöka genom att välja cn, operativ system, operativsystemServicePack Och operativsystemversion;
  • på lektionen topp låt oss välja när den skapades.


Avancerad begäran.


Om så önskas kan du endast göra en rapport om serveroperativsystem. Filtrera till exempel efter operativsystem eller operativsystemVersion attribut. Jag kommer inte att göra det här, men jag kommer att korrigera visningen av skapelsetiden - jag är bara intresserad av året. För att göra detta, på fliken "Konvertering", välj den kolumn vi behöver och välj "År" i menyn "Datum".



Vi extraherar årtalet från det att datorn gick in i domänen.


Nu återstår bara att ta bort visningsnamnkolumnen som onödig och ladda resultatet. Uppgifterna är klara. Nu kan du arbeta med dem som med ett vanligt bord. Låt oss först skapa en pivottabell på fliken "Infoga" - "Pivottabell". Låt oss godkänna valet av datakälla och konfigurera dess fält.



Pivottabellfältinställningar.


Nu återstår bara att anpassa designen efter din smak och beundra resultatet:



Sammanfattningstabell för datorer i AD.


Om så önskas kan du lägga till ett sammanfattande diagram, även på fliken Infoga. Lägg till i "Kategori" (eller i "Rader", efter smak). operativ system, till data ― cn. På fliken "Design" kan du välja vilken typ av diagram du gillar. Jag föredrog cirkeldiagrammet.



Tårtdiagram.


Nu syns det tydligt att, trots den pågående uppdateringen, det totala antalet arbetsstationer med Windows XP och servrar med Windows 2003 är ganska stort. Och det finns något att sträva efter.


Förfrågningskoden finns under spoilern.

let Source = ActiveDirectory.Domains("domain.ru"), domain.ru = Source()[#"Objektkategorier"], computer1 = domain.ru(), #"Remote Columns" = Table.RemoveColumns(computer1,( "user", "organizationalPerson", "person")), #"Andra borttagna kolumner" = Tabell.SelectColumns(#"Fjärrkolumner",("displayName", "dator", "top")), #"Expandera objekt computer" = Table.ExpandRecordColumn(#"Andra fjärrkolumner", "dator", ("cn", "operativsystem", "operativSystemServicePack", "operativSystemVersion"), ("cn", "operativsystem", "operativSystemServicePack", " operatingSystemVersion")), #"Utökad topp" = Table.ExpandRecordColumn(#"Utökad dator", "top", ("whenCreated"), ("whenCreated")), #"Extraherat år" = Table.TransformColumns( #" Utökat element top",(("whenCreated", Date.Year))), #"Remoted columns1" = Table.RemoveColumns(#"Extracted year",("displayName")) in #"Remoted columns1"

Lägg till etiketter Används för att skapa, redigera och ta bort katalogobjekt. Användaren kan också använda kommandot ldifde för att utöka schemat, exportera Active Directory-användar- och gruppinformation till andra applikationer eller tjänster och fylla ADAM-tjänsten (Active Directory Application Mode) med data från andra katalogtjänster.

Syntax

ldifde [-jag] [-f filnamn] [-s server namn] [-c rad1 rad2] [-v] [-j väg] [-t portnummer] [-d DN_bas] [-r filter_LDAP] [-s område] [-l LDAP_attribute_list] [-o LDAP_attribute_list] [-g] [-m] [-n] [-k] [-a ] [-b ] [-? ]

alternativ

-jag Anger importläget. Om parametern inte är definierad används exportläget som standard. -ffilnamn Anger namnet på import- eller exportfilen. -sserver namn Anger på vilken dator importen eller exporten ska utföras. Standardprogram ldifde kommer att köras på den dator som ldifde installerat. -crad1 rad2 Ersätter alla händelser linjer 1 innehåll linjer 2. Används vanligtvis när du importerar data från en domän till en annan och behöver ersätta det distinguerade namnet på domänen som exporterar ( linje 1), importerar domännamn ( linje 2). -v Aktiverar detaljerad loggningsläge. -jväg Anger platsen för loggfilen. Standard är den aktuella sökvägen. -tportnummer Anger LDAP-portnumret (Lightweight Directory Access Protocol). Standard-LDAP-porten är 389. Den globala katalogporten är 3268. -dDN_bas Anger sökbasens distinguerade namn för export av data. -rLDAP-filter Skapar ett LDAP-sökfilter för dataexport. Till exempel exporterar följande filter alla användare med ett specifikt mellannamn: csvde -r (och(objectClass=Användare)(sn=Efternamn)) -sområde Anger sökområdet. Sökomfångsparametrarna är Bas, OneLevel Och Underträd. -lLDAP_attribute_list Anger listan över attribut som returneras i resultaten av exportförfrågan. Om denna parameter utelämnas returneras alla attribut. -oLDAP_attribute_list Anger en lista med attribut som ska utelämnas från exportförfrågningsresultaten. Det här alternativet används vanligtvis när du exporterar objekt från Active Directory och sedan importerar dem till en annan LDAP-kompatibel katalog. Om några attribut inte stöds av en annan katalog kan de exkluderas från resultatuppsättningen med det här alternativet. -g Eliminerar sidsökningar. -m Utelämnar attribut som inte går att skriva, som t.ex ObjektGUID Och objektSID. -n Utelämnar export av binära värden. -k Ignorerar fel under importen och fortsätter bearbetningen. Följande är en komplett lista över ignorerade fel:

  • objektet är redan medlem i gruppen;
  • en objektklassöverträdelse (vilket betyder att den angivna objektklassen inte existerar) om det importerade objektet inte har några andra attribut;
  • objektet finns redan;
  • brott mot begränsningen;
  • attributet eller värdet finns redan;
  • inget sådant objekt existerar.
-adistinguished_name_password Anger exekvering av ett kommando med det angivna distinguished_name_user_name Och Lösenord -b. -banvändarnamn domän lösenord Anger kommandot som ska köras med det angivna användarnamn, domän och lösenord. Som standard kommer kommandot att utföras med hjälp av användaruppgifterna för den användare som för närvarande är inloggad på nätverket. Kan inte användas med parameter -a. -? Visar en meny med kommandon.

Anteckningar

  • Med parameter -c du kan använda konstanter #schemaNamingContext Och #configurationNamingContext istället för de distingerade namnen på schemakatalogpartitionen och.
  • När du skapar en importfil för ett kommando ldifde, använd värdet changeType för att fastställa vilken typ av ändringar som ingår i importfilen. Värderingar changeType anges i tabellen nedan.

Nedan är ett exempel på en LDAP-importfil i LDIF-format som använder värdet Lägg till:
DN: CN=vald_användare,DC=domän namn
ändringstyp: Lägg till
CN: vald_användare
beskrivning:Filbeskrivning
objektklass: användare
objektklass: vald_användare

Exempel

Om du bara vill extrahera det unika namnet, vanligt namn, förnamn, efternamn och telefonnummer för de returnerade objekten anger du:
-l distinguished_name, CN, namn, S.N. telefon
För att utesluta en globalt unik identifierare (GUID) för ett objekt anger du:
-o när_skapats, när_ändrades, objekt_GUID

0

Jag har följande arbetsskript som kontrollerar om en stor lista med användare i en CSV-fil är medlem i en AD-grupp och skriver resultaten till results.csv.

Osäker på hur man konverterar skriptet så att jag kan ändra $group = "InfraLite" till $group = DC .\List_Of_AD_Groups.CSV .

Så skriptet returnerar inte bara matchningar för en AD-grupp, utan så det returnerar matchningar för de 80 AD-grupperna som finns i List_of_AD_groups.csv. Att skriva JA/NEJ för varje AD-grupp i en ny CSV-kolumn (eller om detta inte är möjligt, skapa en separat CSV-fil för varje grupp med resultaten gör detsamma.

Jag skulle kunna göra detta manuellt genom att ändra värdet från $group och exportfilens namn och köra skriptet igen 80 gånger, men jag måste vara snabb med PS för att göra detta

till exempel results.csv?:

NAMN AD_GROUP1 AD_GROUP2 AD_GROUP80 etc etc. användare1 ja nej ja användare2 nej nej ja användare3 nej ja nej eko "UserName`InfraLite" >> results.csv $users = GC .\user_list.csv $group = "InfraLite" $members = Get-ADGroupMember -Identity $group -Rekursiv | Välj -ExpandProperty SAMAccountName foreach ($user i $users) ( if ($members -contains $user) ( echo "$user $group`tYes" >> results.csv ) else ( echo "$user`tNo" >> results .csv) )

  • 2 svar
  • Sortering:

    Aktivitet

0

En trivial lösning på ditt problem skulle vara att slå in din befintliga kod i en annan slinga och skapa en utdatafil för varje grupp:

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

Ett mer elegant tillvägagångssätt skulle vara att skapa en gruppmappningsmall, klona den för varje användare och fylla i en kopia med användarens gruppmedlemskap. Något sånt här borde fungera:

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

0

Jag har lekt med det här ett tag och jag tror att jag hittade ett sätt att få dig exakt vad du var ute efter.

Jag tror att Ansgar var på rätt väg, men jag kunde inte få den att göra det som kom efter. Han nämnde att han i skrivande stund inte hade tillgång till AD-miljön.

Här är vad jag kom på:

$UserArray = Get-Content "C:\Temp\Users.txt" $GroupArray = Get-Content "C:\Temp\Groups.txt" $OutputFile = "C:\Temp\Something.csv" # Konfigurera en hashtabell för senare användning $UserHash = New-Object -TypeName System.Collections.Hashtable # Ytterslinga för att lägga till användare och medlemskap i UserHash $UserArray | ForEach-Object( $UserInfo = Get-ADUser $_ -Properties MemberOf # Skalar LPAP-syntaxen till bara SAMAccountName för gruppen $Memberships = $UserInfo.MemberOf | ForEach-Object((($_.Split(",")) .replace("CN=","") ) #Lägga till User=Medlemskapsparet till hashen $UserHash.Add($_,$Memberships) ) #Ytterslinga för att skapa ett objekt per användare $Results = $UserArray | ForEach-Object( # Skapa först ett enkelt objekt $User = New-Object -TypeName PSCustomObject -Property @( Name = $_ ) # Lägg dynamiskt till medlemmar till objektet, baserat på $GroupArray $GroupArray | ForEach-Object ( #Checking $UserHash för att se om gruppen dyker upp i användarens medlemslista $UserIsMember = $UserHash.($User.Name) -innehåller $_ #Adding egenskap till objekt och värde $User | Add-Member -MemberType NoteProperty -Name $ _ -Value $UserIsMember ) #Återföra objektet till variabeln Returnera $User ) #Konvertera objekten till en CSV och mata ut dem $Results |

Låt oss hoppas att allt är vettigt. Jag kommenterade så mycket jag kunde. Det skulle vara mycket lätt att konvertera till ADSI om du inte hade RSAT installerat på vilken maskin du än kör detta på. Om du behöver det, låt mig veta så gör jag några snabba ändringar.