Utilizatori activi Powershell. Gestionarea grupurilor AD utilizând PowerShell

Dedicat utilizării PowerShell pentru a administra AD. Ca punct de plecare, autorul a decis să ia 10 sarcini comune de administrare AD și să analizeze cum pot fi simplificate folosind PowerShell:

  1. Resetați parola utilizatorului
  2. Activați și dezactivați conturile
  3. Deblocați contul de utilizator
  4. sterge-ti contul
  5. Găsiți grupuri goale
  6. Adăugați utilizatori într-un grup
  7. Listează membrii grupului
  8. Găsiți conturi de computer învechite
  9. Dezactivați un cont de computer
  10. Găsiți computere după tip

În plus, autorul menține un blog (folosind PowerShell, desigur), vă recomandăm să aruncați o privire - jdhitsolutions.com/blog. Și puteți obține cele mai actualizate informații de pe Twitter-ul său twitter.com/jeffhicks.
Deci, mai jos este traducerea articolului „Top 10 Active Directory Tasks Rezolvate cu PowerShell”.

Gestionarea Active Directory (AD) folosind Windows PowerShell este mai ușoară decât credeți și vreau să vă dovedesc acest lucru. Puteți pur și simplu să luați scripturile de mai jos și să le utilizați pentru a rezolva o serie de sarcini de gestionare AD.

Cerințe

Pentru a utiliza PowerShell pentru a gestiona AD, trebuie să îndepliniți mai multe cerințe. Voi demonstra cum funcționează cmdleturile AD folosind un computer cu Windows 7 ca exemplu.
Pentru a utiliza cmdleturile, trebuie să aveți un controler de domeniu Windows Server 2008 R2 sau puteți descărca și instala serviciul Active Directory Management Gateway pe DC-uri vechi. Vă rugăm să citiți cu atenție documentația înainte de instalare; Este necesară repornirea CD-ului.
Pe partea client, descărcați și instalați (RSAT) fie pentru Windows 7, fie pentru Windows 8. Pe Windows 7, va trebui să deschideți în Panouri de control capitol Programeși alegeți Activați sau dezactivați funcțiile Windows. Găsi Instrumente de administrare la distanță a serveruluiși extindeți secțiunea Instrumente de administrare a rolurilor. Selectați elementele adecvate pentru AD DS și AD LDS Tools, în special rețineți că articolul trebuie selectat Modul Active Directory pentru Windows PowerShell, așa cum se arată în Figura 1. (În Windows 8, toate instrumentele sunt selectate implicit). Acum suntem gata de lucru.

Fig.1 Activarea instrumentelor AD DS și AD LDS

Sunt autentificat cu un cont cu drepturi de administrator de domeniu. Majoritatea cmdlet-urilor pe care le voi afișa vă vor permite să specificați acreditări alternative. În orice caz, recomand să citești ajutorul ( Obține ajutor) și exemple pe care le voi demonstra mai jos.
Porniți o sesiune PowerShell și importați modulul:

PS C:\> Import-Module ActiveDirectory

Importul creează un nou PSDrive, dar nu îl vom folosi. Cu toate acestea, puteți vedea ce comenzi sunt disponibile în modulul importat.

PS C:\> get-command -module ActiveDirectory

Frumusețea acestor comenzi este că, dacă pot folosi o comandă pe un obiect AD, atunci poate fi folosită pe 10, 100 și chiar 1000. Să vedem cum funcționează unele dintre aceste cmdleturi.

Sarcina 1: Resetați parola utilizatorului

Să începem cu o sarcină tipică: resetarea parolei unui utilizator. Puteți face acest lucru ușor și simplu folosind un cmdlet Set-ADAccountPassword. Partea dificilă este că noua parolă trebuie calificată ca șir protejat: o bucată de text care este criptată și stocată în memorie pe durata sesiunii PowerShell. Mai întâi, să creăm o variabilă cu noua parolă:
PS C:\> $new=Read-Host „Introduceți noua parolă” -AsSecureString

Apoi, introduceți o nouă parolă:

Acum putem extrage contul (folosind samAccountname– cea mai bună opțiune) și setați o nouă parolă. Iată un exemplu pentru utilizatorul Jack Frost:

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

Din păcate, există o eroare cu acest cmdlet: -Trece prin, -Și dacă, Și -A confirma nu funcționează. Dacă preferați o comandă rapidă, încercați asta:

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

Am nevoie de Jack să-și schimbe parola data viitoare când se conectează, așa că modific contul folosind Set-ADUser.

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

Rezultatele rulării cmdlet-ului nu sunt scrise în consolă. Dacă acest lucru trebuie făcut, utilizați -Adevărat. Dar pot afla dacă operația a avut succes sau nu prin preluarea numelui de utilizator folosind cmdletul Get-ADUser si specificarea proprietatii Parola a expirat, așa cum se arată în Figura 2.


Orez. 2. Rezultatele cmdlet-ului Get-ADUser cu proprietatea PasswordExpired

Concluzie: Resetarea parolei unui utilizator folosind PowerShell nu este deloc dificilă. Recunosc că resetarea parolei este ușoară și prin snap Utilizatori și computere Active Directory console Microsoft Management Console (MMC). Dar utilizarea PowerShell este potrivită dacă trebuie să delegați o sarcină, nu doriți să implementați snap-in-ul menționat mai sus sau dacă resetați o parolă ca parte a unui proces IT automatizat amplu.

