PowerShell — Send-MagicPacket

Для того, чтобы разбудить компьютер по сети можно найти кучу разных скриптов на пошике. Почему я написал свой? Во-первых я не получал визуального удовлетворения от скрипта, а во-вторых я никак не мог понять почему я должен указывать мак-адрес в строго определенном формате, ведь формат отличается не только у разных вендоров, но и в разных оснастках винды.
Не нравится? Сделай сам!

Для начала добавим возможность конвейерной обработки и сделаем несколько алиасов, т.к. мак-адрес на выходе разных командлетов называется по-разному. Это будут «LinkLayerAddress»,»PhysicalAddress» и «ClientId».

[System.Net.IPAddress]::Broadcast — это 255.255.255.255

Дальше заменим все буквы от g до z и все не буквы и не цифры с помощью регулярки [g-z]|[^\w\d], это позволит нам вводить адрес в абсолютно любом формате.
В интернете можно увидеть такой способ создания массива байт

[Byte[]](,0xFF * 6)

Наверное кто-то когда-то написал и все копипастят.
Этот синтаксис допустим, но это не по повершелловски 🙂
В пошике для создания массива всегда используется @()

Применим это к данной ситуации:

@([byte][convert]::ToInt32('FF',16)) * 6

Ну или хотя бы так:

 @([Byte]0xFF) * 6

В результате получаем скрипт:

Function Send-MagicPacket {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)][Alias("LinkLayerAddress","PhysicalAddress","ClientId")][string[]]$MacAddress,
[IPAddress]$Broadcast = [System.Net.IPAddress]::Broadcast,
[int32[]]$Ports = @(7..9)
)

	Process{
		foreach ($Mac in $MacAddress) {

			[string]$Mac = $Mac.ToUpper() -replace "[g-z]|[^\w\d]"
			if($Mac.Length -ne 12){Write-Error -Message 'Invalid PhysicalAddress format'; break}
			[string[]]$SplitMac = $Mac -split '([\w\d]{2})' -match '[\w\d]'
			[byte[]]$packet = @( [byte] [convert]::ToInt32('FF',16) ) * 6
			$packet += @( $SplitMac | % { [byte] [convert]::ToInt32($_,16)} ) * 16

			$UdpClient = New-Object System.Net.Sockets.UdpClient

			$Ports | % {
				$UdpClient.Connect($broadcast, $_)
				$UdpClient.Send($packet, $packet.Length) | out-null
			}

			$UdpClient.Close()

			[pscustomobject][ordered]@{
				'Mac' = $Mac
				'Port' = $Ports
			}
		}
	}
}

Читать далее

Реклама

PowerShell — Join-String

Штука нужна не часто, но когда нужна, очень жаль что такой нет в системе.
Еще не понял насколько этот скрипт полезен и достоин ли он лежать на powershellgallery

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

Зачем это надо, надо же обосновать))
Ну например пишем мы что типа того

Get-WmiObject Win32_NetworkAdapterConfiguration -Filter {MACAddress like '%'}

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

(Get-WmiObject Win32_NetworkAdapterConfiguration -Filter {MACAddress like '%'} | % {$_.MACAddress}) -join ';'

Но как же так? Пошик славится конвейером, а сцепить массив строк на лету не получается ((
Хочу примерно так:

Get-WmiObject Win32_NetworkAdapterConfiguration -Filter {MACAddress like '%'} | Join-String -Property MACAddress

Вперед!

Читать далее

PowerShell Script Shadowing

О чем речь

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

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

Почему именно так

Исторически так сложилось, что и cmd и powershell в отличие от vbs являются прежде всего оболочками и потому выполняются в скрытом режиме только в виде logon-скриптов, которые стартуют не сразу при входе, а с какой-то задержкой. Если мы хотим выполнять скрипт сразу при входе или периодически, то нам нужен планировщик заданий, но после появления в интернете большого количества статей о получении пароля из файлов netlogon, мелкомягкие пофиксили возможность задания паролей для назначенных заданий или для сетевых дисков через групповые политики. Получается что при настройке назначенных заданий через групповые политики мы можем использовать либо встроенные учетные записи типа System, или учетку вошедшего пользователя, но без сохранения пароля, а если скрипт выполняется для пользователя, вошедшего в систему, то он будет видеть мигание оболочки, запускаемой из планировщика.

Почему vbs

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

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

За дело!

Читать далее

PowerShell — Zabbix — Json

PowerShell v3 и выше!

Сижу я, смотрю на поделки zabbix-админов и прям улыбка не сползает и слёзы))

Например для автообнаружения процессоров используется вот это:

{

$items = Get-WmiObject Win32_PerfFormattedData_PerfOS_Processor | select name  |where-object {$_.name -ne '_Total'}

write-host -NoNewline "{"
write-host -NoNewline "`"data`":["

$line =  "{`"{#PROCNUM}`":`"" + $items[0].Name + "`"}"
write-host -NoNewline $line

for($c = 1; $c -lt $items.Count; ++$c) {
$line =  ",{`"{#PROCNUM}`":`"" + $items[$c].Name + "`"}"
write-host -NoNewline $line
}

write-host -NoNewline "]"
write-host -NoNewline "}"

бла бла бла... 

Ужас…

Читать далее

PowerShell Send-ZabbixTrap

Как и обещал, начал публиковать скрипты в репозитории, вот прямая ссылка на Send-ZabbixTrap

Итак, суть задачи.

Подумали мы и решили, что для одной из проверок мы не хотим использовать автообнаружение со стороны заббикса, мы хотим делать все на стороне проверяемого сервера без участия заббикса. Наш взгляд привлекла штатная утилита zabbix_sender.exe, но у него есть один неудобный момент — он может отправлять либо одно значение, либо файл с массивом значений. Неудобно, идем в интернет, информации не так много, но нашлось пара ссылок в документации и ссылка на русскоязычный форум с примером кода на C#. https://zabbix.org/wiki/Docs/protocols/zabbix_sender/2.0

О! C#  — значит есть вероятность отделаться малой кровью при портировании на PowerShell!

Читать далее

PowerShell 5

Сегодня 29 июля и все осведомленные люди из ИТ-сообщества отмечают день системного администратора, а я хочу рассказать вам один баян, недавно поразивший меня до глубины души и хочу сделать это сегодня, т. к. вдохновение уже плещется в моем стакане.
Нет, это не то…
Наступила зима…
Не, ну реально 🙂
Ладно, о чем я хотел сказать.
Вышла новая версия PowerShell и если не все это заметили, то очень жаль, так как новая версия содержит настолько важный функционал, что я даже какое-то время не мог понять о чем писать тут теперь.
Раньше с выходом новых версий мы получали небольшие улучшения синтаксиса, обновление и добавление командлетов, и вот наконец-то мы получили возможность пользоваться репозиториями.
Читать далее

PowerShell скрипты, модули, профили

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

 

Модули

Модули — это набор скриптов, но есть принципиальная разница между модулями и скриптами.
Часто на том же гитхабе можно увидеть модули всего с одним скриптом, а бывает, что на сайтах показана куча скриптов, которые необходимо выполнять последовательно.
Сейчас я попробую пролить свет на все эти решения и помочь вам выбрать лучшее.

Читать далее