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


А list это стандартный псевдоним EMS для Format-List? Тогда можно вместо Get-Member в данном случае использовать еще и | list * для исследования значений.
Кстати я думаю фишка тут в том что по умолчанию все аттрибуты просто не запрашиваются из за производительности, как например в Get-QAD* командлетах. Чтобы запросить атрибуты не входящие в стандартный набор там надо использовать ключи -IncludedProperties или -IncludeAllProperties.
@Vasily Gusev,
Да, верно, только | Get-Member возвращает список т.н. Generic атрибутов и методов любого произвольного объекта, а | List * – перечень заполненных аттрибутов со значениями, для выбранного объекта, так что это не совсем одно и тоже.
Если не ошибаюсь, то стандартный псевдоним для Format-List – fl.
@ExcErr, @Vasily Gusev,
Вы оба правы, Format-list, FL и List, все три являются полноценными операторами EMShell.
А где об этом можно почитать подробнее?