Резюме: Microsoft Active Directory PFE Adam Haynes рассказывает о написанном им PowerShell-скрипте для получения статуса резервного копирования Active Directory без использования repadmin.
Ed Wilson на связи. Сегодня я публикую первый из пяти гостевых постов, написанных Microsoft PFE Adam Haynes с некоторой помощью его друга Microsoft PFE Shubert Somer.
Слово тебе, Адам.
Чем больше я изучаю и использую Windows PowerShell, тем больше я им восхищаюсь, хотя вы наверное это знаете. Порой кажется, что в Windows Server 2012 есть командлет для всего, так как количество присутствующих в нем командлетов в 10 раз превышает количество командлетов, существовавших в предыдущих версиях. Я Active Directory PFE, и по мере использования модуля Active Directory в Windows Server 2008 R2 я начал сталкиваться с ограничениями встроенных командлетов.
Конечно, существуют и другие варианты выполнения задач, но мне нравится создавать свои собственные инструменты и я решил посмотреть, как мне может помочь использование .NET Framework в PowerShell. Я не разработчик, но я потратил некоторое количество времени на изучение основ .NET Framework чего пришел к выводу, что тот факт, что я не разработчик имеет свои причины. Но так как я работаю в Microsoft, у меня есть друзья среди разработчиков, которые согласились ответить на мои вопросы и я собираюсь поделиться с вами частью этих бесед.
Моя изначальной целью было получение статуса резервного копирования Active Directory без использования команды repadmin /showbackup.
Я полагаю, вы знаете где в Active Directory хранится эта информация. Если нет, поищите атрибут dsaSignature и возвращайтесь. Я могу вызвать repadmin из Winodws PowerShell и затем заняться разбором полученных строк, но это PowerShell, и кроме этого, мы собирались поговорить о .NET!!! Мне нужны объекты, чтобы я мог работать с полученной информацией более простым способом, вместо того, чтобы строить шаблоны для разбора нескольких строк текста. Поиск примеров кода в интернете и чтение материалов с сайта MSDN вылилось в следующий скрипт:
Import-Module ActiveDirectory
[string]$dnsRoot = (Get-ADDomain).DNSRoot
[string[]]$Partitions = (Get-ADRootDSE).namingContexts
$contextType = [System.DirectoryServices.ActiveDirectory.DirectoryContextType]::Domain
$context = new-object System.DirectoryServices.ActiveDirectory.DirectoryContext($contextType,$dnsRoot)
$domainController = [System.DirectoryServices.ActiveDirectory.DomainController]::findOne($context)
ForEach($partition in $partitions)
{
$domainControllerMetadata = $domainController.GetReplicationMetadata($partition)
$dsaSignature = $domainControllerMetadata.Item(«dsaSignature»)
Write-Host «$partition was backed up $($dsaSignature.LastOriginatingChangeTime.DateTime)`n»
}
Мы не собираемся рассказывать об использовании модуля ActiveDirectory или о цикле ForEach. Все это можно найти в файлах справки с помощью Get-Help. Как я уже говорил ранее, я нашел в интернете несколько мест, которые содержали большую часть скрипта в готовом виде. Чего я не нашел, так это качественного объяснения работы с объектами .NET с точки зрения администратора, т.е. что делает каждая строка кода и для чего она нужна.
Я не собираюсь рассказывать вам о работе резервного копирования и восстановления Active Directory, но о чем нам необходимо поговорить, так это о некоторых концепциях .NET Framework, для того, чтобы понимать, как именно работает этот скрипт. В программировании существует множество тонкостей и поэтому нам нужно представить это в как можно более простом и понятном виде. Если вы уже знакомы с Windows PowerShell, тогда большая часть материала будет вам уже известна в той или иной степени. В частности, мы собираемся рассмотреть следующие концепции, а также то, как ион используются в приведенном скрипте:
Тип/Класс (Type/Class) – Класс это чертеж или шаблон, определяющий как должен выглядеть объект и что он сможет делать. В рамках этой статьи, вы можете считать, что Тип – это то же самое, что и класс с одним отличием: Тип большей частью применяется в виде прилагательного, а Класс – в виде существительного. Мы рассмотрим некоторые примеры этого отличия далее.
- Если попытаться привести в качестве примера нечто из области механики – можно вспомнить планы (чертежи для сборки) для каждой детали машины или даже для всей машины целиком. Эти чертежи представляют из себя «класс» определенной детали или всей машины.
Объект (Object) – Объект это экземпляр класса, т.е. то, что было построено с использованием класса.
- Продолжая сравнение с автомобилем, физические части машины, или вся машина целиком представляет из себя «объект». (Определяя различия между классом и типом, чертежи и планы, по которым была построена машина будут ее «типом»).
Метод (Method) – Метод это функция класса, и, следовательно, это действие, которое способен выполнять объект.
- Говоря о нашем объекте «автомобиль» — мы можем сказать, что его методы будут «Начать движение», «Остановиться», «Повернуть» и т.д.
Конструктор (Constructor) – Конструктор это специальный метод, содержащий код для создания объекта на основе «чертежей» класса и инициализировать его с некоторыми значениями по умолчанию, либо с предоставленными значениями.
- Здесь автомобильная аналогия уже не подходит в полной мере для описания концепции, но вы можете представить некий завод, который создает каждую часть машины (или всю ее целиком) на основе планов и чертежей. Этому заводу понадобятся некоторые инструкции чтобы использовать чертежи, наподобие «вставьте плату А в слот В» и именно эти инструкции будут представлять из себя «конструктор». Важно отметить то, что вам понадобится еще один участник процесса – тот кто фактически произведет эту сборку. В нашем примере с автомобилем – это автомобильный завод. Что касается .NET – здесь роль «завода» будет играть .NET Framework. Мы увидим это в действии когда начнем разбирать наш скрипт.
Свойство (Property) – Свойство это часть информации о самом объекте.
- К свойствам объекта «автомобиль» можно отнести «Цвет», «Размер», «Вес» и т.д.
Член (Member) – Конструкторы, методы и свойства класса все вместе называются его членами.
Вы, наверное, заметили, что я несколько раз использовал слово «Мы». В следующем посте я представлю вам моего друга, developer PFE, который поможет мне объяснить некоторые концепции с точки зрения разработчика. Разговор на одном языке помогает при изучении новых вещей. Цель же этих статей – это вывести ваши навыки PowerShell за пределы командлетов, на тот случай, если вам понадобиться нечто большее.
~Adam.
Автор:
Ed Wilson, Microsoft Scripting Guy
Оригинал:
Страницы в социальных сетях:
Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell