Exchange Management Shell, на заметку

Наткнулись мы тут однажды на забавную фичу. Вроде казалось бы Exchange Management Shell, порядка трехсот коммандлетов, чего уж там загадочного может быть. После месяцев 3-5 интенсивного ежедневного использования EMShell – в нем уже не остается никаких белых пятен. А вот попадались по началу штуки, вызывавшие удивление.
Т.е., к примеру, из EMShell можно рулить всеми свойствами Exchange, его компонентов, реципиентов и прочая. Параметры можно опрашивать, делать выборки объектов, по заданным значениям аттрибутов, и в отобранном контенте же – изменять значения нужных аттрибутов. Все просто, привычность – дело наживное. Но некоторые аттрибуты выдают неожиданные результаты:
Собираем информацию по почтовой базе данных:

Get-MailboxDatabase

Получаем что-нибудь вроде

Name                 Server          StorageGroup         Recovery
----                 ------          ------------         --------
Mailbox Database     Exch-MB1        First Storage Group  False

Чтобы получить перечень всех возможных к опросу аттрибутов данного объекта набиваем

Get-MailboxDatabase | Get-MemberНа что нам возвращают

TypeName: Microsoft.Exchange.Data.Directory.SystemConfiguration.MailboxDatabase

Name                               MemberType Definition
----                               ---------- ----------
Clone                              Method     System.Object Clone()
Equals                             Method     System.Boolean Equals(Object obj)
GetHashCode                        Method     System.Int32 GetHashCode()
GetType                            Method     System.Type GetType()
get_AdminDisplayName               Method     System.String get_AdminDisplay...
get_AdministrativeGroup            Method     Microsoft.Exchange.Data.Direct...
get_AllowFileRestore               Method     System.Boolean get_AllowFileRe...
get_BackupInProgress               Method     System.Nullable`1[[System.Bool...
get_CopyEdbFilePath                Method     Microsoft.Exchange.Data.EdbFil...
get_DatabaseCreated                Method     System.Boolean get_DatabaseCre...
get_DeletedItemRetention           Method     Microsoft.Exchange.Data.Enhanc...
get_Description                    Method     System.String get_Description()
get_DistinguishedName              Method     System.String get_Distinguishe...
get_EdbFilePath                    Method     Microsoft.Exchange.Data.EdbFil...
get_EventHistoryRetentionPeriod    Method     Microsoft.Exchange.Data.Enhanc...
get_ExchangeLegacyDN               Method     System.String get_ExchangeLega...
get_ExchangeVersion                Method     Microsoft.Exchange.Data.Exchan...
get_Guid                           Method     System.Guid get_Guid()
get_HasLocalCopy                   Method     System.Boolean get_HasLocalCopy()
get_Identity                       Method     Microsoft.Exchange.Data.Object...
get_IndexEnabled                   Method     System.Boolean get_IndexEnabled()
get_IssueWarningQuota              Method     Microsoft.Exchange.Data.Unlimi...
get_IsValid                        Method     System.Boolean get_IsValid()
get_JournalRecipient               Method     Microsoft.Exchange.Data.Direct...
get_LastCopyBackup                 Method     System.Nullable`1[[System.Date...
get_LastDifferentialBackup         Method     System.Nullable`1[[System.Date...
get_LastFullBackup                 Method     System.Nullable`1[[System.Date...
get_LastIncrementalBackup          Method     System.Nullable`1[[System.Date...
get_MailboxRetention               Method     Microsoft.Exchange.Data.Enhanc...
get_MaintenanceSchedule            Method     Microsoft.Exchange.Data.Schedu...
get_MountAtStartup                 Method     System.Boolean get_MountAtStar...
get_Mounted                        Method     System.Nullable`1[[System.Bool...
get_Name                           Method     System.String get_Name(), Syst...
get_ObjectCategory                 Method     Microsoft.Exchange.Data.Direct...
get_ObjectClass                    Method     Microsoft.Exchange.Data.MultiV...
get_OfflineAddressBook             Method     Microsoft.Exchange.Data.Direct...
get_Organization                   Method     Microsoft.Exchange.Data.Direct...
get_OriginalDatabase               Method     Microsoft.Exchange.Data.Direct...
get_OriginatingServer              Method     System.String get_OriginatingS...
get_ProhibitSendQuota              Method     Microsoft.Exchange.Data.Unlimi...
get_ProhibitSendReceiveQuota       Method     Microsoft.Exchange.Data.Unlimi...
get_PublicFolderDatabase           Method     Microsoft.Exchange.Data.Direct...
get_QuotaNotificationSchedule      Method     Microsoft.Exchange.Data.Schedu...
get_Recovery                       Method     System.Boolean get_Recovery()
get_RetainDeletedItemsUntilBackup  Method     System.Boolean get_RetainDelet...
get_Server                         Method     Microsoft.Exchange.Data.Direct...
get_ServerName                     Method     System.String get_ServerName()
get_SnapshotLastCopyBackup         Method     System.Nullable`1[[System.Bool...
get_SnapshotLastDifferentialBackup Method     System.Nullable`1[[System.Bool...
get_SnapshotLastFullBackup         Method     System.Nullable`1[[System.Bool...
get_SnapshotLastIncrementalBackup  Method     System.Nullable`1[[System.Bool...
get_StorageGroup                   Method     Microsoft.Exchange.Data.Direct...
get_StorageGroupName               Method     System.String get_StorageGroup...
get_WhenChanged                    Method     System.Nullable`1[[System.Date...
get_WhenCreated                    Method     System.Nullable`1[[System.Date...
set_AllowFileRestore               Method     System.Void set_AllowFileResto...
set_DeletedItemRetention           Method     System.Void set_DeletedItemRet...
set_EventHistoryRetentionPeriod    Method     System.Void set_EventHistoryRe...
set_IndexEnabled                   Method     System.Void set_IndexEnabled(B...
set_IssueWarningQuota              Method     System.Void set_IssueWarningQu...
set_JournalRecipient               Method     System.Void set_JournalRecipie...
set_MailboxRetention               Method     System.Void set_MailboxRetenti...
set_MaintenanceSchedule            Method     System.Void set_MaintenanceSch...
set_MountAtStartup                 Method     System.Void set_MountAtStartup...
set_Name                           Method     System.Void set_Name(String va...
set_OfflineAddressBook             Method     System.Void set_OfflineAddress...
set_ProhibitSendQuota              Method     System.Void set_ProhibitSendQu...
set_ProhibitSendReceiveQuota       Method     System.Void set_ProhibitSendRe...
set_PublicFolderDatabase           Method     System.Void set_PublicFolderDa...
set_QuotaNotificationSchedule      Method     System.Void set_QuotaNotificat...
set_RetainDeletedItemsUntilBackup  Method     System.Void set_RetainDeletedI...
ToString                           Method     System.String ToString()
Validate                           Method     Microsoft.Exchange.Data.Valida...
AdminDisplayName                   Property   System.String AdminDisplayName...
AdministrativeGroup                Property   Microsoft.Exchange.Data.Direct...
AllowFileRestore                   Property   System.Boolean AllowFileRestor...
BackupInProgress                   Property   System.Nullable`1[[System.Bool...
CopyEdbFilePath                    Property   Microsoft.Exchange.Data.EdbFil...
DatabaseCreated                    Property   System.Boolean DatabaseCreated...
DeletedItemRetention               Property   Microsoft.Exchange.Data.Enhanc...
Description                        Property   System.String Description {get;}
DistinguishedName                  Property   System.String DistinguishedNam...
EdbFilePath                        Property   Microsoft.Exchange.Data.EdbFil...
EventHistoryRetentionPeriod        Property   Microsoft.Exchange.Data.Enhanc...
ExchangeLegacyDN                   Property   System.String ExchangeLegacyDN...
ExchangeVersion                    Property   Microsoft.Exchange.Data.Exchan...
Guid                               Property   System.Guid Guid {get;}
HasLocalCopy                       Property   System.Boolean HasLocalCopy {g...
Identity                           Property   Microsoft.Exchange.Data.Object...
IndexEnabled                       Property   System.Boolean IndexEnabled {g...
IssueWarningQuota                  Property   Microsoft.Exchange.Data.Unlimi...
IsValid                            Property   System.Boolean IsValid {get;}
JournalRecipient                   Property   Microsoft.Exchange.Data.Direct...
LastCopyBackup                     Property   System.Nullable`1[[System.Date...
LastDifferentialBackup             Property   System.Nullable`1[[System.Date...
LastFullBackup                     Property   System.Nullable`1[[System.Date...
LastIncrementalBackup              Property   System.Nullable`1[[System.Date...
MailboxRetention                   Property   Microsoft.Exchange.Data.Enhanc...
MaintenanceSchedule                Property   Microsoft.Exchange.Data.Schedu...
MountAtStartup                     Property   System.Boolean MountAtStartup ...
Mounted                            Property   System.Nullable`1[[System.Bool...
Name                               Property   System.String Name {get;set;}
ObjectCategory                     Property   Microsoft.Exchange.Data.Direct...
ObjectClass                        Property   Microsoft.Exchange.Data.MultiV...
OfflineAddressBook                 Property   Microsoft.Exchange.Data.Direct...
Organization                       Property   Microsoft.Exchange.Data.Direct...
OriginalDatabase                   Property   Microsoft.Exchange.Data.Direct...
OriginatingServer                  Property   System.String OriginatingServe...
ProhibitSendQuota                  Property   Microsoft.Exchange.Data.Unlimi...
ProhibitSendReceiveQuota           Property   Microsoft.Exchange.Data.Unlimi...
PublicFolderDatabase               Property   Microsoft.Exchange.Data.Direct...
QuotaNotificationSchedule          Property   Microsoft.Exchange.Data.Schedu...
Recovery                           Property   System.Boolean Recovery {get;}
RetainDeletedItemsUntilBackup      Property   System.Boolean RetainDeletedIt...
Server                             Property   Microsoft.Exchange.Data.Direct...
ServerName                         Property   System.String ServerName {get;}
SnapshotLastCopyBackup             Property   System.Nullable`1[[System.Bool...
SnapshotLastDifferentialBackup     Property   System.Nullable`1[[System.Bool...
SnapshotLastFullBackup             Property   System.Nullable`1[[System.Bool...
SnapshotLastIncrementalBackup      Property   System.Nullable`1[[System.Bool...
StorageGroup                       Property   Microsoft.Exchange.Data.Direct...
StorageGroupName                   Property   System.String StorageGroupName...
WhenChanged                        Property   System.Nullable`1[[System.Date...
WhenCreated                        Property   System.Nullable`1[[System.Date...

т.е. все аттрибуты, которые можно опрашивать, и методы.

А нас, например, могут интересовать такие параметры базы данных как Name, Server, LastFullBackup, или SnapshotLastFullBackup, смотря что мы юзаем для архивации баз, Mounted, ну или на ваш выбор любые другие аттрибуты, в зависимости от ситуации. Вот так и спросим:

Get-MailboxDatabase | list -Property Name,StorageGroup,Mounted,BackupInProgress,
LastFullBackup

и что же нам отвечает Exchange?!

Name             : Mailbox Database
StorageGroup     : Exch-MB1First Storage Group
Mounted          :
BackupInProgress :
LastFullBackup   :

То есть как это “Mounted:______“? Замонтирована база или нет? Почему это нет отметки о последнем бэкапе? Ерунда какая-то.. На запрос отдельно только параметра -mounted вообще дают ошибку и шлют лесом…
А все дело в том что Exchange Management Shell – объектно-ориентированная среда, и местами работает напрямую с системыми идентификаторами, которые не опрашиваются коммандлетами стандартной конструкции. Т.е., проще говоря, аттрибут есть, в EMShell показан, но используется самим Exchange. А для администратора есть отдельный вывод: –Status. И такие параметры как BackupInProgress, OnlineMaintenanceInProgress или тотже Mounted опрашиваются именно через него. Так что если мы теперь запросим:

Get-MailboxDatabase -Status | list -Property Name,StorageGroup,Mounted,
BackupInProgress,LastFullBackup

то нам совершенно адекватно выдадут:

Name             : Mailbox Database
StorageGroup     : Exch-MB1First Storage Group
Mounted          : True
BackupInProgress : False
LastFullBackup   : 18.10.2008 01:20:27

что и требовалось доказать, то есть выяснить.
PS: Вы будете смеяться, но в Help’е так и написано 😀 , но в него все так же редко смотрят, как и мы когда-то, особенно после того как запоминаются несколько десятков рабочих коммандлетов, – просто перестаешь бегать в справку по каждому поводу. В чем я в очередной раз убедился, на примере “молодого” поколения Exchange-админов, на недавнем курсе. Спасибо что напомнили такой забавный момент, я уж было и забыл как сам учился по-началу. Успехов вам, на поприще Exchange Management Shell 🙂

5 thoughts on “Exchange Management Shell, на заметку”

  1. А list это стандартный псевдоним EMS для Format-List? Тогда можно вместо Get-Member в данном случае использовать еще и | list * для исследования значений.

    Кстати я думаю фишка тут в том что по умолчанию все аттрибуты просто не запрашиваются из за производительности, как например в Get-QAD* командлетах. Чтобы запросить атрибуты не входящие в стандартный набор там надо использовать ключи -IncludedProperties или -IncludeAllProperties.

    1. @Vasily Gusev,
      Да, верно, только | Get-Member возвращает список т.н. Generic атрибутов и методов любого произвольного объекта, а | List * – перечень заполненных аттрибутов со значениями, для выбранного объекта, так что это не совсем одно и тоже.

    1. @ExcErr, @Vasily Gusev,
      Вы оба правы, Format-list, FL и List, все три являются полноценными операторами EMShell.

Leave a Reply

Your email address will not be published.