Общее·количество·просмотров·страницы

Показаны сообщения с ярлыком PowerShell. Показать все сообщения
Показаны сообщения с ярлыком PowerShell. Показать все сообщения

среда, 21 января 2015 г.

PowerShell. Функция удаления элементов из массива

В языке нет предопределенного метода для удаления элемента из массива, написал свой.
$arr (массив из которого удаляем)
$index (индекс удаляемого элемента)
function array_delete_item($arr, $index){
   
   #Проверка на корректность данных
   write "Индекс удаляемого элемента $index"
   if($index -gt $arr.count-1){
    write "Индекс превышает границы массива"
    return $null}

   if($index -lt 0){
    write "Индекс не может быть меньше 0"
    return $null}
   #++++++

   $start_index = 0
   #подготовим индекс
   $index_left = $index - 1;
   $index_right = 0;
  
   #Если удаляем первый элемент
   if ($index_left -lt 0){$index_left = 1
   $start_index = 1
   $index_right = 2
   }

   # Индекс до удаляемого элемента $index_left
   if($index_right -eq 0){$index_right = $index + 1}
   # Индекс после удаляемого элемента $index_left
   if ($index_right -gt $arr.Count){$index_right=$arr.count-1}
   # Начальный индекс $start_index

   return $arr[($start_index)..($index_left)]+$arr[($index_right)..($arr.Count)]
}

среда, 10 декабря 2014 г.

Запустить скрипт PowerShell как задание

Все ниже написанное применимо только для PowerShell 3.0. Execution Policy должна быть настроена на возможность выполнения скриптов в системе. Вот заметка на эту тему.

Итак, узнаем версию PowerShell...
$PSVersionTable
Если 3.0 продолжаем, если нет то ставим 3.0

Пользоваться будем командлетами
Register-ScheduledJob http://technet.microsoft.com/en-us/library/hh849755.aspx
New-JobTrigger http://technet.microsoft.com/en-us/library/hh849759.aspx
New-ScheduledJobOption http://technet.microsoft.com/en-us/library/hh849767.aspx
Get-Credential http://technet.microsoft.com/ru-ru/library/hh849815.aspx

Несколько слов о командлетах.

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

Создадим тригер который будет активироваться каждую среду и субботу в 23:00
$trig = New-JobTrigger -Weekly -DaysOfWeek 3,6 -At "23:00"
- Weekly - недельный интервал
- DaysOfWeek - дни недели, нумерация начинается с 0, причем 0 это воскресенье 6 соответственно суббота.
- At - Время выполнения можно использовать англоязычный формат времени "11:00 PM"

Get-Credential позволяет получить учетные данные пользователя и сохранить их в переменную/файл.
$cred = Get-Credential

New-ScheduledJobOption устанавливает параметры для задания. Воспользуемся только одним параметром -RubElevated выполнять задание с повышенными правами.
$options = New-ScheduledJobOption -RunElevated

Register-ScheduledJob - создает задание в системе.
Register-ScheduledJob -Name sync -FilePath C:\temp\test_connection.ps1 -Trigger $trig -Credential $cred -ScheduledJobOption $options

В общем код имеет вид:

$trig = New-JobTrigger -Weekly -DaysOfWeek 3,6 -At "23:00"
$cred = Get-Credential
$options = New-ScheduledJobOption -RunElevated
Register-ScheduledJob -Name sync -FilePath C:\temp\test_connection.ps1 -Trigger $trig -Credential $cred -ScheduledJobOption $options
Пример достаточно простой, почитав документацию можно делать поизвилистей ))

ВАЖНО! Не забываем про необходимые права для учетки от имени которой выполняется задание.

вторник, 9 декабря 2014 г.

PowerShell. Выполнение скриптов в системе и Execution Policy.

По умолчанию возможность выполнения скриптов PS в системе отключена. Правами на выполнение скриптов рулит политика Execution Policy. Всего несколько значений этой политики:

