Отчёт по событиям из календарей Outlook


Для управления рабочим временем (Time management) существует множество подходов и программных продуктов их поддерживающих.

Самое простое средство для планирования и управления рабочим временем это календари Outlook. Outlook обладает хорошими возможностями для управления рабочим временем (Time management) на базе календарей даже без всяких надстроек. Существует много статей и книг по этому вопросу.

Проблема в том, что календари ведутся автономно. А что если нужен ответ на простой вопрос: «Насколько много сотрудники неоправдано отвлекаются на совещания?». Неужели для этого придется закупать bи внедрять систему Time management и настраивать систему отчётов?

Посмотрим как можно собрать информацию из календарей пользователей, используя Exchange Server API.

Во-первых, нам нужна учётная запись, которая будет формировать отчёт. Этой учётной записи нужны права доступа ко всем календарям. Как их предоставить? Можно назначить права доступа командлетом или захватить права на почтовую базу (в стиле Exchange Server 2003). Самый правильный подход — использовать RBAC. Нам нужна имперсонализация:

New-ManagementRoleAssignment -Role ApplicationImpersonation -User <имя нашей учётки>

Разновидностей отчётов может быть бесконечное множество. Поэтому мы запустим PowerShell от имени учётой записи, для которой мы настроили имперсонализацию, и выгрузим все события из всех календарей со всеми свойствами в файл в CSV формате. Затем эту информацию можно загрузить в базу данных или Excel для анализа.

$StartDate = Get-Date 1/1/2020
$EndDate = Get-Date 1/31/2020

# Исправьте этот путь для вашей версии Exchange Server
# Это вообще не нужно для EWS
Add-Type -Path "C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.WebServices.Auth.dll"
$Service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013_SP1)

$result = Get-MailBox -ResultSize Unlimited | ForEach-Object {

  $SmtpAddress = $_.PrimarySmtpAddress.Address

  Write-Host "MailBox: $SmtpAddress"

  $Service.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $SmtpAddress);

  [void]$Service.AutodiscoverUrl($SmtpAddress)

  # Bind to the calendar folder of the mailbox
  $FolderId = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar,$SmtpAddress)
  $Calendar = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($Service,$FolderId)

  # Define the calendar view
  $CalendarView = New-Object Microsoft.Exchange.WebServices.Data.CalendarView($StartDate,$EndDate)
  $Calendarview.MaxItemsReturned = 1000 	# 1000 is the maximum number of items that can be returned in a CalendarView

  $AppointmentItems = @()
  $AppointmentItems = $Service.FindAppointments($Calendar.Id,$CalendarView)

  if ($AppointmentItems.TotalCount -eq 0)
  {
      #Write-Host "MailBox: $SmtpAddress : AppointmentItems is empty."
      #return;
  } 

  $properties = New-Object Microsoft.Exchange.WebServices.Data.PropertySet(
      [Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties,
      [Microsoft.Exchange.WebServices.Data.AppointmentSchema]::RequiredAttendees,
      [Microsoft.Exchange.WebServices.Data.AppointmentSchema]::OptionalAttendees);

  $res = $service.LoadPropertiesForItems($AppointmentItems, $properties)
  $service.LoadPropertiesForItems($AppointmentItems, $properties)

} | Select-Object -ExpandProperty Item -Property @{name="User"; expression={ $SmtpAddress }},@{name="Count"; expression={ CountMembers $_ }} |
    Select-Object -Property * -ExcludeProperty Body |
    Export-CSV -Path all_items.csv -NoTypeInformation

function CountMembers ($item) {
    $count = 0

    $item.Item.RequiredAttendees |
        ForEach-Object {
           $count += if ($_.MailboxType -eq "PublicGroup") { (Get-ADGroup -Identity $_.Name -Properties members).Members.Count } else { 1 }
        }

    $item.Item.OptionalAttendees |
        ForEach-Object {
           $count += if ($_.MailboxType -eq "PublicGroup") { (Get-ADGroup -Identity $_.Name -Properties members).Members.Count } else { 1 }
        }

    return $count
}

Как бонус скрипт подсчитывает число участников собраний.

Я не буду описывать, как создать какой-то конкретный отчёт в Excel на основе этой информации — это не благодарное дело. Используя фильтры Excel, вы можете найти организаторов собраний, выделить собрания по уникальному идентификтору, вычислить длительность собраний, построить сравнительные графики рабочего времени и много чего ещё.

Для полноты картины вы можете добавить информацию о пользователях из Active Directory (или другой системы). Тогда вы сможете делать анализ, например, по подразделениям.