Sarcina 2: Activați și dezactivați conturile

Acum haideți să dezactivăm contul. Să continuăm să lucrăm cu Jack Frost. Acest cod folosește parametrul -Și dacă, pe care îl puteți găsi în alte comadlete care fac modificări pentru a-mi testa comanda fără a o rula.

PS C:\> Disable-ADAccount jfrost -whatif Ce se întâmplă dacă: Efectuarea operației „Set” pe țintă „CN=Jack Frost, OU=staff,OU=Testing,DC=GLOBOMANTICS,DC=local”.

Acum să-l dezactivăm pe bune:

PS C:\> Dezactivați-ADAAccount jfrost

Și când va veni momentul să activăm contul, ce cmdlet ne va ajuta?

PS C:\>Enable-ADAAccount jfrost

Aceste cmdleturi pot fi utilizate într-o expresie pipeline, permițându-vă să activați sau să dezactivați câte conturi doriți. De exemplu, acest cod va dezactiva toate conturile din departamentul de vânzări

PS C:\> get-aduser -filter „departament -eq „vânzări”” | dezactivare-adaccount

Desigur, scrieți un filtru pentru Get-ADUser destul de complicat, dar aici se utilizează parametrul -Și dacăîmpreună cu cmdletul Dezactivați-ADAcont vine în ajutor.

Sarcina 3: Deblocați contul de utilizator

Luați în considerare o situație în care Jack și-a blocat contul în timp ce încerca să introducă o nouă parolă. În loc să încerce să-și găsească contul prin GUI, procedura de deblocare se poate face folosind o comandă simplă.

PS C:\> Unlock-ADAAccount jfrost

Cmdletul acceptă și parametrii -Și dacăȘi -A confirma.

Sarcina 4: Ștergeți contul

Nu contează câți utilizatori eliminați - este ușor de realizat cu un cmdlet Eliminați-ADUser. Nu vreau să-l elimin pe Jack Frost, dar dacă aș vrea, aș folosi cod ca acesta:

PS C:\> Remove-ADUser jfrost -whatif Ce se întâmplă dacă: Efectuarea operației „Eliminare” pe țintă „CN=Jack Frost,OU=staff,OU=Testing,DC=GLOBOMANTICS,DC=local”.

Sau pot introduce mai mulți utilizatori și îi șterg cu o singură comandă simplă:

PS C:\> get-aduser -filter "activat -eq "false"" -proprietate WhenChanged -SearchBase "OU=Angajați, DC=Globomantics,DC=Local" | unde ($_.WhenChanged -le (Get-Date).AddDays(-180)) | Eliminați-ADuser -whatif

Această comandă va găsi și șterge toate conturile dezactivate pentru angajați, care nu au fost modificate timp de 180 de zile sau mai mult.

Sarcina 5: Găsirea grupurilor goale

Gestionarea grupurilor este o sarcină nesfârșită și ingrată. Există multe modalități de a găsi grupuri goale. Unele expresii pot funcționa mai bine decât altele, în funcție de organizația dvs. Codul de mai jos va găsi toate grupurile din domeniu, inclusiv cele încorporate.

PS C:\> get-adgroup -filter * | unde (-Nu ($_ | get-adgroupmember)) | Selectați Nume

Dacă aveți grupuri cu sute de membri, atunci utilizarea acestei comenzi poate dura mult timp; Get-ADGroupMember verifică fiecare grupă. Dacă puteți limita sau personaliza, va fi mai bine.
Iată o altă abordare:

PS C:\> get-adgroup -filter „members -notlike „*” -AND GroupScope -eq „Universal”” -SearchBase „OU=Groups,OU=Employees,DC=Globomantics, DC=local” | Selectați Nume, Grup*

Această comandă găsește toate grupurile universale care nu au apartenență la grupurile OU și afișează unele dintre proprietăți. Rezultatul este prezentat în Figura 3.


Orez. 3. Căutați și filtrați grupurile universale

Sarcina 6: Adăugarea de utilizatori la un grup

Să adăugăm Jack Frost la grupul IT din Chicago:

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

Da, atât de simplu. De asemenea, puteți adăuga cu ușurință sute de utilizatori la grupuri, deși mi se pare puțin ciudat:

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

Am folosit expresia pentru a găsi toți utilizatorii care au proprietatea City în Chicago. Codul din paranteze este executat și obiectele rezultate sunt trecute la parametrul –Member. Fiecare obiect utilizator este adăugat la grupul Chicago Employees. Nu contează dacă avem de-a face cu 5 sau 5000 de utilizatori, actualizarea membrilor grupului durează doar câteva secunde. Această expresie poate fi scrisă și folosind PentruFiecare-Obiect ce ar putea fi mai convenabil:

PS C:\> Get-ADUser -filter „oraș -eq „Chicago”” | foreach (Add-ADGroupMember „Chicago Employees” - Membru $_)

Sarcina 7: Enumerați membrii grupului

Poate doriți să știți cine face parte dintr-un anumit grup. De exemplu, ar trebui să aflați periodic cine este membru al grupului Administratori de domeniu:

PS C:\> Get-ADGroupMember „Administratori de domeniu”

Figura 4 arată rezultatul.


Orez. 4. Membrii grupului Domain Admins