- Restricted (Политика по умолчанию) - Можно выполнять отдельные команды, но скрипты выполнять нельзя.
- AllSigned - Выполнять скрипты можно, но они должны быть подписаны сертификатом.
- RemoteSigned - Скрипты созданные локально можно выполнять в системе, а скрипты и файлы конфигурации загруженные через интернет требуют подписи сертификатом.
- Unrestricted - Могут выполняться не подписанные скрипты. Предупреждения при выполнении скриптов загруженных из интернета.
- Bypass - Ничего не блокируется предупреждения не выдаются.
- Undefined - Политика не задана используется политика по умолчанию.

Просмотреть политики
Get-ExecutionPolicy

Я рекомендую использовать политику RemoteSigned компромис между безопасностью и функционалом. Установить ее можно так:

Set-ExecutionPolicy RemoteSigned -force

В этой заметке я не описывал области и некоторые другие вещи. Более подробно.
get-help about_execution_policies

среда, 3 декабря 2014 г.

PowerShell. Exchange удаление писем

Как удалять письма.

Кошерно с минимальной нагрузкой на сервер и минимальными рисками делаем так.
Если в теме письма RE: FE: HA: и пр. с двоеточием вместо него ставим либо *: либо *

  • Ищем письмо в логах

МЕНЯЕМ ПАРАМЕТРЫ:
$startdate
$enddate
-Sender
MessageSubject

В консоли пишем.

$startdate = get-date "03.12.2014 00:40:00" 
$enddate = get-date "03.12.2014 22:57:59" 
Get-TransportServer | Get-MessageTrackingLog -ResultSize unlimited -Start $startdate -End $enddate -eventid "RECEIVE" -Sender "y.nemo@test.ru" | where{$_.MessageSubject -like "*Заявка на подключение*"}
Нашли искомое письмо

  • Проверим что поисковый запрос работает.

МЕНЯЕМ ПАРАМЕТРЫ:
См. выше и
Subject:
From:
sent:

В консоль вставляем, НЕ ЗАБЫВАЕМ ПРО ПАРАМЕТРЫ:

$recipients = Get-TransportServer | Get-MessageTrackingLog -ResultSize unlimited -Start $startdate -End $enddate -eventid "RECEIVE" -Sender "y.nemo@test.ru" | where{$_.MessageSubject -like "*Заявка на подключение*"}
$array
foreach($item in $recipients){
$array += $item.Recipients
}
$array = $array | select -Unique
foreach($item in $array){
Get-Mailbox -Identity $item | Search-Mailbox -SearchQuery 'Subject:"*Заявка на подключение*" from:y.nemo@test.ru sent:03/12/2014' -EstimateResultOnly
}

Если поиск удачен, то значение ResultItemsCount > 0

  • Удаление писем

Меняем параметр –EstimateResultOnly на –DeleteContent.
foreach($item in $array){
Get-Mailbox -Identity $item | Search-Mailbox -SearchQuery 'Subject:"*Заявка на подключение*" from:y.nemo@test.ru sent:03/12/2014' -DeleteContent -Confirm:$false
}

понедельник, 28 апреля 2014 г.

PowerShell. MS Exchange вывести список сообщений почтового ящика

Настрой весенний, решил черкануть пару строк ))
Данный пост посвящен частому действию админа exchang'a, выводу списка сообщений определенного пользователя за определенный период.
Итак...
Запускаем Exchange Management Shell. Скрипт следующего содержания:
Get-TransportServer | Get-MessageTrackingLog -ResultSize unlimited -Start $startdate -end $enddate -EventID "RECEIVE" -Recipients "v.pupkin@mail.ru"

Смысл...
 Get-TransportServer - получим список наших exchange серверов, Get-MessageTrackingLog -берем лог сообщений, ну и по параметрам:
-ResultSize unlimited - размер вывода бесконечно большой
-Start $startdate -end $enddate   - период, переменные $startdate, $enddate соответсвенно начало и конец, присваивание значений выглядит так $startdate = get-date 28.04.2014, если со временем то так $enddate = get-date "28.04.2014 12:00:05"
-EventID "RECEIVE" - id события у сообщения
-Recipients "v.pupkin@mail.ru" - искомый ящик


среда, 2 апреля 2014 г.

PowerShell. Поиск учеток пользователей не логинившихся N дней.

Следить за актуальностью учетных записей в AD, правильное, но нудное и неблагодарное занятие. То отдел кадров не даст информацию, то сам забудешь и т.п. На выручку приходит PowerShell (подобных скриптов кстати на vbs превеликое множество), постараюсь по тексту дать комментарии.

