powershell (ru)

  • Добавление записей в атрибут userWorkstations пользователя в Active Directory

    Добавление имен компьютеров, на которые пользователям разрешен вход - достаточно постоянная задача, причем частенько появляется необходимость добавить компьютер сразу всем пользователям домена.

    Вот скрипт, который выполняет описанную задачу (причем скрипт не трогает пользователей, которым разрешен вход на все компьютеры):

  • Выгружаем пользователей AD в базу MS SQL

    Здравствуйте!

    Продолжаю публикации скриптов. Сегодняшний наш пациент был разработан в процессе создания биллинга звонков. У каждого юзера в Active Direcotry есть поле, в котором прописан его внутренний номер телефона. Этот же номер фигурирует в биллинге, но нам конечно хочется видеть не что-то вроде "1316", а "Иванов Владислав Александрович". 

    В сети полно примеров и скриптов, позволяющих достать пользователей из AD в csv-файл. По логике, мы можем потом взять этот csv и импортировать в MS SQL с помощью SSIS-скриптов. Однако это мне это не понравилось, т.к. на выходе у нас получается аж два скрипта, работающих на разных технологиях + один промежуточный файл. И это только для одного домена AD. А у меня их 14.

  • Запускаем Powershell-скрипты в планировщике задач

    Как и любые скрипты, необходимо иметь возможность запускать Powershell-сценарии не вручную, а по расписанию.

    Например, в заметках, указанных внизу статьи (по Lync Server), так и необходимо делать.

    Естественно, на помощь приходит планировщик задач Windows, однако как все-таки заставить запуститься файл *.ps1?

  • Сгенерировать случайный пароль на Powershell за 2 строки Обычно я генерирую пароли для пользователей, закрывая глаза и нажимая кнопки на клавиатуре. Сейчас уже это делать необязательно - генерировать можно скриптом на Powershell:

  • Управление NTFS-правами в Powershell Как упростить и сделать более наглядным взаимодействие с правами доступа на файлы и их наследованием? Воспользуйтесь популярным и полезным скриптом File System Security PowerShell Module. 
  • Экспорт массива (таблицы) из Powershell в csv При работе с массивами данных в Powershell бывает необходимо выгрузить данные в таблицу, чтобы потом открыть ее в Excel. Напрямую программировать выгрузку массива в файл Excel не рекомендуется, т.к. для этого необходимо хотя бы иметь установленный Excel на машине, где запускается скрипт. Кроме того, такой код будет работать достаточно медленно. Лучше всего выгружать массив в csv-файл.
  • Область поиска при работе в Powershell с Exchange 2010/2013

    Вы можете столкнуться со следующими ошибками при выполнении командлетов Get-MailBox, New-MoveRequest и других в Powershell в EMS (Exchange Management Shell):

    The requested search root domain is different from the scope root domain.

    или

    The requested search root domain.local/Users’ is not within the scope of this operation. Cannot perform searches outside the scope ‘child.domain.local’.

  • Удаление ящиков-"призраков" из базы данных Exchange 2010/2013

    В Exchange бывают такие случаи, когда проиходят ошибки при перемещении ящиков между базами данных. И тогда у вас может быть в базах, к примеру, два ящика, которые принадлежат одному и тому же пользователю, но естественно, к учетной записи Active Directory подключен только один из этих ящиков.

    Причем тот ящик, который не используется, не помечен ни как Disconnected, ни как SoftDeleted.

    Такие ящики в баще данных называются ghost-mailbox (ящиками-призраками).

     

  • Получить список делегированных почтовых ящиков, к которым имеют доступ другие пользователи в Exchange 2010\2013

    Иногда при аудитах Exchange нужно получить список пользователей, которые имеют доступ к другим почтовым ящикам. Или наоборот - получить список почтовых ящиков, к которым имеют доступ другие люди. В Exchange 2010/2013 есть специальный командлет Get-MailboxPermission который умеет опрашивать список ACL (Access Control List) почтовых ящиков.

    Можно расширить область применения этого командлета на все почтовые ящики в организации:

  • Статус установки обновлений для рабочих станций через WSUS на Powershell Статус установки обновлений для рабочих станций через WSUS на Powershell

    Когда у вас есть сразу несколько серверов WSUS с центральным корневым, бывает очень проблематично получать отчеты об обновлениях рабочих станций.

    Мне был нужен скрипт, который покажет, что на каких-то компьютерах есть не установленные одобренные обновления. Такой отчет есть в консоли WSUS, он называется Computer Tabular Status for Approved Updates

    Но это достаточно трудоемкая задача, когда у вас 5-10-15 серверов.

  • [Основы Powershell] Найти папку для установки модулей в Powershell

    В сети много полезных модулей для Powershell. Как их установить? Модуль в Powershell - это папка с файлами. Ее нужно скопировать в другую папку для модулей.

    Как найти, куда скопировать модуль?

    PS H:\> $env:PSModulePath -split ';'
    C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Modules C:\Windows\system32\WindowsPowerShell\v1.0\Modules\

    А вот в другой системе:

  • Выполнение команд в Linux через SSH с помощью Powershell

    В одной моей задаче надо было написать скрипт для отправки SMS-сообщений. У нас уже был настроен сервер для отправки SMS на Linux. Оставалось только научиться отправлять команды в Linux через SSH.

    Первоначально я пытался использовать модуль SSH-Session, но в нем были какие-то ошибки при отправке команд. Поэтому я остановился на Posh-SSH.

     

    Устанавливаем модуль:

  • Сохранение паролей для использования в скриптах Powershell

    Иногда при запуске скриптов в Powershell бывает необходимо запускать какой-нибудь командлет под чужой учетной запиью, служебной например. Обычно в таких случаях создается специальный объект PSCredential при помощи несложной конструкции $user = Get-Credential, и пользоваться далее этим объектом в последующих командлетах. При нечастом запуске это может и не быть проблемой, но когда надо скрипт запускать несколько раз в день, то неэффективно вводить логин-пароль.

    Лучшим способом было бы сохранить данные учетной записи в зашифрованном виде где-нибудь на диске рядом с файлом скрипта. Или, как вариант, в самом скрипте.

     

  • [Основы Powershell] Найти подстроку в массиве

    Представим, что у вас есть массив строк (адресов электронной почты):

     

    one-domain.ru
    two-domain.ru
    three-domain.com
    four-domain.com
    five-domain-company.com

     

    Стоит задача - найти среди этого массива адреса в домене domain.ru.

  • Удаление старых файлов и папок на Powershell

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

  • Найти все снапшоты в VmWare vSphere

    Не секрет, что при выполнении бэкапа Veeam Backup & Replication иногда "забывает" удалить созданные им снапшоты. Это приводит к тому, что вся виртуальная машина начинает работать полностью на снапшоте все время. Это ресурсоемкая операция, которая существенно снижает производительность виртуальной машины.

    Кроме этого, администраторы сами могут создать снапшот и забыть про него. У нас в компании был случай, когда виртуальный сервер пол-года (!!!!!) работать на снапшоте.

    К счастью, VmWare предоставляет модуль для Powershell PowerCLI, с помощью которого можно найти все такие снапшоты.

  • Массовое удаленное изменение DNS-серверов в настройках сетевой карты в Windows

    При апгрейде контроллеров домена или их удалении\добавлении, всегда появляется необходимость изменить DNS-сервера в настройках сетевых интерфейсов. Там, где сетевые настройки выдаются через DHCP - проблем нет. А там, где все настроено вручную, придется заходить на каждый сервер и менять руками. Это долго и неудобно.

  • Парсим сайты и веб-страницы с помощью Powershell / Invoke-WebRequest / getElementsByTagName и боремся с производительностью

    Иногда бывает нужно отпарсить какой-нибудь сайт или большую веб-страницу. Google предлагает множество программ и целых сложных комплексов для решения этой задачи, но я хочу показать, как это достаточно просто можно делать в Powershell.

    В Powershell есть специальный коммандлет Invoke-WebRequest, который собственно и разбирает HTML-страницу на тэги и содержимое. На выходе этот коммандлет выдает объект страницы с полем ParsedHtml. К этому полю можно применять методы по выборке нужных данных.

    Допустим, что вам нужно выбрать все ссылки на странице. Вот как это работает.

  • Бэкап MS SQL (в том числе Express) баз данных с помощью Powershell скрипта

    В бесплатной версии Microsoft SQL Server - Express - нет возможности настроить резервное копирование баз данных по расписанию. Однако вы можете настроить бэкап с помощью Powershell-скриптов и планировщика задач Windows.

    Ниже - пример скрипта, как это делаю я. Скрипт не удаляет старые бэкапы. Но почитайте мою статью Удаление старых файлов и папок на Powershell, она вам поможет. И еще - Запускаем Powershell-скрипты в планировщике задач.

    Обратите внимание на выделенные строки - там надо прописать ваш путь к бэкапам и инстанс SQL-сервера.

  • Массовая запись в базу MS SQL скриптом на Powershell Массовая запись в базу MS SQL скриптом на Powershell

    При тестировании отказоустойчивой конфигурации Microsoft SQL Server 2012 (подробнее: Пошаговое развертывание AlwaysOn - MS SQL 2012) мне нужно было сгенерировать массовую запись данных в базу.

    Т.к. я совсем не знаю T-SQL, решил написать небольшой скрипт на Powershell для решения этой задачи.

    Нам понадобится:

    • Непосредственно база данных
    • Таблица в ней для службных нужд
  • Ошибка "Get-PowerCLIVersion : The term 'Get-PowerCLIVersion' is not recognized as the name of a cmdlet, function, script file, or operable program." при запуске VMware vSphere PowerCLI Ошибка "Get-PowerCLIVersion : The term 'Get-PowerCLIVersion' is not recognized as the name of a cmdlet,   function, script file, or operable program." при запуске VMware vSphere PowerCLI

    Иногда при запуске VMware vSphere PowerCLI консоль загружается с ошибками:

    Get-PowerCLIVersion : The term 'Get-PowerCLIVersion' is not recognized as the name of a cmdlet,
    function, script file, or operable program. Check the spelling of the name, or if a path was
    included, verify that the path is correct and try again.
    At C:\Program Files (x86)\VMware\Infrastructure\vSphere
    PowerCLI\Scripts\Initialize-PowerCLIEnvironment.ps1:38 char:12
    + $version = Get-PowerCLIVersion
    + ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : ObjectNotFound: (Get-PowerCLIVersion:String) [], CommandNotFoundExce
    ption
    + FullyQualifiedErrorId : CommandNotFoundException
  • Как сохранить вывод Powershell-консоли в текстовый файл Как сохранить вывод Powershell-консоли в текстовый файл

    Иногда бывает очень сложно найти ошибку в скрипте Powershell, особенно если скрипт запускается в какой-то отдельной выделенной сессии, например, под учетной записью SYSTEM. Там будут вылазить всякие ошибки, но вы о них не узнаете.

    Поэтому я начал искать способ логировать\сохранять вывод Powershell консоли в файл и вот как это можно сделать.

  • Как распаковывать большие архивы в DSC-конфигурациях Powershell Как распаковывать большие архивы в DSC-конфигурациях Powershell

    Если вам когда-нибудь надо было распаковать БОЛЬШИЕ архивы в Powershell DSC-конфигурациях (например, в процессе развертывания какого-нибудь ПО), вы вероятно сталкивались с проблемой, что распаковка с помощью ресурса Archive длится ОЧЕНЬ долго. И xArchive тоже не помогает - у него такие же проблемы.

    Один из возможных вариантов для того, чтобы обойти ситуацию - это использовать 7zip или другую утилиту командной строки, используя ресурс DSC WindowsProcess, но учтите, что WindowsProcess только запустит ваш процесс распаковки, а потом сразу перейдет к следующей инструкции в конфигурации. Например вот:

  • Как удаленно перезагрузить службы Windows с помощью Powershell Как удаленно перезагрузить службы Windows с помощью Powershell

    Вот мой скрипт, который умеет удаленно перезагружать службы Windows с помощью Powershell. Скрипт умеет пинговать машины перед тем, как попытаться перегрузить службу.

    Т.к. у нас заблокирован ICMP/ping между ландшафтами разработки, я использовал WMI-запросы, чтобы определить, запущена ли удаленная машина.

  • Найти сервера с установленным MS SQL Server с помощью Powershell Найти сервера с установленным MS SQL Server с помощью Powershell

    Вот скрипт, который умеет искать сервера в вашем домене, на которых установлен Microsoft SQL Server.

    Скрипт умеет обрабатывать выключенные\неотвечающие сервера с помощью пингов WMI, что полезно, когда ICMP по какой-то причине заблокирован. Кроме этого, тут используется Powershell Remoting, поэтому сначала удостоверьтесь, что он включен.

  • Найти список всех образов для виртуальных машин в Azure Найти список всех образов для виртуальных машин в Azure

    Когда вы строите свою инфраструктуру в облаке Azure, используя IaaC (Infrastructure as a Code) подход, иногда вам придется некоторые ваши виртуалки переразворачивать. От этого никуда не денешься, учитывая, в общем-то, специфику облака: что-то не работает? - передеплой. И вот иногда бывает так, что сталкиваешься с проблей переразвертывания, когда парни из Microsoft обновляют образы для виртуалок новыми версиями систем. Например - SQL server 2014 уже не поставляется с SP1. В итоге вам надо как-то быстро найти список новых ID для образов, чтобы обновить свои ARM или Powershell-скрипты.

    Я написал небольшой скрипт, который поможет в этом.

  • Разработка и распространение модуля на Powershell Разработка и распространение модуля на Powershell

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

    Я потратил несколько часов на изучение разных статей и, как обычно, пришел к своему подходу, который мне кажется достаточно удобным, гибким, и которым я хочу поделиться сейчас.