Cmdletul afișează obiectul AD pentru fiecare membru al grupului. Ce să faci cu grupurile imbricate? Grupul meu Chicago All Users este o colecție de grupuri imbricate. Pentru a obține o listă cu toate conturile, trebuie doar să folosesc parametrul – Recursiv.

PS C:\> Get-ADGroupMember „Chicago toți utilizatorii” -Recursiv | Selectați DistinguishedName

Dacă doriți să mergeți în altă direcție - găsiți în ce grupuri se află un utilizator - utilizați proprietatea utilizatorului Membru al:

PS C:\> get-aduser jfrost -property Memberof | Selectați -ExpandProperty memberOf CN=NewTest,OU=Groups,OU=Angajați, DC=GLOBOMANTICS,DC=local CN=Chicago Test,OU=Groups,OU=Angajați, DC=GLOBOMANTICS,DC=local CN=Chicago IT,OU= Grupuri, OU=Angajați, DC=GLOBOMANTICS,DC=local CN=Chicago Sales Users,OU=Grupuri,OU=Angajați, DC=GLOBOMANTICS,DC=local

Am folosit parametrul -ExpandProperty pentru a afișa nume Membru al ca liniile.

Sarcina 8: Găsiți conturi de computer învechite

Mi se pune foarte des această întrebare: „Cum găsesc conturi de computer învechite?” Și mereu răspund: „Ce este depășit pentru tine?” Companiile au definiții diferite cu privire la momentul în care un cont de computer (sau utilizator, indiferent) este considerat învechit și nu mai poate fi utilizat. Pentru mine, sunt atent la acele conturi ale căror parole nu au fost modificate pentru o anumită perioadă de timp. Această perioadă pentru mine este de 90 de zile - dacă computerul nu a schimbat parola împreună cu domeniul în această perioadă, cel mai probabil este offline și depășit. Cmdlet folosit Get-ADComputer:

PS C:\> get-adcomputer -filter "Passwordlastset -lt "1/1/2012"" -properties *| Selectați numele, ultimul set de parolă

Filtrul funcționează excelent cu o valoare grea, dar acest cod se va actualiza pentru toate conturile de computer care nu și-au schimbat parolele de la 1 ianuarie 2012. Rezultatele sunt prezentate în Figura 5.


Orez. 5. Găsiți conturi de computer învechite

O altă opțiune: să presupunem că sunteți cel puțin la nivelul funcțional al domeniului Windows 2003. Filtrați după proprietate LastLogontimeStamp. Această valoare este numărul de intervale de 100 de nanosecunde de la 1 ianuarie 1601 și este stocată în GMT, așa că lucrul cu această valoare este puțin complicat:

PS C:\> get-adcomputer -filter „LastlogonTimestamp -gt 0” -proprietăți * | selectați numele,lastlogontimestamp, @(Name="LastLogon";Expression=(::FromFileTime ($_.Lastlogontimestamp))),passwordlastset | Sortați LastLogonTimeStamp


Orez. 6. Convertiți valoarea LastLogonTimeStamp într-un format familiar

Pentru a crea un filtru, trebuie să convertesc data, de exemplu 1 ianuarie 2012, în formatul corect. Conversia se realizează în FileTime:

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

Acum pot folosi această variabilă în filtru pentru a Get-ADComputer:

PS C:\> Get-ADComputer -Filter "(lastlogontimestamp -lt $cutoff) -sau (lastlogontimestamp -notlike "*")" -proprietate * | Selectați Nume, LastlogonTimestamp, PasswordLastSet

Codul de mai sus găsește aceleași computere care au fost prezentate în Figura 5.

Sarcina 9: Dezactivați contul de computer

Poate că atunci când găsiți conturi inactive sau învechite, veți dori să le dezactivați. Acest lucru este destul de ușor de făcut. Vom folosi același cmdlet pe care l-am folosit pentru a lucra cu conturile de utilizator. Puteți să o clarificați folosind samAccountname cont.

PS C:\> Disable-ADAccount -Identity "chi-srv01$" -whatif What if: Efectuarea operației "Set" pe țintă "CN=CHI-SRV01, CN=Computers,DC=GLOBOMANTICS,DC=local".

Sau folosind o expresie pipeline:

PS C:\> get-adcomputer "chi-srv01" | Dezactivați-ADAcont

De asemenea, pot folosi codul meu pentru a găsi conturi învechite și pentru a le dezactiva pe toate:

PS C:\> get-adcomputer -filter "Passwordlastset -lt "1/1/2012"" -properties *| Dezactivați-ADAcont

Sarcina 10: Găsiți computere după tip

De asemenea, sunt adesea întrebat cum să găsesc conturi de computer după tip, cum ar fi servere sau stații de lucru. Acest lucru necesită puțină creativitate din partea dvs. Nu există nimic în AD care să distingă un server de un client, cu excepția poate sistemul de operare. Dacă computerul dumneavoastră rulează Windows Server 2008, va trebui să faceți câțiva pași suplimentari.
În primul rând, trebuie să obțineți o listă de sisteme de operare, apoi filtrăm conturile după sistemele de operare disponibile.

PS C:\> Get-ADComputer -Filter * -Properties OperatingSystem | Selectați OperatingSystem -unique | Sortați sistemul de operare

Rezultatele sunt prezentate în Figura 7.


