• Exchange 2010 - Использование Shared Mailbox в Outlook 2010

    Shared Mailbox in Outlook 2010Технология общих почтовых ящиков (Shared mailboxes) в Exchange далеко не нова и, насколько я понимаю, на сегодняшний день считается даже морально устаревшей. Ведь не зря в Exchange 2010 в пользовательский интерфейс консоли управления до сих пор не включена возможность даже создания такого рода ящиков и сделать это можно только с помощью PowerShell. Не смотря на то, что в статье TechNet Library - Understanding Mailbox - Understanding Recipients сказано, что вместо общих ящиков рекомендуется использовать ресурсные ящики (Resource mailboxes) или механизмы совместной работы на SharePoint Server, иногда могут встретиться ситуации, в которых использование общих почтовых ящиков является более удобным вариантом.

    Рассмотрим основные моменты управления общими почтовыми ящиками и ряд проблем, с которыми можно столкнуться при их использовании на практике. Сразу отмечу, что речь пойдёт об использовании общих почтовых ящиков на связке Exchange 2010 SP2 и Outlook 2010 SP1. Читать далее...

  • TMG 2010 - Резервное копирование Array Configuration с PowerShell

    TMG 2010 - Backup Array Configuration with PowerShellОзадачившись вопросом автоматизации регулярного выполнения резервного копирования настроек Forefront TMG 2010 нашёл ряд интересных материалов, в том числе статью, описывающую процедуру настройки взаимодействия DPM сервера и DPM агента, установленного на сервере Threat Management Gateway – "How DPM 2010 Could Protect Forefront TMG 2010 with a Minimum Opening of Feeds" (в блоге The Microsoft MVP Award Program Blog). Учитывая то, что в моём случае серверы являются виртуальными и периодически подвергаются резервному копированию в виде VM на сервер DPM, нет особого смысла в установке агента DPM непосредственно внутрь этих виртуальных машин. Поэтому я решил ограничиться созданием на регулярной основе резервных копий конфигурации массива TMG. Из консоли Threat Management Gateway  Management эта процедура вызывается из меню действий или контекстного меню на конкретном массиве – Export (Back Up).

    Читать далее...

  • PowerShell - Удаляем устаревшие файлы

    imageЕсли внутри корпоративной сети используются всевозможные сетевые ресурсы доступные множеству пользователей и выполняющие функции файлообменников, например сетевые папки или каталоги FTP серверов, то иногда может возникнуть необходимость в обслуживании таких ресурсов, например периодического удаления файлов и подкаталогов имеющих определённый срок давности. Хочу поделиться маленьким примером когда-то найденного (уже не вспомню где) PowerShell скрипта, который решает у меня такую задачу

    Читать далее...

  • PowerShell - Переименовываем удалённый компьютер

    Код для переименования удалённого компьютера с последующей перезагрузкой

    $Credential = Get-Credential

    $OldName = "WS001"

    $NewName = "WS002"

    $Comp = Get-WmiObject Win32_ComputerSystem -ComputerName $OldName -Authentication 6

    $OS   = Get-WmiObject Win32_OperatingSystem -ComputerName $OldName

    $Comp.Rename($NewName,$Credential.GetNetworkCredential().Password,$Credential.Username)

    $OS.Reboot()

  • SharePoint 2010 - Замена значений гиперссылок хранимых в колонке списка

    imageЗадача: На сервере SharePoint 2010 создан список (List), который используется как хранилище ссылок на файлы, доступные для скачивания с этого веб-сервера. Одной из колонок такого списка является гиперссылка. Возникает ситуация когда меняется URL этого веб-сервера и все элементы списка в этой колонке необходимо изменить.

    Решение: На веб-сервере выполним Powershell скрипт, который заменит определённое старое значение в колонке с гиперссылками на новое

     

    # $MyListName - Имя списка в сайте

    # $MyColumnName - Имя колонки с значением типа URL

    # $URLOld - Искомое значение существующего URL которое надо изменить

    # $URLNew - Новое значение URL на которое производим замену

    #

    $MySiteUrl = "http://new-server.holding.com"

    $MyListName = "Программное обеспечение"

    $MyColumnName = "URL"

    $URLOld = "http://old-server.holding.com"

    $URLNew = "http://new-server.holding.com"

    #

    $snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}

    if ($snapin -eq $null) {

      Write-Host "Загрузка оснастки SharePoint Powershell"

      Add-PSSnapin "Microsoft.SharePoint.Powershell"

    }

    #                  

    $spSite = new-object Microsoft.SharePoint.SPSite($MySiteUrl)

    $spWeb = $spSite.OpenWeb()

    $spList = $spWeb.Lists[$MyListName]

    $spitems = $splist.items

    $i = 0

    foreach($item in $spitems){

      [Microsoft.SharePoint.SPListItem]$spListItem = $item  

      if ($spListItem[$MyColumnName] -like "*$URLOld*")

      {   

        $i = $i + 1   

        $fldUrl= new-object Microsoft.SharePoint.SPFieldUrlValue($Item[$MyColumnName])       

        $fldUrl.URL = $fldUrl.URL.Replace($URLOld, $URLNew)  

        $item[$MyColumnName] = $fldUrl

        $item.update()   

        Write-Host $item["Title"] $fldUrl

      } 

    }

    Write-Host "Изменено" $i "записей" -foregroundcolor "green"

  • SCVMM 2008 R2– Проверяем версию компонент интеграции

    imageВ консоли SCVMM 2008 R2 на закладке Hosts можно видеть текущую версию компонент виртуализации если включить отображение колонки Virtualization Software Version, чего не скажешь об уровне виртуальных машин, где визуально с помощью этой консоли определить то какая версия компонент интеграции установлена внутри виртуальных машин не представляется возможным. Для того чтобы попытаться получить данную информацию в сводном виде воспользуемся советом от Peter Noorderijk из заметки Hyper-v.nu - How to check the version of the Integration Components. Скрипт взят за основу, и немного расширен, а именно:

    • Добавлена загрузка PSSnapin VMM (на тот случай если скрипт выполняется не на сервере VMM)
    • Информация о хостах виртуализации берётся не из файла а из данных сервера VMM, к которому мы предварительно подключаемся.
    • Виртуальные машины с версией компонент интеграции не соответствующей номеру, указанному в переменных, - выделяются красным цветом для облегчения визуального анализа

    # Блок переменных

    # $VMMSrv - Имя сервера SCVMM на котором будут выбраны все хосты виртуализации и их VM для анализа

    # $ICCurrentVer - Текущая версия компонент интеграции которая должна быть установлена на VM

    #

    $VMMSrv = "KOM-SCVMM.holding.com"

    $ICCurrentVer = "6.1.7601.17514"

    #

    # Подгружаем оснастку PS VMM для работы с объектами SCVMM

    #

    $VMMMod = "Microsoft.SystemCenter.VirtualMachineManager"

    If ((Get-PSSnapin -Name $VMMMod -ErrorAction SilentlyContinue) -eq $null)

    {

        Add-PSSnapin $VMMMod

    }

    #

    # Функция получения и вывода сведений о компонентах интеграции на VM определённого хоста

    #

    Function Get-IntegrationServicesVersion ($HVhost = $(Throw "HVHost required"))

     {

     $kvps = Get-WmiObject -Namespace rootvirtualization `

     -ComputerName $HVHost `

     -Query "Select GuestIntrinsicExchangeItems From Msvm_KvpExchangeComponent"

     Foreach ($kvp in $kvps)

     {

     $vmkvp = $Kvp.GuestIntrinsicExchangeItems

     $VMICvArray = $vmkvp | Select-Object `

     @{Label="VMName";Expression={([xml]$vmkvp[0]).instance.property[1].value}},`

     @{Label="ICVersion";Expression={([xml]$vmkvp[14]).instance.property[1].value}} -first 1

     Foreach ($VMICv in $VMICvArray)

          {

                If ($ICCurrentVer -ne $VMICv.ICVersion) {

                Write-Host "IC ver.: " $VMICv.ICVersion " on " $VMICv.VMName -ForegroundColor Red

                } Else {

                Write-Host "IC ver.: " $VMICv.ICVersion " on " $VMICv.VMName

                }

          }

     }

     }

    #

    # Блок основного вывода

    #

    $VMHosts = Get-VMMServer -ComputerName $VMMSrv | Get-VMHost | Sort -Property "Name"

    Foreach ($HVhost in $VMHosts) {

    Write-Host "`nHyper-V Host: " $HVhost "`n" -ForegroundColor Green

    Get-IntegrationServicesVersion $HVhost

    }

      Результат работы скрипта будет выглядеть примерно так:

      image

      Примечание:

      Скрипт не выводит информацию о виртуальных машинах, которые находятся в выключенном состоянии.

    • SCOM 2007 R2 - Назначение Primary и Failover серверов на агентах

      imageПо мере расширения инфраструктуры SCOM и увеличения серверов управления (Management Server) может возникнуть необходимость в форсированном назначении значений Primary Management Server и Failover Management Server для агентов, чтобы избежать ситуации когда при недоступном ближайшем первичном сервере управления агенты начнут обращаться на сервера управления на удалённых площадках нагружая при этом WAN-каналы там где это не желательно. Такое поведение агентов в конфигурации по умолчанию может быть обусловлено настройками, которые можно видеть в конфигурационном файле клиента в кэше коннектора соответствующей ему группы управления.

      Читать далее...

    • Forefront TMG 2010 – Разрешение нестандартных туннелируемых портов

      Возникла необходимость использовать через TMG 2010 подключение к HTTPS узлу в интернете, использующему нестандартный порт (не 443). В настройке по умолчанию вэб-прокси TMG разрешает доступ только по порту 443. Для того чтобы изменить перечень разрешенных портов воспользуемся подключением к COM-объекту TMG с помощью PowerShell.

      Для того чтобы получить текущий список открытых туннелируемых портов, непосредственно на TMG сервере выполним PS скрипт:

      $ServerName = "MY-PROXY-SERVER"

      $FPCRoot = New-Object -comObject "FPC.Root"

      $TMGObj = $FPCRoot.Arrays.Connect($ServerName)

      $TMGObj.ArrayPolicy.WebProxy.TunnelPortRanges

      В первой строчке в переменной $ServerName укажите имя своего сервера TMG или имя массива TMG, если сервер является членом массива.


      Для того чтобы расширить список открытых туннелируемых портов, например 444 портом, выполним PS скрипт:

      $ServerName = "MY-PROXY-SERVER"

      $FPCRoot = New-Object -comObject "FPC.Root"

      $TMGObj = $FPCRoot.Arrays.Connect($ServerName)

      $TMGObj.ArrayPolicy.WebProxy.TunnelPortRanges.AddRange("SSL 444", 444, 444)

      $TMGObj.ApplyChanges()


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

      $ServerName = "MY-PROXY-SERVER"

      $FPCRoot = New-Object -comObject "FPC.Root"

      $TMGObj = $FPCRoot.Arrays.Connect($ServerName)

      $TMGObj.ArrayPolicy.WebProxy.TunnelPortRanges.Remove("SSL 444")

      $TMGObj.ApplyChanges()

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

    • PowerShell - Проверяем флаг защиты доменных OU от случайного удаления

      imageВ оснастке Active Directory Users and Computers (dsa.msc) открыв свойства любого OU на закладке Object можно наблюдать флаг “Protect object from accidental deletion” (Защитить объект от случайного удаления). В библиотеке “Best Practices Analyzer for Active Directory Domain Services” есть хорошая заметка на тему управления этим флагом через PowerShell - AD DS: All OUs in this domain should be protected from accidental deletion

      Для того чтобы получить перечень всех OU на которых не установлен флаг защиты выполним скриптоблок:

      # Переменная $LDAPPathOU – ADSI путь к контейнеру внутри которого будем производить поиск OU (в формате distinguishedName)

      #

      $LDAPPathOU = "OU=ImportantOUs,DC=holding,DC=com"

      Import-Module ActiveDirectory

      Get-ADOrganizationalUnit -filter * -SearchScope Subtree -SearchBase $LDAPPathOU -Properties ProtectedFromAccidentalDeletion | Where {$_.ProtectedFromAccidentalDeletion -match "False"} | Select name, DistinguishedName | Format-Table –AutoSize


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

      $LDAPPathOU = "OU=ImportantOUs,DC=holding,DC=com"

      Import-Module ActiveDirectory

      Get-ADOrganizationalUnit -filter * -SearchScope Subtree -SearchBase $LDAPPathOU -Properties ProtectedFromAccidentalDeletion | Where {$_.ProtectedFromAccidentalDeletion -match "False"} | Set-ADOrganizationalUnit -ProtectedFromAccidentalDeletion $true

      При желании выполнение такого скрипта можно включить в планировщик задач чтобы в последующем быть уверенным в том, что на всех важных OU этот флаг будет включён.

    • DPM 2010 - Резервное копирование БД Exchange Server 2010 в группе DAG

      imageРассмотрим использование DPM 2010 в качестве системы резервного копирования баз данных роли Mailbox Exchange Server 2010 на конкретном примере. В качестве исходных данных будем считать, что мы имеем два сервера Exchange Server 2010 с ролью Mailbox объединённых в группу Database Availability Group (DAG), на которых расположено шесть баз данных почтовых ящиков. Параллельно поставим перед собой задачу распределить нагрузку по двум серверам Mailbox. Читать далее...