• Exchange Server 2007 – Просмотр статистики БД почтовых ящиков

    Для получения статистики об использовании почтовых ящиков пользователями организации в Exchange Server 2007 можно воспользоваться Exchange Management Shell и командлетами Get-MailboxDatabase и Get-MailboxStatistics.

    Для того чтобы получить сводную информацию о количестве почтовых ящиков в каждой базе данных и общему размеру каждой базы данных на определенном сервере в Exchange Management Shell выполним скрипт:

    $MailBoxServer = "MyMailBoxServer"

    Get-MailboxDatabase | Where-Object {$_.ServerName -eq $MailBoxServer} | Select @{Label="SG Name";Expression={$_.StorageGroupName}}, @{Label="DB Name";Expression={$_.Name}}, @{Label="Mailboxes";Expression={(Get-Mailbox -Database $_.Identity | Measure-Object).Count}} , @{Label="DB Size";Expression={"{0:N2}" -f ((get-mailboxstatistics -database $_.Identity | Measure-Object -Property TotalItemSize,TotalDeletedItemSize -Sum | Select-Object Sum | Measure-Object -Property Sum -Sum).Sum.ToString() /1024KB)}} | Sort -Property "DB Name" | Format-Table –AutoSize

    Для того чтобы получить информацию об использовании пространства почтовых ящиков в определенной базе данных (в мегабайтах) выполним скрипт:

    $FullDBIdentity = "MyMailBoxServerMyStorageGroupMyDataBase"

    Get-MailboxDatabase -Identity $FullDBIdentity | Get-MailboxStatistics | Sort -Property TotalItemSize | Select DisplayName,@{label="TotalItemSize(MB)";expression={$_.TotalItemSize.Value.ToMB()}},ItemCount,StorageLimitStatus | Format-Table -AutoSize

     

    Если же нас интересует информация только о почтовых ящиках, у которых превышен лимит хранения почты, выполним скрипт:

    $FullDBIdentity = "MyMailBoxServerMyStorageGroupMyDataBase"

    Get-MailboxDatabase -Identity $FullDBIdentity | Get-MailboxStatistics | Where-Object {$_.StorageLimitStatus -ne "BelowLimit"} | Sort -Property TotalItemSize | Select DisplayName,@{label="TotalItemSize(MB)";expression={$_.TotalItemSize.Value.ToMB()}},ItemCount,StorageLimitStatus | Format-Table –AutoSize

     

    Дополнительные источники информации:

    Exchange Server TechCenter - Get-MailboxDatabase: Exchange 2007
    Neil Hobson - Getting Mailbox Statistics in Exchange 2007
    Exchange Server Share Blog - Exchange 2007: Database Statistics in Powershell

    PowerShellCommunity Forums - Exchange Mailbox Database size

  • SCOM 2007 R2 – Пакетный перевод агентов в Maintenance Mode

    imageВ окружении с большим количеством агентов мониторинга SCOM 2007 R2 массовый перевод этих агентов  в режим обслуживания (Maintenance Mode) через UI консоль может стать весьма хлопотным занятием. На помощь в таком случае как всегда приходит Operations Manager Shell.

    Например, для того чтобы перевести в Maintenance Mode все сервера в имени которых встречается “SQL”, с текущего момента сроком на 2 часа в Operations Manager Shell можно выполнить следующий нехитрый скрипт:

    $Time1 = [DateTime]::Now

    $Time2 = $Time1.AddMinutes(120)

    $Agents  = Get-Agent | Where {$_.Name –match "SQL"}

    $Agents | foreach {New-MaintenanceWindow -StartTime $Time1 -EndTime $Time2 -Reason "PlannedOther" -Comment "Maintenance Mode Window" -MonitoringObject $_.HostComputer}

    Здесь вместо функции AddMinutes() можно также использовать AddHours() и AddDays()

    Или другой пример, когда необходимо указать конкретный диапазон дат:

    [DateTime] $Time1 = "11/23/2010"

    $Time1 = $Time1.ToUniversalTime()

    [DateTime] $Time2 = "11/28/2010"

    $Time2 = $Time2.ToUniversalTime()

    $Agents  = Get-Agent | Where {$_.Name –match "SQL"}

    $Agents | foreach {New-MaintenanceWindow -StartTime $Time1 -EndTime $Time2 -Reason "PlannedHardwareMaintenance" -Comment "Hardware Maintenance" -MonitoringObject $_.HostComputer}

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

    %SYSTEMROOT%system32WindowsPowerShellv1.0powershell.exe C:MaintenanceModeStartMaintenanceModeWindow.ps1

    Так же для того чтобы скрипт успешно отработал при таком вызове из планировщика задач, в начало скрипта следует добавить строки инициализации командлетов Operations Manager Shell и вызов подключения к корневому серверу управления SCOM (RMS):

    $RMSServer = 'RMSServerName'

    Add-PSSnapin "Microsoft.EnterpriseManagement.OperationsManager.Client";

    Set-Location "OperationsManagerMonitoring::";

    New-ManagementGroupConnection -ConnectionString:$RMSServer;

    Set-Location $RMSServer;

    Дополнительные источники информации:

    System Center TechCenter - How to Put a Monitored Object into Maintenance Mode in Operations Manager 2007

    System Center TechCenter- Operations Manager 2007 R2 Cmdlets - New-MaintenanceWindow

    Collection of Maintenance Mode Scripts, Utilities and MPs for Opsmgr and Essentials 2007 (Updated for SCOM 2007 R2)

    System Center Operations Manager Forums > Extensibility > Setting all entities to maintenance based on a particular class

  • SCOM 2007 R2 – Изменение статуса ManuallyInstalled для агентов

    В некоторых случаях может возникнуть ситуация, когда по каким-то причинам произведена ручная установка агентов SCOM на ряд компьютеров. Для таких агентов в UI консоли недоступны опции смены основного сервера управления (Change Primary Management Server), восстановления (Repair) и удаления (Uninstall). Помимо этого после применения новых кумулятивных обновлений (CU) такие агенты не будут переходить в режим принудительного обновления, что опять же потребует их обновления «в рукопашную». Получить список таких агентов можно как в UI консоли, так и в  Operations Manager Shell:

     

    Get-Agent | where {$_.ManuallyInstalled -match ‘true’} | ft name,ManuallyInstalled

     

    Для повышения централизованной управляемости нам потребуется изменить статус ручной установки для таких агентов. Через UI консоль это сделать невозможно by design. Через Operations Manager Shell у нас в данном случае также не получится изменить данное свойство, так как оно установлено как ReadOnly. Для решения данной задачи можно воспользоваться советом из блога Кевина Холмана: Kevin Holman's OpsMgr Blog - How to get your agents back to "Remotely Manageable" in OpsMgr 2007 R2

     

    Для того чтобы вывести список агентов установленных вручную, подключимся к базе данных «OperationsManager» и выполним запрос:

     

    SELECT bme.DisplayName FROM MT_HealthService mths

    INNER JOIN BaseManagedEntity bme ON bme.BaseManagedEntityId = mths.BaseManagedEntityId

    WHERE IsManuallyInstalled = 1

     

    Для того чтобы изменить статус всех вручную установленных агентов, выполним запрос:

     

    UPDATE MT_HealthService

    SET IsManuallyInstalled=0

    WHERE IsManuallyInstalled=1

     

    Если же мы не хотим менять статус для всех агентов, а лишь для одного какого то конкретного агента, выполним запрос:

     

    UPDATE MT_HealthService

    SET IsManuallyInstalled=0

    WHERE IsManuallyInstalled=1

    AND BaseManagedEntityId IN

    (SELECT BaseManagedEntityID FROM BaseManagedEntity

    WHERE BaseManagedTypeId = 'AB4C891F-3359-3FB6-0704-075FBFE36710'

    AND DisplayName = 'agentname.domain.com')

     

    После этого, в UI консоли, для измененных агентов станут доступными вышеописанные опции управления.

    Следует так же понимать, что если агенты устанавливались вручную из-за их ограничений с точки зрения сетевого доступа, то такие манипуляции, с точки зрения управляемости, нам всё равно не принесут никакой пользы.

  • SCOM 2007 R2 – Включение Agent Proxy на группе агентов

    imageПо мере начала использования новых пакетов управления (MP) в SCOM, может возникнуть необходимость включения  механизма «Agent Proxy» на группе агентов, например, когда мы используем MP для мониторинга AD, нам необходимо включить проксирование для всех агентов, имеющих роль контроллеров домена.

    При большом количестве агентов, сделать это в UI консоли -  не самый лучший вариант, так как у нас есть Operations Manager Shell.

    Например, для того чтобы получить информацию о том в каком состоянии находится значение атрибута «ProxyingEnabled» на агентах, содержащих в имени «dc» в консоли Operations Manager Shell  выполним:

    Get-Agent | where {$_.computerName -match 'dc'} | ft name,proxyingEnabled

    Для того чтобы для всего выведенного списка включить проксирование выполним PS скрипт:

    $Agents = Get-Agent | where {$_.computerName -match 'dc'}

    $Agents | foreach {$_.ProxyingEnabled = $true}

    $Agents | foreach {$_.ApplyChanges()}

  • SCOM 2007 R2 - Ручная установка Operations Manager Shell

    В некоторых ситуациях может возникнуть необходимость использования PS консоли  Operations Manager Shell на системах, где не произведена установка Operations Console (UI консоль). Рассмотрим вариант быстрого ручного прикручивания командной консоли SCOM.

    Первым делом, с системы, где произведена соответствующая установка Operations Manager Shell с полного дистрибутива скопируем 6 файлов из каталога установки. Например, в качестве исходной системы мы используем один из серверов управления SCOM с установленной командной консолью (в нашем примере это сервер KOM-AD01-MON01). Если на исходной системе каталог установки – “C:Program FilesSystem Center Operations Manager 2007”, то создадим такой же каталог на системе, в которую хотим прикрутить командную консоль. Это нужно для того, чтобы в дальнейшем не вносить сложных корректировок в системный реестр.

    MKDIR “C:Program FilesSystem Center Operations Manager 2007”

    Скопируем необходимые файлы с исходной системы в созданный каталог. Нам понадобиться всего 6 файлов:

    • Из папки C:Program FilesSystem Center Operations Manager 2007:

      Microsoft.EnterpriseManagement.OperationsManager.ClientShell.dll Microsoft.EnterpriseManagement.OperationsManager.ClientShell.dll-help.xml Microsoft.EnterpriseManagement.OperationsManager.ClientShell.Format.ps1xml Microsoft.EnterpriseManagement.OperationsManager.ClientShell.Types.ps1xml

    • Из папки C:Program FilesSystem Center Operations Manager 2007SDK Binaries:

      Microsoft.EnterpriseManagement.OperationsManager.dll
      Microsoft.EnterpriseManagement.OperationsManager.Common.dll

    Быстро это сделать можно, например, при помощи скрипта PowerShell J (только замените имя исходной системы):

    # Каталог куда копируем

    $LocalDir = 'C:Program FilesSystem Center Operations Manager 2007'

    # Каталог откуда копируем. Имените имя исходного компьютера

    $RemoteDir = '\kom-ad01-mon01C$Program FilesSystem Center Operations Manager 2007'

    New-Item -Path $LocalDir -ItemType Directory

    Copy-Item $RemoteDir+'Microsoft.EnterpriseManagement.OperationsManager.ClientShell.dll' -Destination $LocalDir -Force

    Copy-Item $RemoteDir+'Microsoft.EnterpriseManagement.OperationsManager.ClientShell.dll-help.xml' -Destination $LocalDir -Force

    Copy-Item $RemoteDir+'Microsoft.EnterpriseManagement.OperationsManager.ClientShell.Format.ps1xml' -Destination $LocalDir -Force

    Copy-Item $RemoteDir+'Microsoft.EnterpriseManagement.OperationsManager.ClientShell.Types.ps1xml' -Destination $LocalDir -Force

    Copy-Item $RemoteDir+'SDK BinariesMicrosoft.EnterpriseManagement.OperationsManager.*' -Destination $LocalDir –Force

    Далее экспортируем параметры Powershell Snap-in с исходной системы на целевую, например, так:

    REG EXPORT HKLMSOFTWAREMicrosoftPowerShell1PowerShellSnapInsMicrosoft.EnterpriseManagement.OperationsManager.Client C:TempOpsMgrCmdShellSnapIn.reg


    Выгруженный reg файл должен иметь примерно следующее содержание:

    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINESOFTWAREMicrosoftPowerShell1PowerShellSnapInsMicrosoft.EnterpriseManagement.OperationsManager.Client]
    "ApplicationBase"="C:\Program Files\System Center Operations Manager 2007\"
    "AssemblyName"="Microsoft.EnterpriseManagement.OperationsManager.ClientShell, Version=6.0.4900.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
    "ModuleName"="C:\Program Files\System Center Operations Manager 2007\Microsoft.EnterpriseManagement.OperationsManager.ClientShell.dll"
    "PowerShellVersion"="1.0"
    "Vendor"="Microsoft Corporation"
    "Version"="6.0.4900.0"
    "Description"="Microsoft Operations Manager Shell Snapin"
    "Types"="C:\Program Files\System Center Operations Manager 2007\Microsoft.EnterpriseManagement.OperationsManager.ClientShell.Types.ps1xml"
    "Formats"="C:\Program Files\System Center Operations Manager 2007\Microsoft.EnterpriseManagement.OperationsManager.ClientShell.Format.ps1xml"

    Загружаем полученный reg файл в реестр на целевой системе:

    REG IMPORT '\kom-ad01-mon01C$TempOpsMgrCmdShellSnapIn.reg'


    Осталось сделать скрипт, который будет подгружать в PowerShell консоль необходимый Snap-in:

    # В переменной $rootMS необходимо указать RMS сервер

    $rootMS = 'SCOM-RMS-SERVER'

    $checksnappin = Get-PSSnapin | where {$_.Name -eq "Microsoft.EnterpriseManagement.OperationsManager.Client"}

    if ($checksnappin -eq $null)

    {

    add-pssnapin "Microsoft.EnterpriseManagement.OperationsManager.Client" -ErrorVariable errSnapin ;

    }

    Set-Location "OperationsManagerMonitoring::" -ErrorVariable errSnapin ;

    new-managementGroupConnection -ConnectionString:$rootMS -ErrorVariable errSnapin ;

    set-location $rootMS -ErrorVariable errSnapin ;


    Назовём этот скрипт, например, Start.ps1… В итоге мы получим всего 7 файлов которые обеспечат нам работоспособность Operations Manager Shell без процедуры установки из полного инсталлятора размером более 1 Gb.

    image

    Найдено в блоге Derek Ops Manager - Operation Manager Command Shell on any system (12 July 2007) и проверено применительно версии SCOM 2007 R2 CU#2. Работает J

  • PowerShell: Управление членством групп AD

    community-logo

    Ситуация:
    Есть некоторое количество доменных групп безопасности с большим количеством пользователей в каждой их них.
    Возникает необходимость копирования членства в существующих группах в другие вновь созданные группы.

    Решение:

    Используем Quest Management Shell (PowerShell командлеты ActiveRoles Management Shell for Active Directory от Quest Software) и командой фактически в одну строку выполняем поставленную задачу:

    Get-QADGroupMember Group1  | Add-QADGroupMember Group2

    где Group1 – имя группы безопасности из которой получаем пользователей, Group2 – имя группы безопасности в которую копируем полученных пользователей.
    После того как копирование произведено, можно выполнить сравнение состава групп таким образом:

    Compare-Object ( Get-QADGroupMember Group1 ) ( Get-QADGroupMember Group2 ) -IncludeEqual

  • Ускорение запуска PowerShell v1

    Из доклада Дмитрия Сотникова на TechDays.ru узнал несколько полезных вещей о PowerShell, в частности давно мучил вопрос о том как ускорить запуск оболочки версии 1. Как оказалось исправить проблему можно простейшим скриптом полученным на блоге команды разработчиков PowerShell: Speeding Up PowerShell Startup - Updating Update-Gac.ps1

    Вот собственно содержимое скрипта:

    Set-Alias ngen (Join-Path ([System.Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()) ngen.exe)
    [AppDomain]::CurrentDomain.GetAssemblies() |
    sort {Split-path $_.location -leaf} |
    %{
    $Name = (Split-Path $_.location -leaf)
    if ([System.Runtime.InteropServices.RuntimeEnvironment]::FromGlobalAccessCache($_))
    {
    Write-Host "Already GACed: $Name"
    }else
    {
    Write-Host -ForegroundColor Yellow "NGENing      : $Name"
    ngen $_.location | %{"`t$_"}
    }
    }

    После отработки скрипта на моей машине PowerShell стал запускаться действительно быстро.