مدیریت اکتیو دایرکتوری با پاورشل

Powershell یک رابط متنی بر اساس دستور مبتنی بر وظیفه است که از زبان های اسکریپی پشتیبانی به عمل می آورد. به جهت سهولت این ابزار جهت مدیریت روی Windows Server توصیه می شود.دستورات Powershell را cmdlets می گوییم و با استفاده از این ابزار قصد داریم عملیات پیچیده ای را با ساده ترین شکل ممکن روی Active Directory Domain Services انجام دهیم. در اینجا هدف ساخت اسکریپت نمی باشد و فقط از cmdlets ها استفاده می کنیم. اگر می خواهید در خصوص Powershell اطلاعات با عمق بیشتری به دست آورید، کتاب Windows PowerShell 2.0 Administrator’s Pocket Consultant نوشته ی William R. Stanek از انتشارات مایکروسافت می تواند به شما کمک کند. اطلاعاتی که در این سری مطالب ارائه می گردند، برای اکثر مدیریت ها روی Active Directory کفایت می کنند.
Powershell به صورت پیش فرض در Windows Server 2008/2012 نصب شده است و برای دسترسی به آن کافی است آیکون آن را از روی Task Bar باز کنید و یا در run وارد کنید: Powershell.exe

ماژول ها

Powershell به صورت خودکار از صد ها cmdlets پشتیبانی می کند و برای افزودن کارایی آن می توان از snap-inها یا Module (ماژول ها) استفاده کرد. یک ماژول عبارت است از پکیجی از cmdlets ها که لیست cmdlet های Powershell اضافه می گردد و قابلیت های جدیدی را در اختیار قرار می دهد. به صورت پیش فرض در زمان نصب سرویس، Active Directory Module در powershell اضافه شده است. علاوه بر cmdlets ها می توان از همان دستورات پیشین cmd نیز در powershell با همان syntax (نحو) استفاده کرد. cmdlet ها حساس به حروف بزرگ و کوچک نیستند.
برای نصب Active Directory Module ابتدا لازم است Remote Server Administration Tools یا به اختصار RSAT را نصب کنید و سپس در Turn Windows Features On Or Off گزینه Active Directory Module For Windows PowerShell که تحت گزینه Remote Server Administration Tools در قسمت AD DS است را انتخاب کنید.
این Module در سمت کلاینت نصب می گردد و لازم است Active Directory Web Services روی حداقل یکی از دامین کنترلرها (DC) در دامین مورد نظر نصب شده باشد. ADWS در Windows Server 2008 R2/2012 به صورت خودکار در زمان Promote کردن DC نصب می گردد. اگر قصد دارید از نسخ پیشین استفاده کنید لازم است Active Directory Management Gateway Service را دانلود و نصب کنید.
جهت دسترسی به ابزار مجهز شده به Module می توانید Active Directory Module For Windows PowerShell موجود در Administrative Tools را باز کنید و یا در powershell وارد کنید:

Import-Module ActiveDirectory
مدیریت-اکتیو-دایرکتوری-با-پاورشل-manage-domain-controller-with-powershell
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل

ماژول اکتیو دایرکتوری دارای بیش از 76 cmdlets است که به خاطر سپردن آن ها امری دشوار خواهد بود. از این رو لازم است روش آنکه چگونه بتوان به cmdlet مورد نظر دسترسی پیدا کرد و از آن استفاده کرد بسیار حیاتی خواهد بود. با استفاده از دستور زیر می توانید لیست cmdlet ها را دریافت کنید.

Get-Command

cmdlet ها همیشه یه فرمت فعل-مفعول دارند. به عنوان مثال برای دریافت لیست پروسه های در حال اجرا کافی است دستور زیر را وارد کنید:

Get-Service

با استفاده از دستور زیر می توانید لیست تمام افعال به کار گرفته شده را ببینید. مفعول ها از یک استاندارد که توسط مایکروسافت معین شده اند استفاده می کنند به عنوان مثال تمام اسامی مربوط به Active Directory با AD آغاز می گردد.