Orez. 7. Preluați lista OS

Vreau să găsesc toate computerele care rulează un sistem de operare server:

PS C:\> Get-ADComputer -Filtru „Sistem de operare -cum ar fi „*Server*”” -proprietăți OperatingSystem,OperatingSystem ServicePack | Selectați Nume, Op* | lista de format

Rezultatele sunt prezentate în Figura 8.

Ca și alte cmdlet-uri AD Get, puteți personaliza parametrii de căutare și puteți limita solicitarea la anumite OU, dacă este necesar. Toate expresiile pe care le-am arătat pot fi integrate în expresii PowerShell mai mari. De exemplu, puteți sorta, grupa, aplica filtre, exporta în CSV sau puteți crea și trimite prin e-mail rapoarte HTML - totul din PowerShell! În acest caz, nu va trebui să scrieți un singur script.
Iată un bonus: un raport privind vârsta parolei utilizatorului, salvat într-un fișier HTML:

PS C:\> Get-ADUser -Filter „Activat -eq „True” -ȘI PasswordNeverExpires -eq „False”” -Proprietăți PasswordLastSet,PasswordNeverExpires,PasswordExpired | Selectați DistinguishedName,Name,pass*,@(Name="PasswordAge"; Expression=((Get-Date)-$_.PasswordLastSet)) |sort PasswordAge -Descending | ConvertTo-Html -Title "Raport privind vârsta parolei" | Out-File c:\Work\pwage.htm !}

Deși această expresie poate părea puțin intimidantă, este ușor de utilizat cu cunoștințe minime despre PowerShell. Și rămâne doar un ultim sfat: cum să definiți o proprietate personalizată numită PasswordAge. Valoarea reprezintă decalajul dintre astăzi și proprietatea PasswordLastSet. Apoi sortez rezultatele pentru noua mea proprietate. Figura 9 arată rezultatul pentru micul meu domeniu de testare.

Actualizare:
Postarea conține o traducere a articolului de pe portal

În acest articol, vom analiza capacitatea PowerShell de a gestiona grupuri de domenii Active Directory. Ne vom uita la cum să creați un grup nou în AD, să adăugați utilizatori la acesta (sau să-l eliminați), să enumerați utilizatorii grupului și alte câteva acțiuni utile cu grupuri de domenii care sunt extrem de utile în administrarea de zi cu zi. Pentru a gestiona grupuri AD, modulul Active Directory PowerShell oferă următoarele cmdleturi de bază:

Pentru a utiliza aceste cmdleturi în sesiunea dvs. PowerShell, trebuie încărcat un modul special de interacțiune AD - Modul Active Directory pentru Windows PowerShell. Acest modul a fost introdus pentru prima dată în Windows Server 208 R2. În Windows Server 2012 și versiuni ulterioare, acest modul este activat în mod implicit. Pe computerele client, acesta poate fi instalat și activat ca una dintre componentele RSAT. Puteți verifica dacă modulul este încărcat astfel:

Get-Module -Listavailable

După cum puteți vedea, modulul ActiveDirectory este încărcat. Dacă nu, importați-l cu comanda:

Import-Module activedirectory

Lista completă a comenzilor modulelor poate fi obținută după cum urmează:

Get-Command -Module ActiveDirectory

Există un total de 147 de cmdleturi disponibile în modul, dintre care 11 pot lucra cu grupuri.

Get-Command -Module ActiveDirectory -Nume „*Grup*”

Iată lista lor:

  • Add-ADPrincipalGroupMembership
  • Get-ADAccountAuthorizationGroup
  • Get-ADGroup
  • Get-ADGroupMember
  • Get-ADPrincipalGroupMembership
  • Nou-ADGroup
  • Eliminați-ADGroup
  • Eliminați-ADPrincipalGroupMembership
  • Set-ADGroup

Să creăm un nou grup în containerul Active Directory (OU) specificat folosind comanda Nou-ADGroup:

Nou-ADGroup "TestADGroup" -calea "OU=Groups,OU=Moscow,DC=corp,dc=winitpro,DC=ru" -GroupScope Global -PassThru –Verbose

Folosind atributul Descriere puteți specifica o descriere a grupului și folosind Numele de afișare schimbați numele afișat.

Parametru GroupScope Puteți specifica unul dintre următoarele tipuri de grup:

  • 0 = DomainLocal
  • 1 = Global
  • 2 = Universal

Puteți crea un grup de distribuție astfel:

New-ADGroup "TestADGroup-Distr" -calea "OU=Groups,OU=Moscow,DC=corp,dc=winitpro,DC=ru" -GroupCategory Distribution -GroupScope Global -PassThru –Verbose

Add-AdGroupMember – adăugați utilizatori la un grup AD

Puteți adăuga utilizatori la un grup Active Directory utilizând Add- AdGroupMember. Să adăugăm doi utilizatori la noul grup:

Add-AdGroupMember -Identity TestADGroup -Membri utilizator1, utilizator2

Dacă lista de utilizatori care trebuie adăugați într-un grup este destul de mare, puteți salva lista de conturi într-un fișier CSV, apoi importați fișierul și adăugați fiecare utilizator în grup.

Formatul fișierului CSV este următorul (lista de utilizatori câte unul pe linie, numele coloanei – utilizatori)

