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

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 *


Type number two as digit *


Semhle vyplňte číslici dvě. Předchozí antispemové pole nefunguje úplně dokonale, zdá se, že jsou i spamery, které pochopily, že je občas potřeba vyplnit autora :-)

Email


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

Attachments