Slik laster du ut en liste over brukere fra Active Directory. Bruke Get-ADUser for å få forskjellig informasjon om AD-domenebrukere

Skript for å laste ut alle brukere fra MS Active Directory (ITGC)

Ivan Piskunov

En av standard revisjonsprosedyrer ITGC for katalog Active Directory er å få nedlasting av alle brukere av domenet. Basert på dataene som mottas, blir testprosedyrer dannet, for eksempel ved å studere listen over administratorer eller identifisere brukere med et utløpt passord. Den mest effektive måten å lage en slik lossing på vil være å bruke standardgrensesnittet Kraftskall , eksempler som vi vil vurdere i denne artikkelen

1. Ekspressopplasting med PowerShell-skript

Nedenfor er et PowerShell-skript som en av de enkleste og raskeste måtene å få en liste over alle brukere av et AD-domene i CSV-format, som kan åpnes uten problemer av samme Excel.

$ objSearcher = New-Object System.DirectoryServices.DirectorySearcher $ objSearcher.SearchRoot = "LDAP: // ou = Brukere, ou = Avdelinger, dc = test, dc = ru" $ objSearcher.Filter = "(& (objectCategory = person) (! userAccountControl: 1.2.840.113556.1.4.803: = 2)) "$ brukere = $ objSearcher.FindAll () # Antall kontoer $ users.Count $ users | ForEach-Object ($ bruker = $ _. Egenskaper New-Object PsObject -Property @ (Tittel = $ user.description Avdeling = $ user.department Logg inn = $ user.userprincipalname Telefon = $ user.telephonenumber Rom = $ user.physicaldeliveryofficename Fullstendig navn = $ bruker.cn)) | Export-Csv -NoClobber -Encoding utf8 -Path C: list_domen_users.csv

For at skriptet skal fungere på systemet ditt, må du korrigere det litt, nemlig angi de nødvendige parameterne, dvs. som i dette eksemplet er dette parametere Brukere i enheten Avdelinger i domenet Test.ru. Og spesifiser også banen til stedet der filen er lagret list_domen_users.csv

Etter lossing, hvis du åpner umiddelbart list_domen_users.csv , vil se ut i en uleselig form, men med standard midler kan vi enkelt bringe den inn i formatet vi trenger. Åpning i Excel list_domen_users.csv , velg den første kolonnen, gå deretter til "Data"-fanen og klikk på "Tekst etter kolonner". Velg "avgrenset" og klikk "Neste". Klar!

! Det bør merkes at dette skriptet ikke vil vise mer enn 1000 brukere. Det er ganske egnet for et lite selskap, men de som har et stort antall brukere i domenet bør bruke metodene beskrevet nedenfor.

2. Avansert PowerShell-cmdlet for å få avlastede Active Directory-brukere

Active Directory Module for Windows PowerShell-verktøyet (introdusert i Windows Server 2008 R2 og nyere) lar deg generere cmdlets som utfører ulike manipulasjoner med AD-katalogobjekter. For å få informasjon om brukere og deres egenskaper, bruk cmdleten Get-ADUser.

Å starte start et Powershell-vindu med administratorrettigheter og importer Active Directory-modulen for ytterligere handlinger:
Import-Module activedirectory

Til liste opp alle domenekontoer a, la oss utføre kommandoen:

Get-ADUser -filter *

Til vise fullstendig informasjon om alle tilgjengelige attributter bruker bruker, kjør kommandoen

Get-ADUser -identitet bruker -egenskaper *


Vi er for eksempel interessert i informasjon om datoen passordet ble endret og tidspunktet da det utløper ... Resultatet av kommandoutførelsen kan eksporteres til en tekstfil:

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

Eller med en gang last opp til CSV , som i fremtiden vil være praktisk å eksportere til Excel (i tillegg, ved å bruke sorteringsobjektet, vil vi sortere tabellen etter PasswordLastSet-kolonnen, og også legge til where-betingelsen - brukernavnet må inneholde strengen "Dmitry")