Import-CSV .\users.csv -Utilizatori de antet | Pentru fiecare obiect (Add-AdGroupMember -Identity ‘TestADGroup’ -membri $_.users)

Pentru a obține toți membrii unui grup (grup A) și pentru a-i adăuga la un alt grup (grup B), utilizați această comandă:

Get-ADGroupMember „GroupA” | Get-ADUser | Pentru fiecare obiect (Add-ADGroupMember -Identitate „Grupul-B” -Membri $_)

Dacă trebuie să copiați membrii tuturor grupurilor imbricate într-un grup nou (recursiv), trebuie să utilizați următoarea comandă:

Get-ADGroupMember -Identitate „GroupA” -Recursiv | Get-ADUser | PentruFiecare-Object(Add-ADGroupMember -Identity „GroupB” -Members$_)

Remove-ADGroupMember – eliminați utilizatorii dintr-un grup

Pentru a elimina utilizatori dintr-un grup AD, trebuie să utilizați comanda Remove-ADGroupMember. Să eliminăm doi utilizatori din grup:

Remove-ADGroupMember -Identity TestADGroup -Members user1, user2

Confirmați eliminarea utilizatorilor din grup:

Dacă trebuie să eliminați utilizatori dintr-un grup conform unei liste dintr-un fișier CSV, utilizați această comandă:

Import-CSV .\users.csv -Utilizatori header | Pentru fiecare obiect (Remove-ADGroupMember -Identity ‘TestADGroup’ -membri $_.users)

Get-ADGroup – obțineți informații despre un grup AD

Cmdletul vă va ajuta să obțineți informații despre grup Get-ADGroup:

Get-ADGroup „TestADGroup”

Această comandă afișează informații despre principalele atribute ale grupului (DN, tip de grup, nume, SID). Pentru a afișa valoarea tuturor atributelor grupului de domenii AD, executați următoarea comandă:

Get-ADGroup "TestADGroup" -properties *

După cum puteți vedea, acum sunt afișate atribute precum ora creării și modificării grupului, descrierea etc.

Folosind cmdletul Get-ADGroup, puteți găsi toate grupurile care vă interesează folosind un model specific. De exemplu, trebuie să găsiți toate grupurile AD ale căror nume conțin expresia administratori :

Get-ADGroup -LDAPFilter „(nume=*admins*)” | Format-Tabel

Get-ADGroupMember – afișați o listă de utilizatori ai grupului AD

Afișează o listă de utilizatori ai grupului:

Get-ADGroupMember „TestADGroup”

Pentru a lăsa doar nume de utilizator în rezultate, rulați:

Get-ADGroupMember „TestADGroup”| ft nume

Dacă acest grup include alte grupuri de domenii, pentru a afișa lista completă a membrilor, inclusiv toate grupurile imbricate, utilizați Recursiv.

Get-ADGroupMember „server-admins” -recursive| ft nume

Pentru a exporta o listă de conturi aparținând unui anumit grup într-un fișier CSV (pentru o utilizare ulterioară în Excel), rulați următoarea comandă:

Get-ADGroupMember „server-admins” -recursive| ft samaccountname| Out-File c:\ps\admins.csv

Pentru a adăuga datele contului de utilizator în AD la un fișier text, vom folosi cmdletul. De exemplu, pe lângă cont, trebuie să afișați poziția și numărul de telefon al utilizatorului grupului:

Get-ADGroupMember -Identity ’server-admins’ -recursive| foreach ( Get-ADUser $_ -properties title, OfficePhone|Select-Object title, OfficePhone )

(Get-ADGroupMember -Identitate „administratori de domeniu”).Număr

S-a dovedit că în grupul „administratori de domeniu” avem 7 conturi de administrator.

Pentru a găsi o listă de grupuri goale într-o anumită OU, utilizați această comandă:

Get-ADGroup -Filter * -Properties Members -searchbase „OU=Moscow,DC=corp,dc=winitpro,DC=ru” | unde (-nu $_.membri) | selectați Nume

0

Am următorul script de lucru care verifică dacă o listă mare de utilizatori dintr-un fișier CSV este membru al unui grup AD și scrie rezultatele în results.csv.

Nu sunt sigur cum să convertesc scriptul, astfel încât să pot schimba $group = "InfraLite" în $group = DC .\List_Of_AD_Groups.CSV .