Полезные ссылки:

  1. New-ManagementRoleAssignment
  2. Configure impersonation
  3. Auditing Exchange Rooms for Double Bookings
  4. Create appointments and meetings by using EWS in Exchange 2013

Узнать время жизни продукта


Хотите узнать, когда заканчивается поддержка продукта, в частности PowerShell, смотрите на сайте https://endoflife.date/powershell

Смена часового пояса в Windows Server 2019


В Windows Server 2019 RTM есть есть раздражающий баг: невозможно изменить часовой пояс через GUI остастки — ошибка «Permission denied». Это не работает как в новой оснастке Settings, так и в старой Control Panel.

В новых превью версиях баг исправлен.

Обсуждение https://social.technet.microsoft.com/Forums/en-US/5dd32886-56ec-433c-8168-78d8391dfa29/found-a-bug-already-unable-to-set-time-zone?forum=WinServerPreview

Обходные пути:

tzutil /l
tzutil /s "Select Your Timezone"
Get-TimeZone -ListAvailable
Set-TimeZone -Id "Ekaterinburg Standard Time"

Коротко о Delivery Optimization


Для Windows 10 компания Microsoft создала новый облачный сервис для оптимизации установки обновлений и соответствующую Windows службу Delivery Optimization.

С выходом Windows 10 Enterprise 2019 компании начали массовые миграции на Windows 10, и в корпоративной среде теперь нужно решить, как жить с Delivery Optimization.

Если корпоративные политики разрешают использовать облачные сервисы, то можно оставить настройки по умолчанию, тем более что это работает и с WSUS. Также можно подкрутить режим загрузки. В документации описано несколько доступных режимов https://docs.microsoft.com/en-us/windows/deployment/update/waas-delivery-optimization#download-mode.

Если корпоративные политики запрещают использование облачных сервисов, то включите с помощью политик режим Bypass. В этом случае у вас будет работать BranchCache и BITS. Скорее всего они у вас уже настроены. Есть нюанс: Delivery Optimization работает лучше с Distributed Cache mode, Hosted Cache mode не рекомендуется и тем более не работает с Configuration Manager. Подробности https://docs.microsoft.com/en-us/windows/deployment/update/waas-branchcache.

Почему стоит обратить внимание на открытые проекты


Открытые проекты, которых невообразимое множество на https://github.com, могут быть полезны не только тем, что мы можем получить бесплатное ПО.

  1. Приобретение персонального опыта

Выбрав интересный для вас проект, над которым работают высококлассные профессионалы, вы через некоторое время получите бесценный опыт, который вы не сможете получить нигде больше: ни в учебниках, ни на платных курсах, ни в блогах. Весь этот опыт распылен в дискуссиях (issue discussions), рецензиях на код (code reviews), в самом коде.

Общаясь с профессионалами, вы можете изучить новые технологии, языки, приобрести практические навыки – всё это увеличит вашу профессиональную ценность. Кроме того, работая над интересным проектом с интересными людьми, вы получите удовольствие, что не так уж и мало для счастья.

  1. Получение нужных возможностей в продукте

Когда мы сталкиваемся с какой-то проблемой, ошибкой или отсутствием возможностей в используемом ПО, мы обречены искать какой-то обходной путь или альтернативное ПО. Самое ужасное, когда мы не можем добиться помощи от платной техподдержки или получаем ответ: «Покупайте новую версию, когда она появится через сколько-то месяцев или лет».

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

Важный нюанс: в открытом проекте вам никто ничего не должен – всё развивается на инициативе таких же людей как вы – объедините свои усилия с ними и получите выгоды от совместной работы.

  1. Получение выгод для бизнеса

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

Если ваш жизненный энтузиазм ещё не угас, а интеллект не атрофировался, найти тебе себе проект (или проекты) по душе и развивайтесь вместе с ним.

Built-in OverUsed и остальное про лиценции Remote Desktop


Описано подробно в статье.

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

PowerShell Core 6.1.1


В PowerShell Core 6 были обнаружены проблемы безопасности. В Windows PowerShell тоже, и исправления уже доступны в текущих ежемесячных обновлениях.

Что касается PowerShell Core 6, то его рекомендуется обновить до версии 6.1.1.

Подробности:

https://github.com/PowerShell/PowerShell/issues/8254

https://github.com/PowerShell/PowerShell/issues/8251

О чём это говорит? Хочется думать, что PowerShell Core стал достаточно популярным :-) Хотя по факту одна проблема приехала из Microsoft.PowerShell.Archive, а вторая исторически из Windows PowerShell. Пока инцидентов с новым кодом, созданным в рамках проекта с открытыми кодами, не зафиксировано: предыдущие обновления безопасности происходили из .Net Core.