sergey vasin

The IT blog

Weekend Scripter: Использование перечислителей .NET Framework в Windows PowerShell – Hey, Scripting Guy! Blog

leave a comment »

Резюме: Гостевые блогеры Microsoft PFE Adam Haynes и Shubert Somer рассказывают об использовании перечислителей .NET Framework при работе с Active Directory.

Microsoft Scripting Guy Ed Wilson на связи. Сегодня я публикую третью из пяти статей, написанных Adam Haynes с некоторой помощью его друга Shubert Somer. Перед прочтением данной статьи рекомендуется ознакомиться с частью 1 и частью 2.

Итак, Адам.

В первой и второй части этой серии статей Шуберт и я разобрали несколько очень важных концепций и терминов, касающихся .NET Framework и того, как он может быть использован в Windows PowerShell. Мы не рассматривали все возможные темы .NET Framework, вместо этого мы уделили внимание наиболее важным частям, имеющим непосредственное отношение к этой серии статей. Теперь мы займемся построчным анализом скрипта, чтобы помочь вам понять, как вы можете использовать материалы сайта MSDN при работе с PowerShell.

Если вы хотите все это попробовать в тестовой среде, то убедитесь, что на компьютере, с которого запускается скрипт, доступен модуль ActiveDirectory. Этот модуль входит в состав RSAT.

Первые несколько строк достаточно понятны, поэтому мы не будем много о них говорить. Скажем лишь то, что, если вы посмотрите на скрипт в целом, то заметите, что я переходил от использования командлетов к .NET Framework и обратно. На самом же деле, это все — .NET, но Windows PowerShell и командлеты абстрагируют это от администратора, чтобы мы могли использовать всю эту мощь посредством короткого скрипта или даже одной строки кода.

Далее, в строках 3 и 4 я явным образом указываю класс/тип переменных. В данном случае это может быть излишним, однако, в большей степени это вопрос личных предпочтений, поскольку Windows PowerShell оставляет нам некоторый простор для небрежности (о чем Шуберт не перестает мне напоминать).

Объяснить пятую строку я попрошу Шуберта.

01

Shubert: Строка 5 – это пример еще одного специального класса, называемого перечислителем (enumeration). Технически, перечислитель – это тип, а не класс, но в нашем случае эти различия не так важны. Фактически, перечислители – это числа типа integer, но они сопоставлены текстовым именам, понятным человеку. Они используются для того, чтобы простым и понятным способом указать некоторое значение, в нашем случае – Directory Context Type. Разработчики, создавшие модуль ActiveDirectory знали, что существует только несколько возможных значений этого типа, поэтому создали перечислитель DirectoryContextType, в котором содержатся все эти значения. Текстовые значения будут предлагаться в IntelliSense и прочих вспомогательных механизмах, так что вы можете не опасаться, что при наборе длинных имен допустите какую-нибудь ошибку.

Также обратите внимание на используемый синтаксис: [Полное.Имя.Перечислителя]::Значение. Это тот же самый синтаксис, что используется для получения статического члена класса, так что постарайтесь не путать эти две концепции: перечислители – это просто обозначения, и они не содержат какой-либо дополнительной функциональности.

Adam: То есть, когда я открываю на MSDN статью DirectoryContextType Enumeration, я вижу все возможные значения.

02

Я указываю “Domain”, и .NET использует “0”, а если я укажу “Forest”, .NET задействует значение “1”.

Shubert: Да, фактически .NET Framework использует число типа integer, но вы всегда будете указывать его с помощью перечислителя, как в вышеприведенном примере.

Adam: Строка 7 инициализирует новый экземпляр контекста Active Directory с использованием учетных данных текущего пользователя. Заметьте, что я уже начал использовать некоторые определения и термины, о которых мы разговаривали в прошлых статьях.

03

Shubert: Здесь мы видим пример конструктора. Вы видите, что здесь используется командлет New-Object, и что имя класса не заключено в квадратные скобки. Это потому, что здесь мы ссылаемся не на сам класс, а на метод – конструктор – этого класса. Это не так очевидно, поэтому убедитесь, что вам понятны эти отличия.

Adam: В строке 8 вызывается статический метод FindOne() класса DomainController с указанием определенного контекста, который мы создали в строке 7.

04

Давайте поговорим об этой строке немного подробнее.

05

Этот часть строки ссылается на класс DomainController. Как видите, вы должны заключить имя класса в квадратные скобки, чтобы PowerShell знал, что это класс. Вы можете воспользоваться MSDN или передать этот класс командлету Get-Member, чтобы определить, что этот класс может делать. Однако, таким образом вы не получите полный список всех методов класса.

06

Вы можете заметить, что статические методы класса DomainController, указанные на MSDN не показываются при использовании предыдущей команды. Для того, чтобы получить список статических членов класса в Windows PowerShell вам нужно указать переключатель –Static в командлете Get-Member. Попробуйте оба варианта и вы увидите разницу:

07

После того, как мы определили доступные для использования статические методы класса мы можем на них ссылаться, использую тот же самый синтаксис. Мы указываем имя метода, отделенное двойным символом двоеточия от имени класса, заключенного в квадратные скобки. Помните, что сказал Шуберт относительно разницы в синтаксисе при использовании статического метода и перечислителя? Ее нет. Мы знаем, что это разные вещи только потому, что так сказано на MSDN.