Get-ADUser -filter * -egenskaper PasswordExpired, PasswordLastSet, PasswordNeverExpires | hvor ($ _. navn –som "* Dmitry *") | sort-objekt PassordLastSet | select-object Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires | Export-csv -path c: tempuser-password-expires-2015.csv

I kommentarene til forrige artikkel husket de på regnskap i Excel i stedet for 1C. Vel, la oss sjekke hvor mye du kan Excel. I dag skal jeg vise deg hvordan du henter data fra Active Directory og jobber med det uten makroer og PowerShell – kun med standard Office-mekanismer. For eksempel kan du enkelt få analyser om bruken av operativsystemer i organisasjonen din hvis du ikke allerede har noe som Microsoft SCOM. Vel, eller bare varme opp og distrahere fra manus.


Selvfølgelig kan du få dataene som i eksemplene nedenfor på bare én linje i PowerShell. Men for det første er PowerShell for kjedelig, og for det andre er Excel i stand til å dynamisk oppdatere data - de resulterende dokumentene kan publiseres på nettverket og glemme å oppdatere dem.

For å jobbe med data vil jeg bruke Power Query-motoren. For office 2010 og 2013 må du installere en plug-in, i Microsoft Office 2016 er denne modulen allerede innebygd. Standardutgaven er dessverre ikke nok for oss, vi trenger Professional.


Selve mekanismen er designet for å motta og behandle data fra en rekke kilder – fra gamle ODBC- og tekstfiler, til Exchange, Oracle og Facebook. Flere detaljer om mekanismen og det innebygde skriptspråket "M" er allerede skrevet på Habré, men jeg skal analysere et par eksempler på bruk av Power Query for å hente data fra Active Directory.

Oppvarming: se når brukerne våre logget på

Spørringen til selve domenedatabasen opprettes på fanen "Data - Ny spørring - Fra andre kilder - Fra Active Directory".



Vi angir datakilden.


Du må velge et domenenavn, spesifisere nødvendige data for tilkobling. Deretter velger du typen objekter, i dette eksemplet - bruker... På høyre side av forhåndsvisningsvinduet kjører spørringen allerede, og viser en forhåndsvisning av dataene.



Forbereder forespørselen, beundrer forhåndsvisningen.


Spørringen bør forberedes på forhånd ved å klikke på "endre"-knappen og velge de nødvendige kolonnene. Faktisk er disse kolonnene klasser. Hver av dem inneholder et sett med spesifikke attributter for Active Directory-objektet, i tillegg til hovedkolonnen displaynavn som i seg selv er en egenskap. Jeg vil fokusere på timene bruker, person, topp og sikkerhetRektor... Nå må du velge de nødvendige attributtene fra hver klasse ved å bruke "utvidelsen" - ikonet med to piler ved kolonneoverskriften:

  • Klasse bruker utvide ved å velge lastLogonTimestamp og brukerkonto-kontroll;
  • v person velge telefonnummer;
  • v toppnår opprettet;
  • og i sikkerhetRektorSamAccountName.


Utvider forespørselen.


La oss nå konfigurere filteret: spesielt, for ikke å få blokkerte kontoer, trenger du at userAccountControl-attributtet har en verdi på 512 eller 66048. Filteret kan være annerledes i ditt miljø. Du kan lese mer om attributtet i Microsoft-dokumentasjonen.



Bruk et filter.


Noen ganger bestemmer Excel formatet til dataene feil, spesielt verdien av lastLogonTimestamp-attributtet. Hvis det plutselig skjedde en slik ulykke, kan du angi riktig format på "Konverter"-fanen.

Nå skal userAccountControl-kolonnen fjernes - den er ikke nødvendig i displayet i det hele tatt. Og klikk "Last inn og lukk".


Resultatet er en tallerken, som det gjenstår ganske mye å tenke på. Gi for eksempel nytt navn til kolonnene til noe lesbart. Og sett opp automatiske dataoppdateringer.


Automatisk oppdatering ved åpning av en tabell eller ved tidsavbrudd er konfigurert i "Data"-fanen i "Egenskaper".



Konfigurerer dataoppdatering.


Etter at konfigureringen av oppdateringen er fullført, kan du trygt gi tabellen til personalavdelingen eller sikkerhetstjenesten - la dem få vite hvem og når du er logget på systemet.


Be om kode på "M"-språket under spoileren.

la Source = ActiveDirectory.Domains ("domain.ru"), domain.ru = Kilde () [# "Objektkategorier"), bruker1 = domain.ru (), # "Eksterne kolonner" = Table.RemoveColumns (bruker1, ( "organizationalPerson", "shadowAccount", "posixAccount", "msExchOmaUser", "msExchBaseClass", "msExchIMRecipient", "msExchCertificateInformation", "msExchMultiMediaUser", "msExchMailStorage", "msExchCustomAttributes" = "Security.ExpandPrin" # "Slettede kolonner", "securityPrincipal", ("sAMAccountName"), ("sAMAccountName"), # "Top Expanded" = Table.ExpandRecordColumn (# "SecurityPrincipal Expanded "," topp ", (" whenCreated "), ( " whenCreated ")), #" Expanded person "= Table.ExpandRecordColumn (#" Expanded top "," person ", ("phoneNumber "), ("phoneNumber ")), #" Expand user "= Table.ExpandRecordColumn (# " Utvidet person "," bruker ", (" lastLogonTimestamp "," userAccountControl " ), ("lastLogonTimestamp", "userAccountControl")), # "Filtered Rows" = Table.SelectRows (# "Utvidet bruker", hver (= 512 eller = 66048)), # "Modified Type" = Tabell. TransformColumnTypes (# "Filtrerte rader", (("lastLogonTimestamp", skriv datetime))), # "Deleted Columns1" = Table.RemoveColumns (# "Type endret", ("userAccountControl")) i # "Deleted Columns1"

Lag en adressebok, eller hva du skal gjøre når bedriftsportalen ikke er vennlig med AD

Et annet alternativ for å bruke Excel i forbindelse med Active Directory er dannelsen av en adressebok basert på AD-data. Det er klart at adresseboken vil være oppdatert kun dersom det er orden på domenet.


La oss lage en forespørsel om et objekt bruker, utvide klassen bruker v post og klassen person v telefonnummer... Slett alle kolonner unntatt distinguishedName- strukturen til domenet gjentar strukturen til bedriften, derfor navnene Organisasjonsenheter samsvarer med navnene på avdelingene. Tilsvarende kan sikkerhetsgrupper brukes som grunnlag for organisasjonsenhetsnavn.


Nå fra linjen CN = Brukernavn, OU = Regnskapsavdeling, OU = Avdeling, DC = domene, DC = ru du må trekke ut navnet på avdelingen direkte. Den enkleste måten å gjøre dette på er å bruke skilletegn på Transform-fanen.



Vi trekker ut teksten.


Som separatorer bruker jeg OU = og , OU =... I prinsippet er det nok med komma, men jeg er gjenforsikret.



Skriv inn skilletegn.


Nå bruker du filteret, kan du kutte av unødvendig OU som blokkerte brukere og Innebygd, sett opp sortering og last inn data i tabellen.



Sammendragstabellvisning.

Rask rapport om sammensetning av arbeidsstasjoner, uten introduksjon av midler og andre forberedelser

La oss nå prøve å lage en nyttig tabell ved å skaffe data på datamaskiner. La oss lage en rapport om operativsystemene som brukes av selskapet: for dette vil vi opprette en forespørsel, men i navigatoren vil vi denne gangen velge datamaskin.



Vi gjør en forespørsel om datamaskinen.


La oss forlate kolonneklassene datamaskin og topp og utvide dem:

  • Klasse datamaskin utvide ved å velge cn, operativsystem, operativsystemServicePack og operativsystemversjon;
  • i klassen topp velge når opprettet.


Utvidet spørring.


Om ønskelig kan du lage en rapport kun på serveroperativsystemer. Filtrer for eksempel etter operativsystem eller operativsystemversjon. Jeg vil ikke gjøre dette, men jeg vil rette opp visningen av opprettelsestidspunktet - jeg er kun interessert i året. For å gjøre dette, på "Konvertering"-fanen, velg ønsket kolonne og velg "År" i "Dato"-menyen.



Vi trekker ut året fra tidspunktet datamaskinen kom inn på domenet.


Nå gjenstår det bare å fjerne visningsnavn-kolonnen som unødvendig og laste inn resultatet. Dataene er klare. Nå kan du jobbe med dem som med et vanlig bord. La oss først lage en pivottabell på fanen "Sett inn" - "Pivottabell". La oss godta valget av datakilden og konfigurere feltene.



Innstillinger for pivottabellfelt.


Nå gjenstår det å tilpasse designet til din smak og beundre resultatet:



Sammendragstabell for datamaskiner i AD.


Om ønskelig kan du legge til et pivotdiagram, også på "Sett inn"-fanen. I "Kategorier" (eller "rader", etter smak) legg til operativsystem, inn i dataene - cn... På "Design"-fanen kan du velge type diagram etter eget ønske, jeg foretrakk det sirkulære.



Kake diagram.


Nå kan du tydelig se at, til tross for den pågående oppdateringen, er det totale antallet arbeidsstasjoner med Windows XP og servere med Windows 2003 ganske stort. Og det er noe å strekke seg etter.


Be om kode under spoileren.

la Source = ActiveDirectory.Domains ("domain.ru"), domain.ru = Kilde () [# "Objektkategorier"], computer1 = domain.ru (), # "Remote Columns" = Table.RemoveColumns (datamaskin1, ( "user", "organizationalPerson", "person")), # "Andre slettede kolonner" = Tabell.Velg kolonner (# "Slettede kolonner", ("displayName", "datamaskin", "øverst")), # "Utvidet element datamaskin "= Table.ExpandRecordColumn (#" Andre eksterne kolonner "," datamaskin "," cn "," operativsystem "," operativsystemSystemServicePack "," operativsystemVersjon "), ("cn "," operativsystem "," operativsystemSystemServicePack "," operativsystemversjon ")), #" Utvidet topp "= Table.ExpandRecordColumn (#" Utvidet datamaskin "," topp ", (" whenCreated "), (" whenCreated ")), #" Hentet år "= Table.TransformColumns ( # " Utvidet topp", (("whenCreated", Date.Year))), # "Deleted Columns1" = Table.RemoveColumns (# "Retrieved Year", ("displayName") i # "Deleted Columns1"

Legg til etiketter Brukes til å opprette, endre og slette katalogobjekter. Brukeren kan også bruke kommandoen ldifde for å utvide skjemaet, eksportere Active Directory-bruker- og gruppeinformasjon til andre applikasjoner eller tjenester, og fylle ut Active Directory Application Mode (ADAM) med data fra andre katalogtjenester.

Syntaks

ldifde [-Jeg] [-f Filnavn] [-s Server navn] [-c linje1 linje2] [-v] [-j vei] [-t portnummer] [-d DN_base] [-r LDAP_filter] [-s region] [-l LDAP_attribute_list] [-o LDAP_attribute_list] [-g] [-m] [-n] [-k] [-en ] [-b ] [-? ]

Alternativer

-Jeg Bestemmer importmodus. Hvis parameteren ikke er spesifisert, brukes eksportmodusen som standard. -fFilnavn Angir navnet på import- eller eksportfilen. -sServer navn Angir datamaskinen som import- eller eksportoperasjonen skal utføres på. Som standard programmet ldifde vil kjøre på datamaskinen som ldifde installert. -clinje1 linje2 Erstatter alle forekomster strenger1 innhold strenger 2... Brukes vanligvis når du importerer data fra ett domene til et annet, og samtidig er det nødvendig å erstatte det unike navnet på det eksporterende domenet ( streng1), navnet på det importerende domenet ( streng2). -v Aktiverer detaljert loggingsmodus. -jvei Angir plasseringen av loggfilen. Standard er gjeldende bane. -tportnummer Angir LDAP-portnummeret (Lightweight Directory Access Protocol). Standard LDAP-port er 389. Den globale katalogporten er 3268. -dDN_base Angir det unike navnet på søkebasen for eksport av data. -rLDAP-filter Oppretter et LDAP-søkefilter for eksport av data. For eksempel, ved å bruke følgende filter, eksporteres alle brukere med et spesifikt mellomnavn: csvde -r (og (objectClass =Bruker) (sn =mellomnavn)) -sregion Angir omfanget av søket. Parametere for søkeomfang er Utgangspunkt, OneLevel og Undertre. -lLDAP_attribute_list Angir listen over attributter som skal returneres i resultatene av en eksportforespørsel. Hvis denne parameteren utelates, returneres alle attributter. -oLDAP_attribute_list Angir en liste over attributter som skal utelates fra resultatene av en eksportspørring. Vanligvis brukes denne parameteren når du eksporterer objekter fra Active Directory og deretter importerer dem til en annen LDAP-kompatibel katalog. Hvis noen attributter ikke støttes av en annen katalog, kan de ekskluderes fra resultatsettet ved å bruke denne parameteren. -g Ekskluderer paginerte søk. -m Å utelate attributter som ikke kan skrives, som f.eks ObjektGUID og objektSID. -n Utelat eksport av binære verdier. -k Ignorerer feil under importoperasjonen og fortsetter behandlingen. Følgende er en fullstendig liste over ignorerte feil:

  • objektet er allerede medlem av gruppen;
  • brudd på en objektklasse (som betyr at den angitte objektklassen ikke eksisterer) hvis det importerte objektet ikke har andre attributter;
  • objektet eksisterer allerede;
  • brudd på begrensningen;
  • attributtet eller verdien eksisterer allerede;
  • ingen slik gjenstand finnes.
-enbrukernavnpassord Spesifiserer utførelsen av en kommando ved å bruke den spesifiserte bruker distinguished_name og passord -b. -bbrukernavn domene passord Spesifiserer en kommando som skal utføres med den spesifiserte brukernavn, domene og passord... Som standard kjøres kommandoen ved å bruke legitimasjonen til brukeren som for øyeblikket er logget på nettverket. Kan ikke brukes med parameter -en. -? Viser kommandomenyen.

Merknader

  • Med parameter -c du kan bruke konstanter #schemaNamingContext og #configurationNamingContext i stedet for de særegne navnene på skjemakatalogdelen og konfigurasjonskatalogdelen.
  • Når du oppretter en importfil for en kommando ldifde, bruk verdien endreType for å bestemme typen endringer i importfilen. Verdiene endreType er vist i tabellen nedenfor.

Følgende er et eksempel på en LDAP-importfil i LDIF-format som bruker verdien legge til:
DN: CN =valgt_bruker, DC =domenenavn
endringstype: legge til
CN: valgt_bruker
beskrivelse:Filbeskrivelse
objektklasse: bruker
objektklasse: valgt_bruker

Eksempler av

For å hente kun det unike navnet, fellesnavnet, fornavnet, etternavnet og telefonnummeret til de returnerte objektene, skriv inn:
-l distinguished_name, CN, Navn, SN, telefon
For å ekskludere en globalt unik identifikator (GUID) for et objekt, skriv inn:
-o når_opprettet, når_endret, Object_guide

0

Jeg har følgende arbeidsskript som sjekker om en stor liste over brukere i en CSV-fil er medlem av en AD-gruppe og skriver resultatene til results.csv.

Ikke sikker på hvordan jeg konverterer skriptet slik at jeg kan endre $ group = "InfraLite" til $ group = DC. \ List_Of_AD_Groups.CSV.

Dermed returnerer skriptet ikke bare treff for én AD-gruppe, men det returnerer derfor treff for 80 AD-grupper i List_of_AD_groups.csv. Å skrive JA / NEI for hver AD-gruppe i en ny CSV-kolonne (eller, hvis dette ikke er mulig, opprette en egen CSV-fil for hver gruppe med resultater vil også.

Jeg kunne gjøre det manuelt ved å endre verdien fra $ group og eksportfilnavnet og kjøre skriptet på nytt 80 ganger, men måtte være rask med PS for å gjøre dette

f.eks. results.csv?:

NAVN AD_GROUP1 AD_GROUP2 AD_GROUP80 osv osv. bruker1 ja nei ja bruker2 nei nei ja bruker3 nei ja nei ekko "UserName`InfraLite" >> results.csv $ users = GC. \ user_list.csv $ group = "InfraLite" $ members = Get-ADGroupMember -Identity $ group -Recursive | Velg -ExpandProperty SAMAAccountName foreach ($ bruker i $ brukere) (hvis ($ medlemmer - inneholder $ bruker) (ekko "$ user $ group`tYes" >> results.csv) else (ekko "$ user`tNo" >> resultater .csv))

  • 2 svar
  • Sortering:

    Aktivitet

0

En triviell løsning på problemet ditt ville være å pakke den eksisterende koden inn i en annen løkke og lage en utdatafil for hver gruppe:

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

En renere tilnærming ville være å lage en gruppetilordningsmal, klone den for hver bruker og fylle ut en kopi med brukerens gruppemedlemskap. Noe sånt som dette burde fungere:

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

0

Jeg har lekt med dette en stund, og jeg tror jeg fant en måte å få deg akkurat det du var ute etter.

Jeg tror Ansgar var på rett vei, men jeg klarte ikke å få ham til å gjøre det den gjorde etterpå. Han nevnte at han i skrivende stund ikke hadde tilgang til AD-miljøet.

Dette er hva jeg kom på:

$ UserArray = Get-Content "C: \ Temp \ Users.txt" $ GroupArray = Get-Content "C: \ Temp \ Groups.txt" $ OutputFile = "C: \ Temp \ Something.csv" # Sette opp en hashtabell for senere bruk $ UserHash = New-Object -TypeName System.Collections.Hashtable # Ytre sløyfe for å legge til brukere og medlemskap til UserHash $ UserArray | ForEach-Object ($ UserInfo = Get-ADUser $ _ -Properties MemberOf # Striper LPAP-syntaksen til bare SAMAccountName for gruppen $ Memberships = $ UserInfo.MemberOf | ForEach-Object (($ _. Split (",")) .replace ("CN =", "")) #Adding the User = Medlemskapsparet til Hash $ UserHash.Add ($ _, $ Memberships)) # Ytre sløyfe for å lage et objekt per bruker $ Results = $ UserArray | ForEach-Object (# Opprett først et enkelt objekt $ User = New-Object -TypeName PSCustomObject -Property @ (Name = $ _) # Legg dynamisk til medlemmer til objektet, basert på $ GroupArray $ GroupArray | ForEach-Object (#Checking $ UserHash for å se om gruppen vises i brukerens medlemsliste $ UserIsMember = $ UserHash. ($ User.Name) -inneholder $ _ #Adding egenskap til objekt, og verdi $ User | Add-Member -MemberType NoteProperty -Name $ _ -Verdi $ UserIsMember) #Returnere objektet til variabelen Returner $ User) #Konverter objektene til en CSV, og skriv dem ut $ Resultater | ConvertTo-CSV -NoTypeInformation | Out-File $ OutputFile

La oss håpe at alt gir mening. Jeg kommenterte så mye jeg kunne. Det ville være veldig enkelt å konvertere til ADSI hvis du ikke hadde RSAT installert på hvilken som helst maskin du kjører den på. Gi meg beskjed hvis du trenger det, så gjør jeg noen raske endringer.