# Получим список всех пользователей в домене собираем только включенные учетки (-Filter {Enabled -eq $true}) и выбираем свойства Name,Manager,LastLogon (-Properties Name,Manager,LastLogon )
$users = Get-ADUser -Filter {Enabled -eq $true} -Properties Name,Manager,LastLogon
#Далее передаем полученных пользователей по конвейеру выбираем из переменной поля Name,Manager, и строим хеш таблицу (@{n='LastLogon'; e={[DateTime]::FromFileTime($_.LastLogon)}} ) описывать не буду инфы много
$selectuser = $users | Select-Object Name,Manager,@{n='LastLogon';e={[DateTime]::FromFileTime($_.LastLogon)}}
#Выбираем только те объекты у которых параметр LastLogon меньше текущей даты на месяц
$userotbor = $selectuser | where-object {$_.lastlogon -lt (get-date).addmonths(-1)} | Sort-Object lastlogon
#Экспорт в файл
$userotbor | Export-CSV c:\temp\lastlogon.csv -Encoding Unicode

P.S. В сети с несколькими домен контроллерами лучше делать отбор по параметру LastLogonTimeStamp

вторник, 18 марта 2014 г.

PowerShell. Получить список пользователей AD из определенного OU.

Для получения списка пользователей AD из отдельного контейнера, используется командлет Get-ADUser с параметром -SearchBase, пример:
Get-ADUser -SearchBase "OU=Users, OU=Office, DC=office, DC=local" -Filter *
Выбрать всех пользователей домена office.local, из контейнера Users являющимся вложенным в контейнер Office.

понедельник, 3 февраля 2014 г.

Вывод атрибутов пользователя AD при помощи PowerShell

Классическая задача для админа. Есть список пользователей в файле csv, необходимо по представленному списку сформировать файл с определенными атрибутами учетной записи.
Допустим входной файл имеет вид:


|sn              | givenName |
|Иванов     | Иван           |
 

В атрибутах учетной записи sn, как правило, фамилия, givenName имя.
Напишем небольшой скрипт и разберем его.


$users = Import-CSV c:\temp\EID2.csv
foreach ($user in $users){
$sn = $user.sn
$given_name = $user.givenName
$userset = Get-ADUser -f {(sn -eq $sn) -and (givenName -eq $given_name)} -Properties *
if ($userset -ne $Null){
$userset | Select-Object employeeID, sAMAccountName, mail  | Export-Csv -Encoding Unicode -Path c:\temp\final3.csv -Append  
}
}

 

$users = Import-CSV c:\temp\EID2.csv В переменную $users помещаем результат импорта из файла c:\temp\EID2.csv.

foreach ($user in $users){

Для тех кто немного изучал программирование, будет понятней, это цикл по объектам, $users наша переменная содержащая объекты импорта, т.е. строки файла и колонки, переменная $user содержит значения колонок текущей строки.

$sn = $user.sn

Присваиваем переменной $sn значение текущей колонки sn в файле.

$given_name = $user.givenName

То же самое для колонки givenName

$userset = Get-ADUser -f {(sn -eq $sn) -and (givenName -eq $given_name)} -Properties *

Для поиска пользователей в AD используем командлет Get-ADUser через параметр –f задаем фильтр поиска по атрибутам учетки {(sn -eq $sn) -and (givenName -eq $given_name)}, если условие одно то его можно не заключать в скобки, через параметр –Properties * получим все атрибуты.

if ($userset -ne $Null){

Если переменная $userset найдена, т.е. не равна нулю, то делаем следующее

$userset | Select-Object employeeID, sAMAccountName, mail  | Export-Csv -Encoding Unicode -Path c:\temp\final3.csv -Append  

Из переменной $userset по конвейеру передаем значение на командлет Select-Object который выбирает три параметра employeeID, sAMAccountName, mail , дальше через конвейер передаем на командлет Export-Csv -Encoding Unicode -Path c:\temp\final3.csv –Append здесь указываем кодировку файла -Encoding Unicode,  путь -Path c:\temp\final3.csv, и укажем, что нужно дозаписывать значения в конец файла –Append.
На выходе получим файл с атрибутами.