Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > Posts > Cykly v CMD a PowerShell
leden 27
Cykly v CMD a PowerShell

Včera na Microsoft TechNet Univerzitě v Bratislavě jsem ukazoval malý skriptík na tzv. shadow group, tedy skupinu v Active Directory, která obsahuje všechny členy nějaké organizační jednotky (organizational unit). Prostě skupina jaksi duplikující tu organizační jednotku.

Je to pěkná ukázka, jak se dají dělat cykly v příkazové řádce (CMD) a rovnou si to ukážeme i v PowerShellu, pro porovnání. Jen pro pořádek, v tomto konkrétním případě použití DSQUERY a DSMOD to není přímo potřeba, protože DSMOD umí přijímat pajpovaný vstup. Ale to v případě příkazové řádky není obvyklé, DSMOD apod. jsou v tomhle spíš výjimkou. Takže jde o obecnou ukázku cyklu v příkazové řádce.

Cílem je vzít výstup příkazu DSQUERY a poslat ho na vstup příkazu DSMOD. DSQUERY vyhledává uživatele, nebo i libovolné jiné objekty v Active Directory. Dá se samozřejmě použít libovolně komplikovaný LDAP search string, ale já tu ukazuju v co nejvíce zjednodušeném tvaru. Každý řádek výstupu obsahuje distinguishedName jednoho uživatelského účtu, který je umístěn v nějaké organizační jednotce:

DSQUERY user "OU=Brno,OU=Users,OU=Company,DC=ad,DC=sevecek,DC=com" -limit 0

V předchozím je nutné použít parametr -limit, protože DSQUERY normálně vrací maximálně jen 100 nalezených objektů.

No a já bych rád tento každý řádek výstupu poslal do příkazu DSMOD group -addmbr, který přidá do určité skupiny jednoho uživatele. Musím to tedy volat v cyklu. Formát DSMOD příkazu by byl tento (uvedené distinguishedName ukazuje na skupinu, do které chci přidávat toho uživatele):

DSMOD group "CN=Brno Users,OU=Groups,OU=Company,DC=ad,DC=sevecek,DC=com" -addmbr <uzivatel>

Tak a teď to zkombinujme do cyklu

FOR /F "delims=" %i IN ('DSQUERY user "OU=Brno,OU=Users,OU=Company,DC=ad,DC=sevecek,DC=com" -limit 0') DO (

  DSMOD group "CN=Brno Users,OU=Groups,OU=Company,DC=ad,DC=sevecek,DC=com" -addmbr %i

)

Upozorňuju, že jestli z toho chcete udělat .BAT soubor, musíte použít dvojité procento pro proměnnou %i - do .BATu tedy dejte na obě místa %%i.

A teďA teď to stejné v PowerShell

DSQUERY user "OU=Brno,OU=Users,OU=Company,DC=ad,DC=sevecek,DC=com" -limit 0 | % {

  DSMOD group "CN=Brno Users,OU=Groups,OU=Company,DC=ad,DC=sevecek,DC=com" -addmbr $_

}

No vidíte, že to není žádná dřina :-)

 

Comments

Re: Cykly v CMD a PowerShell

... a aby si někdo nestěžoval, že je to nekompletní, ještě jedno řešení toho stejného pomocí Active Directory Module for PowerShell, který máte k dispozici s Windows Server 2008 R2:

Import-Module ActiveDirectory
Get-ADUser -LDAPFilter '(&(objectCategory=person)(!userAccountControl:1.2.840.113556.1.4.803:=2))' -SearchBase 'OU=Brno,OU=Users,OU=Company,DC=ad,DC=sevecek,DC=com' | % { Add-ADGroupMember 'CN=Brno Users,OU=Groups,OU=Company,DC=ad,DC=sevecek,DC=com' -Members $_ }

V tomhle případě jsem to vylepšil ještě o vyhledání pouze povolených uživatelských účtů - to je ten OID 1.2.840.113556.1.4.803, který hledá pouze bitový příznak ADS_UF_ACCOUNTDISABLE s hodnotou 2 - to je příznak zapnutý v atributu userAccountControl, pakliže si účet zakážete.

ondra on 28.1.2012 11:11

Add Comment

Sorry comments are disable due to the constant load of spam *


Omlouvám se, ale příval spamu nelze kontrolovat, takže mi prosím pošlete email, pokud máte nějaký dotaz, nebo připomínku.

Title


Pole Title nemusíte vyplňovat, doplní se to samo na stejnou hodnotu jako je nadpis článku.

Author *


Pole Author nesmí být stejné jako pole Title! Mám to tu jako ochranu proti spamu. Roboti to nevyplní dobře :-)

Body *


Email


Emailová adresa, pokud na ni chcete ode mě dostat odpověď. Nikdo jiný než já vaši emailovou adresu neuvidí.

Attachments