Deci, scriptul nu returnează doar potriviri pentru un grup AD, ci returnează potriviri pentru cele 80 de grupuri AD conținute în List_of_AD_groups.csv. Scrierea DA/NU pentru fiecare grup AD într-o nouă coloană CSV (sau dacă acest lucru nu este posibil, crearea unui fișier CSV separat pentru fiecare grup cu rezultate va face același lucru.

Aș putea face acest lucru manual schimbând valoarea din $group și numele fișierului de export și rulând din nou scriptul de 80 de ori, dar ar trebui să fiu rapid cu PS pentru a face acest lucru

de exemplu results.csv?:

NUME AD_GROUP1 AD_GROUP2 AD_GROUP80 etc etc. user1 da nu da user2 nu nu da user3 nu da nu echo "UserName`InfraLite" >> results.csv $users = GC .\user_list.csv $group = "InfraLite" $members = Get-ADGroupMember -Identity $group -Recursive | Selectați -ExpandProperty SAMAccountName pentru fiecare ($user în $users) ( dacă ($members -contains $user) ( echo "$user $group`tYes" >> results.csv ) else ( echo "$user`tNu" >> rezultate .csv ) )

  • 2 raspunsuri
  • Triere:

    Activitate

0

O soluție trivială la problema dvs. ar fi să vă includeți codul existent într-o altă buclă și să creați un fișier de ieșire pentru fiecare grup:

$groups = Get-Content „C:\groups.txt” pentru fiecare ($grup în $groups) ( $members = Get-ADGroupMember ... ... )

O abordare mai elegantă ar fi să creați un șablon de mapare a grupului, să-l clonați pentru fiecare utilizator și să completați o copie cu membrii grupului utilizatorului. Ceva de genul acesta ar trebui să funcționeze:

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

0

Mă joc cu asta de ceva vreme și cred că am găsit o modalitate de a-ți obține exact ceea ce căutai.

Cred că Ansgar era pe drumul cel bun, dar nu l-am putut face să facă ceea ce a urmat. El a menționat că la momentul redactării acestui articol nu avea acces la mediul AD.

Iată ce am venit cu:

$UserArray = Obține conținut "C:\Temp\Users.txt" $GroupArray = Obține conținut "C:\Temp\Groups.txt" $OutputFile = "C:\Temp\Something.csv" # Configurarea unui tabel hash pentru utilizare ulterioară $UserHash = New-Object -TypeName System.Collections.Hashtable # Bucla exterioară pentru a adăuga utilizatori și apartenență la UserHash $UserArray | ForEach-Object( $UserInfo = Get-ADUser $_ -Properties MemberOf # Stripte sintaxa LPAP doar la SAMAccountName al grupului $Memberships = $UserInfo.MemberOf | ForEach-Object( ($_.Split(",")) .replace("CN=","") ) #Adăugarea perechii User=Membership la Hash $UserHash.Add($_,$Memberships) ) #Bucla exterioară pentru a crea un obiect per utilizator $Results = $UserArray | ForEach-Object( # Creați mai întâi un obiect simplu $User = New-Object -TypeName PSCustomObject -Property @( Name = $_ ) # Adăugați în mod dinamic membri la obiect, pe baza $GroupArray $GroupArray | ForEach-Object ( #Verificare $UserHash pentru a vedea dacă grupul apare în lista de membri ai utilizatorului $UserIsMember = $UserHash.($User.Name) -conține $_ #Adăugarea proprietății la obiect și valoarea $User | Add-Member -MemberType NoteProperty -Name $ _ -Valoare $UserIsMember ) #Returnarea obiectului la variabila Return $User ) #Conversia obiectelor într-un CSV, apoi scoateți-le $Results |

Să sperăm că totul are sens. Am comentat cât am putut. Ar fi foarte ușor să convertiți în ADSI dacă nu ați avea instalat RSAT pe orice mașină pe care rulați acest lucru. Dacă aveți nevoie, anunțați-mă și voi face câteva modificări rapide.

Bună ziua, dragi cititori și abonați, continuăm să studiem capabilitățile Powershell și Active Directory. După cum vă amintiți, toate conturile ei de utilizator și computer sunt localizate în baza de date NTDS.dit, totul este grozav și centralizat. Atunci când o companie are mai mult de un administrator de sistem, poate apărea o situație în care se acumulează gunoi și acreditări inutile. Cu toții suntem oameni și putem uita unele lucruri, iar în unele momente putem fi distrași, ceea ce va duce și la uitarea de informații importante. Și ajungem la concluzia că utilizatorii inactivi (demisi sau uitați) se acumulează în Directorul Actvie în orice caz, un administrator de sistem bun ar trebui să-i identifice, să-i dezactiveze, apoi să-i ștergă dacă se dorește, ceea ce vom face.

Prin snap-in ADUC

Data trecută v-am dat deja un exemplu de utilizare a snap-in-ului Active Directory Users and Computers, prin care am căutat computere lipsă în rețeaua locală care nu mai apăreau de o lună. Acum vom face același lucru cu conturile de utilizator. Am AD pe Windows Server 2012 R2, deschideți ADUC, pentru a face acest lucru apăsați WIN+R și introduceți dsa.msc.

În formularul de solicitare care se deschide, introduceți:

  • Nume cerere > pentru mine aceștia sunt utilizatori pierduți
  • Descriere dacă este necesar
  • Solicitați rădăcină > aici puteți lăsa întregul domeniu sau îl puteți specifica pe OU dorit

Apoi faceți clic pe butonul de solicitare.

În fila utilizatori vedem elementul „Număr de zile de la ultima conectare”, de exemplu, l-am setat la 60 de zile;

Ca urmare, veți primi lista de conturi de angajați inactivi de care aveți nevoie.

Prin snap-in Powershell

Același lucru se poate face prin Powershell. Îți voi da imediat codul a cărui sarcină este să caute utilizatori inactivi, pentru asta am ales o perioadă de 45 de zile, dezactivând datele utilizatorului și trecând la o organizație specială desemnată.

$date_with_offset= (Get-Date).AddDays(-45)
$users = Get-ADUser -Properties LastLogonDate -Filter (LastLogonDate -lt $date_with_offset ) | Sortați LastLogonDate
foreach ($user în $users) (set-aduser $user -enabled $false; move-adobject -identity $user -targetpath "ou=Declanșat,ou=Moscova L. utilizatori,ou=Locație,dc=msk,dc= contoso,dc=com")
Get-ADUser -Properties LastLogonDate -Filter (LastLogonDate -lt $date_with_offset ) | Sortează LastLogonDate | Nume FT, LastLogonDate -AutoSize | Out-Fișier c:\Script\users.txt

  • În prima linie declarați o variabilă în care setați termenul de căutare
  • Creați o variabilă și faceți o selecție bazată pe ultima oră de conectare
  • Mutarea utilizatorilor

  • Efectuarea unui raport la un dosar

Lucruri mai utile despre lucrul cu utilizatorul. Înainte de a utiliza comenzile de mai jos, trebuie să încărcați modulul Active Directory prin intermediul comenzii

Get-Help Get-ADUser

În comentariile la articolul precedent, ne-am amintit despre contabilitate în Excel în loc de 1C. Ei bine, haideți să verificăm cât de mult cunoașteți Excel. Astăzi vă voi arăta cum să obțineți date din Active Directory și să lucrați cu ele fără macrocomenzi și PowerShell - doar cu mecanisme Office standard. De exemplu, puteți obține cu ușurință analize privind utilizarea sistemelor de operare în organizația dvs. dacă nu aveți deja ceva de genul Microsoft SCOM. Ei bine, sau pur și simplu încălziți-vă și luați-vă mințile de la scenarii.


Desigur, puteți obține datele ca în exemplele de mai jos literalmente cu o singură linie în PowerShell. Dar, în primul rând, PowerShell este prea plictisitor și, în al doilea rând, Excel poate actualiza dinamic datele - documentele rezultate pot fi publicate online și uitate de actualizarea lor.

Pentru a lucra cu date, voi folosi mecanismul Power Query. Pentru Office 2010 și 2013 va trebui să instalați un plugin Microsoft Office 2016 are deja încorporat acest modul. Din păcate, ediția standard nu este suficientă pentru noi, vom avea nevoie de Professional.


Mecanismul în sine este conceput pentru a primi și procesa date dintr-o varietate de surse - de la ODBC vechi și fișiere text, la Exchange, Oracle și Facebook. Mai multe detalii despre mecanism și limbajul de scripting încorporat „M” au fost deja scrise pe Habré, dar voi analiza câteva exemple de utilizare a Power Query pentru a obține date din Active Directory.

Încălzire: să vedem când s-au conectat utilizatorii noștri

Solicitarea către baza de date a domeniului în sine este creată în fila „Date ― Solicitare nouă ― Din alte surse ― Din Active Directory”.



Specificați sursa de date.


Va trebui să selectați un nume de domeniu și să furnizați informațiile necesare de conectare. Apoi, selectați tipul de obiecte, în acest exemplu - utilizator. În partea dreaptă a ferestrei de previzualizare, interogarea rulează deja, afișând o previzualizare a datelor.



Pregătim o cerere și admirăm previzualizarea.


Ar trebui să pregătiți solicitarea în avans făcând clic pe butonul „editați” și selectând coloanele necesare. În esență, aceste coloane sunt clase Fiecare dintre ele conține un set de atribute specifice unui obiect Active Directory, cu excepția coloanei principale Numele de afișare, care în sine este un atribut. Mă voi concentra pe cursuri utilizator, persoană, topȘi securitatePrincipal. Acum trebuie să selectați atributele necesare din fiecare clasă folosind „extensia” - o pictogramă cu două săgeți la antetul coloanei:

  • Clasă utilizator extinde prin alegere lastLogonTimestampȘi userAccountControl;
  • V persoană hai sa alegem număr de telefon;
  • V topcând este creat;
  • si in securitatePrincipalSamAccountName.


Extindem cererea.


Acum să setăm filtrul: în special, pentru a nu obține conturi blocate, atributul userAccountControl trebuie să aibă valoarea 512 sau 66048. Filtrul poate fi diferit în mediul dumneavoastră. Puteți citi mai multe despre atribut în documentația Microsoft.



Aplicarea unui filtru.


Uneori, Excel detectează incorect formatul datelor, în special valoarea atributului lastLogonTimestamp. Dacă o astfel de nenorocire ți se întâmplă brusc, poți seta formatul corect în fila „Convertire”.

Acum, coloana userAccountControl ar trebui ștearsă - nu este deloc necesară pe afișaj. Și faceți clic pe „Descărcați și închideți”.


Rezultatul este o farfurie care are nevoie doar de mici retușuri de finisare. De exemplu, redenumiți coloanele în ceva mai ușor de citit. Și configurați actualizarea automată a datelor.


Actualizarea automată la deschiderea unui tabel sau prin timeout este configurată în fila „Date” din „Proprietăți”.



Configurarea actualizării datelor.


După finalizarea instalării actualizării, puteți oferi în siguranță tabelul departamentului de personal sau serviciului de securitate - spuneți-i cine s-a conectat la sistem și când.


Codul de solicitare în limba „M” se află sub spoiler.

let Source = ActiveDirectory.Domains("domain.ru"), domain.ru = Source()[#"Categorii de obiecte"], user1 = domain.ru(), #"Remote Columns" = Table.RemoveColumns(user1,( „organizationalPerson”, „shadowAccount”, „posixAccount”, „msExchOmaUser”, „msExchBaseClass”, „msExchIMRecipient”, „msExchCertificateInformation”, „msExchMultiMediaUser”, „msExchMailStorage”, „msExchCustomAstinguishedme”, „distinguishedme”, „) #"Expanded element securityPrincipal" = Table.ExpandRecordColumn(#"Coloane eliminate", "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")), #"Rânduri cu filtru aplicat" = Table.SelectRows(#"Element utilizator extins", fiecare ( = 512 sau = 66048)), #"Tip modificat" = Table.TransformColumnTypes(#"Rânduri cu filtru aplicat",(("lastLogonTimestamp", type datetime))), #"Remoted columns1" = Table.RemoveColumns(#"Changed type", ("userAccountControl")) în #"Remoted columns1"

Crearea unei agende de adrese sau ce trebuie făcut atunci când portalul corporativ nu este prietenos cu AD

O altă opțiune pentru utilizarea Excel împreună cu Active Directory este crearea unei agende de adrese pe baza datelor AD. Este clar că agenda va fi actualizată doar dacă domeniul este în regulă.


Să creăm o cerere pentru un obiect utilizator, extinde clasa utilizator V Poștă, și clasa persoană V număr de telefon. Să ștergem toate coloanele, cu excepția distinsName― structura domeniului repetă structura întreprinderii, deci numele Unități organizaționale corespund denumirilor departamentelor. În mod similar, grupurile de securitate pot fi folosite ca bază pentru numele departamentelor.


Acum de la linie CN=Nume de utilizator, OU=Departament de contabilitate, OU=Divizii, DC=domeniu, DC=ru trebuie să extrageți direct numele departamentului. Cel mai simplu mod de a face acest lucru este să utilizați delimitatorii din fila Transformare.



Extragerea textului.


Eu folosesc ca delimitatori OU=Și ,OU=. În principiu, o virgulă este suficientă, dar o joc în siguranță.



Introduceți delimitatori.


Acum, folosind filtrul, puteți tăia inutil OU, cum ar fi utilizatorii blocați și incorporat, configurați sortarea și încărcați datele în tabel.



Vedere a tabelului rezumativ.

Raport rapid asupra compoziției posturilor de lucru, fără a introduce agenți sau alt preparat

Acum să încercăm să creăm un tabel util obținând date pe computere. Să facem un raport asupra sistemelor de operare utilizate de companie: pentru aceasta vom crea o solicitare, dar de data aceasta în navigator vom selecta calculator.



Facem o cerere pentru obiectul computer.


Să lăsăm clasele coloanei calculatorȘi topși extinde-le:

  • Clasă calculator extinde prin alegere cn, sistem de operare, Operating SystemServicePackȘi OperatingSystemVersion;
  • in clasa top hai sa alegem când este creat.


Cerere avansată.


Dacă doriți, puteți face un raport numai pe sistemele de operare server. De exemplu, filtrați după atributul operatingSystem sau operatingSystemVersion. Nu voi face acest lucru, dar voi corecta afișarea timpului de creație - mă interesează doar anul. Pentru a face acest lucru, în fila „Conversie”, selectați coloana de care avem nevoie și selectați „Anul” în meniul „Data”.



Extragem anul din momentul în care computerul a intrat în domeniu.


Acum tot ce rămâne este să ștergeți coloana de nume afișat ca inutilă și să încărcați rezultatul. Datele sunt gata. Acum puteți lucra cu ei ca la o masă obișnuită. Mai întâi, să creăm un tabel pivot în fila „Inserare” - „Tabel pivot”. Să fim de acord cu alegerea sursei de date și să configuram câmpurile acesteia.



Setările câmpului tabelului pivot.


Acum tot ce rămâne este să personalizați designul după gustul dvs. și să admirați rezultatul:



Tabel rezumat pentru calculatoare în AD.


Dacă doriți, puteți adăuga o diagramă rezumat, de asemenea, în fila Inserare. În „Categorie” (sau în „Rânduri”, după gust) adăugați sistem de operare, la date ― cn. În fila „Design”, puteți alege tipul de diagramă care vă place;



Graficul proporțiilor.


Acum este clar că, în ciuda actualizării în curs, numărul total de stații de lucru cu Windows XP și servere cu Windows 2003 este destul de mare. Și există ceva pentru care să lupți.


Codul de solicitare este sub spoiler.

let Source = ActiveDirectory.Domains("domain.ru"), domain.ru = Source()[#"Categorii de obiecte"], computer1 = domain.ru(), #"Remote Columns" = Table.RemoveColumns(computer1,( "user", "organizationalPerson", "persoana")), #"Other removed columns" = Table.SelectColumns(#"Remoted columns", ("displayName", "computer", "top")), #"Expand item computer" = Table.ExpandRecordColumn(#"Alte coloane la distanță", "computer", ("cn", "operatingSystem", "operatingSystemServicePack", "operatingSystemVersion"), ("cn", "operatingSystem", "operatingSystemServicePack", " operatingSystemVersion")), #"Extended top element" = Table.ExpandRecordColumn(#"Element computer extins", "sus", ("whenCreated"), ("whenCreated")), #"Extracted year" = Table.TransformColumns( #"Expanded element top",(("whenCreated", Data.Year))), #"Remoted columns1" = Table.RemoveColumns(#"Extracted year",("displayName")) in #"Remoted columns1"

Adaugă etichete
  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă ne-am grăbi pe undeva