Get-Verb

دستور زیر، لیستی از cmdlet های مربوط AD را فراهم می آورد:

Get-Command -Noun AD* | More
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل

همانند cmd استفاده از more| سبب می شود نتایج به صورت صفحه بندی شده نمایش داده شود. روش بهتر برای نمایش cmdlet های یک ماژول استفاده از دستور زیر است:

Get-Command -Module ActiveDirectory

پارامتر ها

اکثر cmdlet ها دارای ورودی می باشند به آن ورودی ها پارامتر می گوییم. پارامتر ها با یک فاصله و یک – (dash) از cmdlet جدا می شوند و حساس به حروف کوچک و بزرگ نمی باشند. پارامتر Identity- در اکثر cmdlet های AD مورد استفاده قرار می گیرد و کاربرد آن تعیین distinguished name یا sAMAccountName است. sAMAccountName همان Pre-Windows 2000 Logon Name می باشد. پس از پارامتر مقدار آن مشخص می گردد. اگر حاوی فاصله است لازم است در کوتیشن ‘ ‘ قرار گیرد. به مثال زیر توجه کنید:

Get-ADGroupMember -Identity “cn=Sales,ou=Groups,dc=contoso,dc=com” Get-ADGroupMember -Identity Sales

راهنما

برای آنکه اطلاعاتی در خصوص هر cmdlet کسب کنید کافی است از دستور Get-Help استفاده کنید.

Get-Help cmdlet
Get-Help Get-ADGroupMember (مثال)

اشیاء

بر خلاف cmd که تنها یک متن خروجی دارد، خروجی در powershell می تواند یک شیئ یا به عبارت دیگر یک ساختار (construct) باشد. دستور زیر سبب می شود برخی از ویژگی های یک شیئ کاربر نمایش داده شود. مسئله قابل توجه آن است که خروجی فقط قدری نوشته نیست، بلکه حاوی یک شیئ است که می تواند برای یک عملیات به کار گرفته شود. اشیاء می تواند دارای Attribute و Method ها باشند.

Get-ADUser -Identity GetMe
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل

متغیر ها

یک متغیر فضایی از حافظه است که می تواند جهت نگه داری یک مقدار یا شیئ به کار گرفته شود. در PowerShell متغیر ها با حرف $ آغاز می گردند. نام متغیر نیز Case-Sensitive نمی باشد. برای تعریف متغیر فرم عمومی زیر به کار می رود:

$variable = value

اکنون قصد داریم شیئ دریافت شده از دستور قبل را در یک متغیر قرار دهیم:

$catched= Get-ADUser GetMe
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل

اکنون قصد داریم با استفاده از متغیر ساخته شده، اکانت کاربر GetMe را Disable (غیر فعال) کنیم. برای آنکه قصد داریم مقداری را تنظیم کنیم، از فعل set در ابتدای cmdlet استفاده می شود:

Set-ADUser -Identity $user -Enabled $false

همانطور که حدس می زنید استفاده از متغیر در این مثال الزام آور نبود و امکان استفاده از دستور زیر نیز وجود داشت:

Set-ADUser -Identity GetMe -Enabled $false

PowerShell دارای تعدادی متغییر از پیش تعریف شده است به عنوان مثال، متغییر های true$ و false$ دو نمونه متغییر boolean هستند و یا متغیر $error شامل خطای عملیات می باشد.

خطوط لوله

امکان pipe کردن اشیاء نیز وجود دارد. pipe کردن به آن معنا است که خروجی یک cmdlet به عنوان ورودی یک cmdlet دیگر به کار گرفته شود. به عبارت دقیق تر؛ یک pipline یا خط لوله، عبارت است از: یک کانال میان خروجی یک cmdlet که در یک خط دستور به یک cmdlet منتقل می گردد. به عنوان مثال، دستور فوق را می توان با این بیان نیز وارد کرد:

Get-ADUser GetMe| Set-ADUser -Enabled $false

دستور Get-ADUser شیئ یک کاربر را می گیرد و آن را از طریق لوله | به Set-ADUser منتقل می کند. یک مثال کاربری می تواند غیرفعال کردن تمام اعضای یک گروه باشد.

Get-ADGroupMember -Identity Sales | Set-ADUser -Enabled $false

در این مثال اگر گروه sales یک Nested Group باشد به این معنا که حاوی گروهی دیگری باشد، به دلیل عدم امکان اجرای قسمت دوم pipe دستور با خطا رو به رو می شود و می توان از روش فیلتر کردن خروجی ها با Where-Object این خطا را بر طرف کرد.

لوله ها وحشی می شوند!

عملیات پیچیده تر می تواند شامل تعداد بیشتر pipe باشد و ممکن است شامل توابع، ساختار ها، حلقه ها و شرط ها باشد. اغلب pipeline ها برای راحتی در خواندن و بررسی آن ها بیشتر از یک خط هستند. راه های مختلفی وجود دارد که بتوان یک pipeline را بیش از یک سطر وارد کرد.
1) علامت ‘ : زمانی که آخرین حرف در یک سطر باشد، PowerShell یک سطر دیگر برای ادامه دستور اختصاص می دهد و دستور را اجرا نمی کند. به عنوان مثال:

