فهرست مطالب این مقاله:
در این مقاله، دو ابزار پیشفرض ویندوز (CSVDE و POWERSHELL) و همچنین یک ابزار گزارشگیری که از آنها میتوان برای اکسپورت کاربران اکتیو دایرکتوری در فایل CSV استفاده کرد را بیان خواهیم کرد.
از مدیران شبکه اغلب خواسته میشود تا کاربران موجود در Active Directory را اکسپورت کنند. در برخی موارد حتی خواسته میشود تا فیلتری خاص (برای مثال کاربرانی که 1 ماه از آخرین زمان لاگین آنها میگذرد) بر روی خروجی کاربران اعمال شود تا بتوان از آنها به عنوان گزارش استفاده کرد. در این مقاله، چگونگی استفاده از ابزار CSVDE به منظور اکسپورت کاربران اکتیو دایرکتوری در یک فایل CSV را توضیح خواهیم داد. سپس، با بیان چند مثال عملی، نشان خواهیم داد که ابزار قدرتمندی مانند PowerShell چگونه میتواند به شما در اکسپورت کاربران و همچنین گزارشگیری کمک کند. در انتها نیز یک ابزار تحت وب را معرفی خواهیم کرد که امکانات پیشرفته گزارشگیری از اکتیو دایرکتوری را برای شما فراهم میکند.
اکسپورت کاربران اکتیو دایرکتوری به کمک ابزار CSVDE
سادهترین روش اکسپورت اطلاعات اکتیو دایرکتوری که از نخستین ورژنهای ویندوز سرور نیز وجود داشته است، ابزار CSVDE میباشد. توجه داشته باشید که این دستور حتما باید بر روی یک DC اجرا شود. بر روی سرور DC، ابزار خط فرمان یا همان cmd را باز کنید و عبارت زیر را در آن وارد کنید.
csvde -f c:csv.csv
این دستور یک فایل با فرمت CSV میسازد که شامل اطلاعات تمام اشیاء اکتیو دایرکتوری (مانند یوزر، کامپیوتر، گروه و غیره) میباشد. این فایل در آدرسی که بعد از کلید f- نوشته میشود ذخیره میشود. شما میتوانید با استفاده از کلید r- سطرهای خروجی را فیلتر کنید. برای مثال با استفاده از دستور زیر میتوانید فایل خروجی را محدود به یوزرهای اکتیو دایرکتوری کنید تا اطلاعات مربوطه به دیگر اشیاء، مانند کامپیوترها و گروهها، در آن نیاید.
csvde -f c:csv.csv -r objectClass=person
با آنکه خروجی فایل ساخته شده توسط دستور فوق تنها شامل اطلاعات کاربران است، اما با این حال اکثر صفتهای کاربران در آن نمایش داده میشود که ممکن است به دلیل حجم بالا، بررسی و تحلیل آن ساده نباشد. برای حل این مشکل، شما میتوانید از کلید l- استفاده کنید و صفتها یا attributeهایی از کاربر که میخواهید در فایل خروجی ذخیره شود را مشخص نمایید. برای مثال، دستور زیر تنها اطلاعات مربوط به (DN (Distinguished Name، نام (givenName) و نام خانوادگی (sn) را در فایل CSV خروجی ذخیره میکند.
csvde -f c:csv.csv -r objectClass=person -l "DN, givenName, sn"
در بسیاری از مواقع، شما تنها به اطلاعات یک یا چند OU از دامین خود نیاز دارید. در چنین مواردی میتوانید distinguished name مربوط به OU مورد نظر خود را توسط کلید d- برای این دستور مشخص کنید، مانند مثال زیر:
csvde -f c:csv.csv -r objectClass=person -d "OU=HR,DC=danapardaz,DC=net"
توجه داشته باشید که دستور فوق تنها برای دامین danapardaz.net کار خواهد کرد. شما باید نام OU و دامین خود را جایگزین مقدار فوق کنید. هرچند این روش بسیار ساده به نظر میرسد، روشی قدیمی در بین متخصصین مایکروسافتی محسوب میشود. ابزار قدرتمند خط فرمانی و اسکریپت نویسی PowerShell، این امکان را فراهم میسازد که گزارشات و خروجیهای بسیار متنوعتر و پیچیدهتری بگیرید. در ادامه به بررسی اجمالی ابزار PowerShell خواهیم پرداخت.
اکسپورت کاربران اکتیو دایرکتوری توسط PowerShell
ابزار PowerShell به مراتب قدرتمندتر و انعطافپذیرتر میباشد. ابتدا فایل اسکریپت رایگان اکسپورت یوزرهای اکتیو دایرکتوری را دانلود کنید. به منظور اجرای این اسکریپت پاورشل، شما میتوانید پاورشل را باز کرده (در منوی start نام آن را تایپ کنید) و سپس در پاورشل به محل دانلود فایل رفته و نام آن را تایپ کنید تا اجرا شود. با این حال، شما به احتمال بسیار زیاد با خطا مواجه خواهید شد. دلیل آن هم این است که این اسکریپت به گونهای نوشته شده است که سعی در اکسپورت کاربران از دامین danapardaz.net را دارد که شما باید آن را با نام دامین خود جایگزین کنید. بدین منظور بر روی فایل مورد نظر راست کلیک کرده و گزینه edit را انتخاب کنید تا ابزار PowerShell ISE باز شود. این ابزار امکان نوشتن دستورات پاورشل به صورت اسکریپت و اجرای آن را فراهم میکند. این فایل شامل چندین خط کد به ترتیب زیر است.
$csvfile = "C:DanaPardazALLADUsers.csv" New-Item -ItemType Directory -Force -Path C:DanaPardaz Import-Module ActiveDirectory $SearchOU = "OU=HR,DC=danapardaz,DC=net" $DC = '192.168.1.1' $AllADUsers = Get-ADUser -server $DC ` -Credential (Get-Credential) -searchbase $SearchOU ` -Filter * -Properties * $AllADUsers | Select-Object @{Label = "First Name";Expression = {$_.GivenName}}, @{Label = "Last Name";Expression = {$_.Surname}}, @{Label = "Display Name";Expression = {$_.DisplayName}}, @{Label = "Logon Name";Expression = {$_.sAMAccountName}}, @{Label = "Full address";Expression = {$_.StreetAddress}}, @{Label = "City";Expression = {$_.City}}, @{Label = "State";Expression = {$_.st}}, @{Label = "Post Code";Expression = {$_.PostalCode}}, @{Label = "Country/Region";Expression = {$_.Country}}, @{Label = "Job Title";Expression = {$_.Title}}, @{Label = "Company";Expression = {$_.Company}}, @{Label = "Department";Expression = {$_.Department}}, @{Label = "Office";Expression = {$_.OfficeName}}, @{Label = "Phone";Expression = {$_.telephoneNumber}}, @{Label = "Email";Expression = {$_.Mail}}, @{Label = "Manager";Expression = {%{(Get-AdUser $_.Manager -server $ADServer -Properties DisplayName).DisplayName}}}, @{Label = "Account Status";Expression = {if (($_.Enabled -eq 'TRUE') ) {'Enable'} Else {'Disable'}}} | Export-Csv -Path $csvfile -Delimiter "," –NoTypeInformation
خط اول نام فایل خروجی و محلی که قرار است در آن ذخیره شود را مشخص میکند. این نام و آدرس را میتوانید به دلخواه خود تغییر دهید. خط دوم وجود پوشهای با نام danapardaz را در درایو C بررسی میکند و در صورتی که این پوشه وجود نداشته باشد این پوشه توسط این خط ایجاد خواهد شد. در صورتی که محل فایل خروجی را در خط اول تغییر دادهاید لزومی به این دستور نخواهید داشت.
دستور Import-Module ActiveDirectory، ماژول لازم برای فراخوانی دستورات مرتبط با اکتیو دایرکتوری را در PowerShell فراهم میکند. در صورتی که هنگام اجرای اسکریپت، در این دستور با خطا مواجه شدید، بدین معنی است که این ماژول فعال و نصب نشده است. برای نصب آن بر روی ویندوز سرور، باید feature مربوط به آن را که در مسیر Remote Server Administration Tools، سپس Role Administration Tool، سپس AD DS and AD LDS Tools، و در نهایت Active Directory Module for Windows PowerShell وجود دارد فعال کنید. اگر از ویندوزهای کلاینتی، مانند ویندوز 7، استفاده میکنید، شما ابتدا باید ابزار RSAT یا Remote Server Administration Tools را نصب کنید تا امکان فعالسازی این Option فراهم شود. برای نصب RSAT در ویندوز کلاینتی به لینک مربوط به آن مراجعه کنید:
شما ممکن است که به خطای the script cannot be loaded because running script is disabled on this system برخورد کنید. دلیل آن هم این است که به طور پیشفرض در ویندوزهای سروری امکان اجرای اسکریپت پاورشل وجود ندارد. در چنین حالتی، شما باید با استفاده از دستور زیر که آن را باید در پاورشل اجرا کنید امکان اجرای اسکریپت پاورشلی را فعال کنید:
Set-ExecutionPolicy RemoteSigned
متغیر SearchOU در این اسکریپت شامل distinguished name واحد سازمانیای (OU) هست که میخواهید یوزرهای درون آن را در فایل CSV اکسپورت کنید. مقدار این متغیر را بر اساس دامین و نام OU موجود در دامین خود تغییر دهید. اگر میخواهید تمام یوزرهای دامین خود را اکسپورت کنید، در این متغیر فقط نام دامین خود را قرار دهید. توجه داشته باشید که اگر تعداد یوزرهای دامین شما زیاد است، اجرای این اسکریپت ممکن است چندین دقیقه به طول بیانجامد.
متغیر DC حاوی IP آدرس دامین کنترلری میباشد که شما میخواهید اطلاعات را از آن اکسپورت کنید. با این وجود، ضرورتی به مشخص کردن DC نمیباشد. در صورتی که برای شما فرقی نمیکند که از کدام DC یوزرها اکسپورت شوند کلید یا عبارت server $DC- را از دستور Get-ADUser حذف کنید تا این دستور از مقدار درون متغیر DC استفاده نکند. در مواردی خاص، مانند حالتی که چندین DC دارید و به دلیل تنظیمات Replication بعضی از سرورها معمولا اطلاعات آپدیتتری دارند، میتوانید از این کلید استفاده کنید.
همچنین، توجه داشته باشید که باید AD web service بر روی سرور شما نصب شده باشد تا بتوانید دستوراتی مانند Get-ADUser را اجرا کنید. اگر از ویندوزهای سروری مانند Windows Server 2008 R2 یا بالاتر استفاده میکنید، این سرویس هنگام نصب Active Directory به طور خودکار بر روی سرور نصب خواهد شد. برای Windows Server 2008 (غیر از R2) باید ابتدا KB969166 و KB968934 را نصب کنید و سپس سرور را یکبار ریست کنید. اگر از ویندوز سرور 2003 استفاده میکنید، باید AD Management Gateway Services را نصب کنید. برای نصب AD Management Gateway Services به مقاله زیر رجوع کنید:
هنگامی که در نهایت، پس از اعمال تغییرات مورد نظر، اسکریپت فوق را اجرا میکنید، یک پنجره باز میشود و username و password از شما خواسته میشود. دلیل پرسیدن این اطلاعات وجود کلید (Credential (Get-Credential- میباشد. در صورتی که این کلید را حذف کنید، این اسکریپت و query مربوط به آن با یوزری انجام میشود که با آن لاگین کردهاید. بدیهی است که این یوزر باید دسترسی خواندن اطلاعات تمام کاربران دامین را داشته باشد تا عملیات اکسپورت موفقیتآمیز باشد.
اطلاعات تمام یوزرهایی که قرار است در فایل CSV اکسپورت شوند در AllUsers ذخیره میشود. بخش آخر اسکریپت که با علامت Pipe (|) به دستور Export-CSV متصل شده است، عمل اکسپورت نهایی را از اطلاعات موجود در AllUsers انجام میدهد. این بخش به گونهای نوشته شده است که اکثر فیلدها یا attributeهای مهم یوزرها در خروجی اکسپورت شوند. اگر میخواهید فیلد دیگری نیز در خروجی قرار گیرد، به سادگی میتوانید از الگوی زیر در خط قبل از Pipe استفاده کنید:
@{Column = "AAA";Expression = {$_.BBB}},
در این الگو باید مقدار AAA را با نام دلخواهی که دوست دارید در ابتدای فایل CSV به عنوان نام آن ستون نوشته شود جایگزین کنید. همچنین مقدار BBB را نیز با نام یکی از attributeهای یوزر جایگزین کنید. طبیعی است که مقدار BBB را نمیتوانید با هر نام دلخواهی جایگزین کنید.
در خط آخر که شامل دستور Export-Csv میباشد، کلید NoTypeInformation- باعث میشود تا اطلاعات مربوط به نوع اشیا در فایل CSV ذخیره نشود. در حقیقت اگر این کلید را بردارید، در خط اول از فایل CSV عبارتی مانند ““#TYPE Selected.Microsoft.ActiveDirectory.Management.ADUser” نمایش داده میشود. اما از آنجا که ما خودمان خروجی را محدود به یوزرها کردهایم، بنابراین بدیهی است که در خط اول تنها این عبارت که مشخص میکند نوع اشیاء خروجی از نوع ADUser است نمایش داده میشود. بنابراین با افزودن این کلید میتوانیم از نمایش اطلاعات زائد در فایل خروجی جلوگیری کنیم. شما همچنین به کمک کلید Delimiter- میتوانید کاراکتر جداکنندهای که در فایل CSV از آن استفاده خواهد شد را نیز مشخص کنید. بدین منظور کاراکتر جداساز مدنظر خود را در دابل کوتیشن (Double quotation) و بعد از کلید Delimiter- قرار دهید. در این اسکریپت ما از کاراکتر کاما استفاده کردهایم.
چگونگی فیلترگذاری بر روی فایل CSV
دستور Get-ADUser دارای کلیدی است که امکان فیلتر کردن خروجی را فراهم میکند. فرض کنید که میخواهید به جای اکسپورت کردن تمام کاربران دامین خود، میخواهید کاربرانی را که آدرس ایمیل آنها خالی است بیابید. کلید filter- در این دستور این امکان را فراهم میکند که شرطهایی را بر روی اشیا اکتیو دایرکتوری گذاشته تا تنها برخی از آنها بازگردانده شوند. برای مثال دستور زیر باعث میشود تا تنها یوزرهایی که آدرس ایمیل آنها خالی است در AllUsers قرار گیرند.
$AllUsers = Get-ADUser -server $DC ` -Credential (Get-Credential) -searchbase $SearchOU ` -Filter {(EmailAddress -notlike "*")} -Properties *
در این دستور، EmailAddress همان نام LDAP برای فیلد آدرس ایمیل میباشد. کلید notlike- مشخص میکند که شما دنبال ایمیلهایی میگردید که الگوی آنها از * پیروی نمیکنند. ستاره (*) به معنی هر چیزی (یا هر ترکیبی از کاراکترها) میباشد، اما اگر خالی باشد شامل این الگو نمیباشد. برای دریافت خروجی مربوطه، قسمت Get-ADUser در فایل اسکریپت را با دستور فوق جایگزین کنید. شما همچنین میتوانید فایل اسکریپت اکسپورت یوزرهایی که آدرس ایمیل آنها خالی است را نیز به صورت رایگان دانلود کنید.
حال به بررسی یک مثال پیچیدهتر و کاربردیتر میپردازیم. فرض کنید میخواهیم برای حفظ جامعیت پایگاه دادهی اکتیو دایرکتوری خود، یوزرهایی که آدرس ایمیل خود را عمداً یا سهواً با ساختاری اشتباه وارد کردهاند شناسایی کنیم. ساختار صحیح یک ایمیل باید به صورت AAA@BBB.CCC باشد. فیلتر زیر از دستور Get-ADUser این کار را انجام میدهد.
$$AllUsers = Get-ADUser -server $DC ` -Credential (Get-Credential) -searchbase $SearchOU ` -Filter {(EmailAddress -notlike "*@*.*")} -Properties *
شما همچنین میتوانید با ترکیب شرطها، عملاً گزارشات کاربردی از اکتیو دایرکتوری خود بگیرید. برای مثال درستور زیر تمام کاربرانی را به شما میدهد که ایمیل آنها خالی است و عضو دپارتمان HR هستند.
$$AllUsers = Get-ADUser -server $DC ` -Credential (Get-Credential) -searchbase $SearchOU ` -Filter {(EmailAddress -notlike "*") -and (department -eq 'HR') } -Properties *
توجه داشته باشید که از دستور notlike- یا like- زمانی استفاده میشود که میخواهید مقایسه را به صورت الگو انجام دهید (برای مثال با استفاده از *). اما از eq- و ne- زمانی استفاده میشود که میخواهید عین عبارت را مقایسه کنید. در جدول زیر لیست عملگرهای متداولی که در کلید filter- استفاده میشود را نشان داده است.
عملگر منطقی | توضیحات |
eq- | برابر بودن |
ne- | برابر نبودن |
like- | برابر بودن با امکان مشخص کردن الگو با علامت ستاره |
notlike- | برابر نبودن با امکان مشخص کردن الگو با علامت ستاره |
or- | یا |
and- | و |
not- | نبودن |
le- | کوچکتر یا مساوی |
lt- | کوچکتر بودن |
ge- | بزرگتر یا مساوی بودن |
gt- | بزرگتر بودن |
گزارشات پیچیدهتر و کاربردیتر از اکتیو دایرکتوری
ما در این مقاله به بررسی دو ابزار توکار مایکروسافتی پرداختیم که امکان اکسپورت یوزهای Active Directory را در یک فایل خروجی CSV فراهم میآورد. ما همچنین کلیدها و دستوراتی را معرفی کردیم که شما به کمک آنها میتوانید بر روی خروجی این دستورات فیلترهایی را اعمال کرده و گزارشات کاربردی از اکتیو دایرکتوری خود بدست آورید. اما، چگونه میتوان به معنای واقعی گزارشگیری از اکتیو دایرکتوری انجام داد (نه صرفاً اکسپورت ساده از تمام یوزرها)؟ چگونه میتوان لیست تمام کاربرانی که اکانت آنها مسدود شده است را بدست آورد و حتی تمام آنها را به صورت یکجا از حالت مسدود خارج کرد؟ چگونه میتوان لیست تمام کاربرانی که تنها عضو گروه Domain Users هستند بدست آورد؟ آیا میتوان گروههایی را بدست آورد که هیچ یوزری عضو آنها نیست؟ تمام این گزارشات بسیار کاربردی نیازمند دانش اسکریپت نویسی پیشرفته هستند که در یک یا چند مقاله قابل آموزش نیست. نرم افزار مدیریت اکتیو دایرکتوری برنا یک ابزار پیشرفته در این زمینه است که شما را از استفاده از نمونه های خارجی بی نیاز خواهد کرد.