08

Shubert: Вы можете спросить, откуда мы знаем, что нужно использовать статический метод FindOne(). А также, откуда мы знаем, что нужно указать объект контекста в качестве аргумента. Это идет из знания объектной модели для определенной технологии. Адам часто любит повторять следующую фразу, когда говорит о Windows PowerShell – «Для этого существует командлет». Так вот, я могу сказать следующее о .NET – «Для этого существует класс». Очень часто существует более одного способа решения определенной проблемы, поэтому, если вам кажется, что найденный вами вариант слишком сложен, продолжайте искать – вполне вероятно существует другой класс или метод, который более подходит для вашего случая. Обращайте внимание на статические методы, поскольку они зачастую используются как утилиты для уменьшения сложности скрипта. Например, использованный нами метод – FindOne() – создает полный и готовый для использования объект контроллера домена без использования конструктора или командлета New-Object.

По мере работы с сайтом MSDN, вы можете заметить несколько важных иконок напротив имен и методов. Одна из них – это жирная буква S.

09

Она является обозначением чего-либо статического, поэтому вы должны ссылаться на это через имя класса – [Какое-то.Длинное.Имя.Класса]::СтатическийМетод() – а не через переменную (содержащую экземпляр объекта) — $Экземпляр.Метод().

Другая иконка, которую вы можете встретить – это изображение маленького ключа.

10

Это означает, что этот член защищен (protected) (т.е. предназначен для использования только разработчиками классов), и в обычных обстоятельствах не будет доступен вам для использования в скрипте.

Adam: Оставшаяся часть скрипта – это обычный Windows PowerShell.

Строка 12 получает метаданные репликации из объекта контроллера домена, который был получен в строке 8. Делается это путем вызова метода GetReplicationMetadata и передачи ему текущего обрабатываемого раздела.

В строке 13 мы получаем dsaSignature из объекта DomainControllerMetadata, который мы получили в предыдущей строке.

Строка 14 – довольно простая. Мы получаем атрибуты, или свойства, метаданных репликации и задаем строку для вывода.

11

Shubert: Я полагаю, сейчас этот код стал более понятным. Однако, здесь все еще есть о чем рассказать, поэтому давайте продолжим.

$DomainController – это .NET объект DomainController и мы можем использовать символ точки «.» для доступа ко всем его методам. Один их этих методов – GetReplicationMetadata(). Этот метод возвращает еще один объект .NET – ActiveDirectoryReplicationMetadata.

Итак у нас есть $DomainController.GetReplicationMetatdata($Partition). Заглянув MSDN, мы узнаем, что это объект ActiveDirectoryReplicationMetadata. Но что это? Это еще один особый вид объекта, называемый словарем (Dictionary), который в сущности является массивом объектов, каждый из которых связан с уникальным идентификатором, для того, чтобы на них было проще ссылаться. Делается это через свойство Item(), которое выглядит как метод. Фактически это ссылка на содержимое словаря. Для того, чтобы получить определенный объект, нам нужно указать значение его идентификатора, что выглядит как указание параметра. В нашем скрипте мы указываем идентификатор dsaSignature и получаем объект AttributeMetadata.

Adam: То есть, словарь в .NET Framework — это что-то вроде хеш-таблицы в Windows PowerShell?

Shubert: Да, их концепции во многом схожи, особенно в том, что в обоих случаях используются пары имя/значение, однако определение того, какие идентификаторы содержатся в словаре может быть непростой задачей. В нашем случае, класс ActiveDirectoryReplicationMetadata обладает еще одним свойством – AttributeNames – содержащим список всех имеющихся идентификаторов. Вы можете написать небольшой скрипт, который получает значения для всех идентификаторов, содержащихся в AttributeNames, и выводит их на экран (возможно с использованием командлетов форматирования). К сожалению, здесь вам не поможет командлет Get-Member, так как в этом случае он выведет все свойства и методы самого словаря. Это не то же самое, что содержащиеся в нем объекты.

Adam: Командлет Get-Member может дать нам начальный импульс, остальную часть работы сделает Windows PowerShell. Например, если мы запустим $DomainControllerMetadata.AttributeNames – PowerShell выведет нам список всех имен атрибутов. Еще одна замечательная вещь в PowerShell – это форматирование по умолчанию – Out-Default. Более подробную информацию о форматировании в Windows PowerShell вы можете найти в статье одного из его архитекторов — How PowerShell Formatting and Outputting REALLY works.

Ну что, все довольно туманно? Но я думаю, что сейчас понятного все же гораздо больше, чем в начале. Если это так, то мы рады. Если нет – это вина Шуберта. Даже если вы не являетесь администратором Active Directory, основная информация о .NET Framework пригодится вам и при работе в других областях. В четвертой части мы используем наши новые знания при разборе еще одного скрипта, а также мы рассмотрим еще один компонент .NET – сборку (assembly). Это достаточно серьезная вещь, так что не пропустите.

~Adam.

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2013/01/20/weekend-scripter-using-net-framework-enumerations-in-windows-powershell.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Written by Сергей Васин

Март 9, 2013 в 11:19

Опубликовано в HeyScriptingGuyBlog, PowerShell

Tagged with ,

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s