Get-ADGroupMember -Identity Sales | `Set-ADUser -Enabled $false

2) علامت لوله | : اگر علامت لوله در پایان یک خط باشد، PowerShell تصور می کند دستور نا تمام است و در سطر بعدی ادامه دستور را می توانید وارد کنید. به عنوان مثال:

Get-ADGroupMember -Identity Sales |Set-ADUser -Enabled $false

3) آکولاد {} : یک عبارت می تواند در میان دو آکولاد قرار بگیرد و PowerShell تا بسته نشدن آکولاد آن دستور را نا تمام در نظر می گیرد.
زمانی که Prompt به خط دوم برای دستور می رود به صورت << خواهد شد. می توانید خط را خالی رها کنید تا دستور اجرا گردد.

نام های مستعار

PowerShell اجازه می دهد تا یک cmdlet دارای یک نام مستعار (Alias) باشد. به عنوان مثال gsv نام مستعار برای Get-Service است. با استفاده از دستور زیر می توانید لیست Alias ها را برای یک دستور معین مشاهده کنید به طوری که cmdlet دستور می باشد:

Get-Alias -Definition cmdlet

همچنین اگر می خواهید بدانید که نام مستعار مربوط به کدام دستور است می توانید از دستور زیر استفاده کنید. فراموش نکنید که cmdlet های استاندارد دارای فرمت فعل-مفعول اند. در اینجا Alias نام مستعار مورد نظر است:

Get-Alias Alias

Namespace، Provider و PSDrives

cmdletها روی اشیاء در یک فضای نامی (Namespace) عمل می کنند. به عنوان مثال یک folder روی disk یک namespace است. این فضاهای نامی توسط Provider (فراهم آورنده) ساخته می شوند. به عنوان مثال File System دارای یک Provider است که به این ترتیب می تواند به صورت مستقیم با آن در ارتباط باشد و روی آن عملیات انجام دهد. این مسئله برای Registry هم صادق است.
در PowerShell فضای نامی که توسط هر Provider ساخته شده است توسط یک PSDrive معین می گردد. PowerShell به صورت خودکار یک PSDrive برای هر کدام از Drive های ویندوز می سازد. PowerShell اما استفاده از PSDrive را به مرحله ای فراتر می برد و با استفاده از ساخت PSDrive برای منابعی که متداولا استفاده می گردد، سبب می گردد دسترسی به منابع از طریق PowerShell آسان تر گردد. به عنوان مثال HKCU مربوط به HKEY_CURRENT_USER و HKLM مربوط به HKEY_LOCAL_MACHINE از Registry است. برای مشاهده لیست کامل PSDrive ها دستور زیر را وارد کنید:

Get-PSDrive
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل

PowerShell همه فن حریف

PowerShell یک رابط متنی مدرن، ساده و یکپارچه است که با استفاده از آن می توانید عملیات پیچیده را به راحتی بنویسید و طعم شیرین مدیریت روی خط فرمان را بچشید. مدیریت با استفاده از PowerShell به تمام مدیران توصیه می گردد چرا که با استفاده از این ابزار پیشرفته می توان بهره وری را افزایش داد. مشابه هر رابط متنی خوب دیگری، با استفاده از فشردن کلید Tab می توانید تکمیل دستور را بر عهده PowerShell قرار دهید و فقط حروف ابتدایی دستور را تا زمانی که قابل تمیز دادن باشد وارد کنید.

Active Directory Provider

PowerShell دارای یک Provider برای Active Directory است. ابتدایی ترین مزیت آن این است که با استفاده از این Provider می توان به همان راحتی که فایل ها را در دیسک کاوش می کنید، در Active Directory کاوش کنید. برای دسترسی به PSDriver مربوط به Active Directory کافی است دستور زیر را وارد کنید:
cd AD:

همانطور که مشاهده می کنید خط Prompt به AD تغییر می کند و AD اشاره به Root Directory Service Entry یا همان RootDSE دارد. اکنون با دستور Dir می توانید لیست محتویات را مشاهده کنید و با دستور cd می توانید به شاخته های مختلف بروید. در اینجا می خواهیم در OU=Sales یک OU جدید برای مسئولین قرارداد ایجاد کنیم:

cd AD:cd “dc=erfantaheri,dc=com”cd “ou=Sales” New-Item -Name “ou=Contractors” –ItemType organizationalUnit

همچنین می توان با استفاده از پارامتر path بدون انتقال به شاخته مورد نظر مستقیما در مسیر مطلوب آیتم را ایجاد کرد. با استفاده از Alias ها دستور بسیار کوتاه تر از این می تواند باشد.

New-Item -Name “ou=Contractors” –ItemType organizationalUnit –path “ou=sales, DC=erfantaheri, DC=com”
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل

شیئ کاربر در PowerShell

شاید ساخت اشیاء در محیط گرافیکی برای شما راحت تر به نظر برسد، اما این فرصت را به خود بدهید که هر عملی را که در محیط گرافیکی انجام می دهید در PowerShell نیز امتحان کنید. با استفاده از دستور زیر می توانید یک User Account جدید ایجاد کنید. در صورتی که مسیر را مشخص نکنید، در مسیر پیش فرض یعنی User Container ساخته می شود.

New-ADUser -Path “ou=User Accounts,dc=contoso,dc=com” -Name “UserName” -SAMAccountName “UserSAM” -AccountPassword (ConvertTo-SecureString -AsPlainText “Pa$$w0rd” -Force) –Enabled $ture PowerShell
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل

اجازه ی دسترسی cmdlet ها را به منابع محرمانه از جمله کلمه عبور بدون رمزنگاری نمی دهد. برای همین منظور اگر قصد دارید کلمه عبور را به صورت Plain Text (متن رمزنشده) وارد کنید لازم است ابتدا آن را به متن رمز شده تبدیل کنید. در دستور فوق ConvertTo-SecureString این عمل را انجام می دهد. اکانت های ساخته شده به صورت پیش فرض Disabled می باشند و با استفاده از پارامتر Enabled اکانت به صورت فعال ساخته می شود.

با استفاده از ساخت یک قالب (Template) ساخت کاربر می تواند سریع تر از پیش هم گردد.

$user = Get-ADUser “CN=_Sales Template,OU=User Accounts,DC=erfantaheri,DC=com”
-Properties MemberOf,Title,Department,Company,PhysicalDelivery OfficeName
New-ADUser -path “ou=User Accounts,dc=erfantaheri,dc=com” -Instance $user -Name “UserName”
-SAMAccountName “UserSAM”

توجه داشته باشید که با استفاده از تعیین پارامتر ها در دستور New-ADUser می توانید موارد تعیین شده در قالب را override کنید.
همچنین با استفاده از دستور Set-ADUser می توانید Attribute های مختلف مربوط به یک User Account را تنظیم کنید.:

Set-ADUser –Identity erfan-EmailAddress “erfan@erfantaheri.com”

امکان Pipe کردن اکانت کاربری نیز وجود دارد:

Get-ADUser -Identity erfan| Set-ADUser -EmailAddress “erfan@erfantaheri.com”

با استفاده از یک متغیر کمکی نیز می توانید یک یا دسته ای از attribute ها را Set کنید:

$user = Get-ADUser -Identity erfan $user.mail = “erfan@erfantaheri.com” Set-ADUser -Instance $user

در خط دوم دستور فوق، از LDAP Name مربوط به یک Attribute به نام Mail استفاده شده است که الزاما نام هر Attribute با LDAP Name آن یکسان نمی باشد. با استفاده از Attribute Editor می توانید LDAP Name های مختلف را به آسانی بیابید.
با استفاده از دستور Remove-ADUser می توانید یک شیئ کاربر را حذف کنید.

مدیریت کلمه های عبور

در PowerShell امکان مدیریت Password ها نیز وجود دارد. این امر با استفاده از دستور Set-ADAccountPassword صورت می گیرد.

Set-ADAccountPassword -Identity “mary.north” -Reset

Set-ADAccountPassword -Identity “manager” -Reset -NewPassword (ConvertTo-SecureString -AsPlainText “Pa$$w0rd” -Force)

Import کردن کاربران از یک Database

با استفاده از pipe کردن، این عملیات بسیار ساده تر از قبل صورت می گیرد. در اینجا با استفاده از یک فایل CSV آماده قصد داریم هزاران کاربر را در Active Directory اضافه کنیم. برای اطلاعات پیش زمینه مراجعه شود به “خودکار کردن فرآیند ساخت کاربران” توجه داشته باشید در خط ابتدایی فایل csv لازم است پارامتر های دستور New-ADUser درج شده باشد و مقادیر آن ها در خطوط بعد به همان ترتیب در خط اول. به عنوان مثال:

name,sAMAccountName,GivenName,Surname John Woods,john.woods,Johnathan,Woods Kim Akers,kim.akers,Kimberly,Akers

در نهایت تنها کافی است به سادگی یک خط pipe بنویسیم:

import-csv “C:UsersAdministratorDesktopnewusers.csv” | New-ADUser -organization Contoso

اگر attributeهایی در فایل CSV تعیین نشده است، می توانید به راحتی آن ها در خود pipe معین کنید. همانند مثال فوق.

شیئ گروه در PowerShell

اکنون دانش مناسبی نسبت به کار های اولیه در PowerShell پیدا کرده اید. به راحتی می توانید با cmdlet ها کار کنید. با استفاده از دستور Get-Help می توانید توضیحات مربوط به هرکدام از دستورات زیر را پیدا کنید:

cmdlet توضیح
New-ADGroup ساخت گروه جدید
Remove-ADGroup حذف گروه
Get-ADGroup دریافت یک گروه
Set-ADGroup تنظیم Attribute های گروه
Add-ADGroupMember افزودن عضو به گروه
Remove-ADGroupMember حذف عضو از گروه
Get-ADGroupMember دریافت اعضای گروه

در اینجا قصد داریم یک گروه جدید ایجاد کنیم:

New-ADGroup –Name Support –GroupScope Global –GroupCategory Security
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل
Managing Active Directory with PowerShell مدیریت اکتیو دایرکتوری با پاورشل

شیئ کامپیوتر در PowerShell

cmdlet های مربوط به شیئ کامپیوتر را می توانید در جدول زیر مشاهده کنید:

cmdlet توضیح
New-ADComputer ساخت شیئ کامپیوتر
Remove-ADComputer حذف شیئ کامپیوتر
Get-ADComputer دریافت شیئ کامپیوتر
Set-ADComputer تنظیم Attribbute های شیئ کامپیوتر

دیدگاه

آدرس ایمیل شما منتشر نخواهد شد.