среда, 10 октября 2018 г.

PoSH - Get-Process примеры

Get-Process | Sort-Object WorkingSet -Descending | select -First 5
Get-Service | Sort-Object WorkingSet, DisplayName -Descending | select -First 5
14,14,5,6,7,1,54,4,4,5,6,1,0,33,3,5 | sort -Unique
Get-EventLog Application -Newest 100 | sort Source -Unique

PoSH - Get-Service примеры

# Get-Service
get-service -displayname 'Background Intelligent Transfer Service'
get-service | where {($_.status -eq "Running") -and ($_.CanStop -eq $true)}
get-service | where {($_.status -eq "Running") -and !($_.CanStop -eq $true)} # Negation
get-service | ? { $_.status -eq 'running' -and ($_.canstop) }
get-service | ? { $_.status -eq 'running' -and !($_.canstop) } # Negation
Get-Service | Get-Member canstop

# Sort and Select:
Get-Service | Sort-Object WorkingSet,DisplayName -Descending  | select -First 5

PoSH - инсталляция модуля AD на Windows 7

# For Workstation
Get-Help *WindowsFeature
Import-Module ActiveDirectory
Get-WindowsFeature | where name -like RSAT-AD-PowerShell | Install-WindowsFeature

# For Server
Install-WindowsFeature
Install-WindowsFeature Desktop-Experience
Windows-identity-foundation
Import-Module ServerManager
Add-WindowsFeature RSAT-AD-PowerShell
gcm | ? { $_.ModuleName -eq 'ServerManager' }

PoSH - ScriptAnalyzer - Install, Check and Use

# Install PSScriptAnalyzer
Install-Module -Name PSScriptAnalyzer -Scope CurrentUser
Get-Module -Name PSScriptAnalyzer -ListAvailable
Import-Module -Name PSScriptAnalyzer

# Check PSScriptAnalyzer
Get-Command -Module PSScriptAnalyzer
Get-ScriptAnalyzerRule

#--- Use ScriptAnalyzer
$InvokePATH = & 'C:\Scripts\GoodScript.ps1'
Invoke-ScriptAnalyzer $InvokePATH

вторник, 9 октября 2018 г.

PoSH Tips-n-Tricks или "полезняшки"

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

Эта статья задумана как сборник различных "Tips-and-Tricks", которые, будучи собранными в одном месте, смогут напомнить вам (и мне) о существовании и способе применения различных команд, а также смогут помочь справиться с различными стандартными и нестандартными ситуациями.

В этом словаре-напоминалке не будет подробных объяснений команд, а параметры будут даны только самые необходимые - минималистский подход.

Надеюсь постоянно обновлять этот пост по мере встречи с различными явлениями и способами их решения.

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Measure-Object (измерения различных значений)
# Объем RAM компьютера в Mb:
(Get-WmiObject Win32_PhysicalMemory | Measure-Object Capacity -sum).sum/1mb

# К-во процессов на компьютере:
(Get-Process | measure VirtualMemorySize -Sum).count

# Объем памяти RAM, занятой всеми процессами, в Mb:
(Get-Process | measure VirtualMemorySize -Sum).sum/1mb

#---Start
# RAM, округленный до двух знаков после точки:
$VMMemSize = (Get-Process | measure VirtualMemorySize -Sum).sum/1mb
$VMMemSize2 = [math]::round($VMMemSize,2)
Write-Host "Rounded VMMemSize = $VMMemSize2 Mb"
#---Stop

# How to check where TEMP folder located:
$env:temp

# Размер папки TEMP:
(dir $env:temp | Measure-Object -Property length -sum).sum/1mb

#---Start
# Размер папки TEMP с округленным значением и коротким синтаксисом:
$FolderSize = (dir $env:temp | measure length -sum).sum/1mb
$FolderSize2 = [math]::round($FolderSize,2)
Write-Host Rounded RAM = $FolderSize2 Mb
#---Stop

Как проверить время работы скрипта - два способа.

#---START первый способ
Write-Host ""
$Timing1 = (Measure-Command { H:\Experiment\Get-WmiObject.ps1 }).totalseconds
Write-Host "Timing1 is $Timing1"
Write-Host ""
#---END первый способ

#---START второй способ (NET Stopwatch)
$sw = [Diagnostics.Stopwatch]::StartNew()
H:\Experiment\Get-WmiObject.ps1
$sw.Stop()
$Timing = ($sw.Elapsed).Milliseconds
Write-Host "Script was running $Timing Miliseconds"
Write-Host ""
#---END второй способ (NET Stopwatch)

Как проиграть звуковой файл из PowerShell? Да, это возможно!
$PATH = ’D:\Hey Jude.wav’
$PlayWav=New-Object System.Media.SoundPlayer
$PlayWav.SoundLocation=$PATH
$PlayWav.playsync()

Как пользоваться командами Get-WmiObject?

# Следующие 3 команды дают одинаковый результат - данные о BIOS компьютера:
Get-WmiObject -Class win32_bios -ComputerName $env:COMPUTERNAME
Get-WmiObject -Class win32_bios -ComputerName localhost
Get-WmiObject -Class win32_bios -ComputerName .

Как получить данные об удаленном компьютере?
Команда запрашивает имя/IP компьютера, вы его вводите - результат налицо!
(точка или localhost также принимаются в качестве ответа)
#---START
$ComputerName = Read-Host -Prompt "Enter computer name or IP"
Get-WmiObject -Class win32_bios -ComputerName $ComputerName
#---END

# Как проверить, какая версия PoSH установлена - 32 или 64 bit?
[Environment]::Is64BitProcess

How to install NTFSSecurity module:
Get-Module -ListAvailable # (проверка имеющихся модулей)
Install-Module -Name NTFSSecurity

PoSH - эффективность команды Get-ADComputer

Предположим, нам нужно получить данные о серверах домена Active Directory при помощи команды Get-ADComputer. Как быстрее и эффективнее выполнить команду?
Приведу несколько примеров в скрипте, который измеряет время выполнения 6 различных вариантов команды.

#---START
Clear-Host
$startTime = (Get-Date)
Get-ADComputer -Filter {OperatingSystem -Like '*Server*'} | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime1 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 1: $ElapsedTime1"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter * | Where-Object OperatingSystem -Like '*Server*' | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime2 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 2: $ElapsedTime2"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter {OperatingSystem -Like '*Server*'} -Properties * | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime3 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 3: $ElapsedTime3"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter * | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime4 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 4: $ElapsedTime4"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter * -Properties * | Where-Object OperatingSystem -Like '*Server*' | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime5 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 5: $ElapsedTime5"
Write-Host ""

$startTime = (Get-Date)
Get-ADComputer -Filter * -Properties * | Select-Object -expand Name | Out-Null
$endTime = (Get-Date)
$ElapsedTime6 = ($endTime-$startTime).ToString('''Duration: ''mm'' min ''ss'' sec''')
Write-Host "Duration of the operation 6: $ElapsedTime6"
Write-Host ""
#---END


Operation1 - чемпион скорости, занимает долю секунды, ведь мы сразу выбираем только серверы.
Operation2 - занимает чуть больше секунды, т.к. сначала выбираются все компьютеры домена и только позже происходит отбор серверов.
Operation3 - около 13 сек.. Хотя отбор серверов происходит вначале, как и в $SRV1 (т.е., серверов мало), но затем вместо 9 базовых у них берутся все свойства, которых больше 70.
Operation4 - время больше секунды, как и в $SRV2. В обоих случаях первоначально выбираются все компьютеры со стандартными свойствами. Различие лишь в том, что в данном случае не присходит отбор серверов (что чуть быстрее), хотя в переменную выводится больше имен (что чуть медленнее). Видимо, различия взаимно компенсируются, или же их влияние несущественно.
Operation5 - здесь сначала выбираются все компьютеры и у них берутся все свойства - это ДОЛГО -, а отбор серверов происходит на поздней стадии, что не уменьшает время. Правда, меньше времени тратится на запись в переменную (но это время минимально).
Operation6 - так же долго, как и в случае $SRV5 и это понятно: в обоих вариантах сначала выбираются все компьютеры и у них берутся все свойства. Ну, а отбор или отсутствие такового влияют незначительно.

Какие выводы можно сделать?
Во-первых, отбор (или уменьшение к-ва объектов) лучше делать в начале строки (т.е. слева), т.к. выгодно производить затратные операции над меньшим к-вом объектов.
Во-вторых, отбирайте только нужные свойства, иными словами, старайтесь как можно меньше использовать звездочку (*).
В-третьих, видно, что опрос Active Directory занимает гораздо больше времени, чем операции над объектами в памяти компьютера. Кстати, именно поэтому надо всегда стараться результат затратных операций выводить в переменные в случае необходимости повторного использования этих результатов.

воскресенье, 7 октября 2018 г.

PoSH - разница между Get-ADDomainController и Get-ADComputer

Мы имеем два похожих коммандлета: Get-ADDomainController и Get-ADComputer.
Кроме названий, которые selfexplained, есть также различие в синтаксисе и выводимых свойствах (properties).

9 стандартных свойств Get-ADComputer включают Name и DNSHostName (по сути, FQDN).
7 стандартных свойств Get-ADDomainController включают Name, Domain, Forest, IPv4Address.
Сразу видно, что из всего лишь семи свойств большая часть полезны, в отличие от менее полезных девяти (ИМХО). Для FQDN вместо DNSHostName используется название HostName (не знаю, почему).

Насчет полезности, Get-ADDomainController имеет очень нужное свойство IPv4Address. 
В Get-ADComputer мы можем его получить, но только в расширенных свойствах, для чего нужно объявить его в -Properties. Несложно, но зачем? Сравните, насколько короче строка в первом случае.
Get-ADDomainController -Domain domainname -Discover
Get-ADComputer -Identity computername -Server domainname/dcname -Properties Name,IPv4Address

Обратите внимание на две особенности: для одинаковой цели в первом случае используется имя параметра -Domain, а во втором -Server. Интересно также, что -Server принимает как domainname, так и dcname (имя контроллера домена). Все это поначалу немного путает, не так ли? 

В общем, как мне кажется, коммандлет Get-ADDomainController более продуман и логичен. Видимо, для своих старались :)

Не забудем, также, что для Get-ADComputer мы не обязаны применять параметр -Identity, можно использовать -Filter, главное, чтобы один из них присутствовал. Напомню, что -Identity применяется для указания одной сущности (компьютера), а -Filter для набора сущностей. 

И да, пока не забыл, в Get-ADComputer компьютер (-Identity computername) должен быть членом домена, указанного в параметре -Server (domainname/dcname), иначе будет ошибка. Что, впрочем, естественно. 


Несколько примеров для Get-ADComputer.

Get-ADComputer -Filter * # минимальная команда, которая дает список всех компьютеров текущего домена.

Get-ADComputer -Filter {OperatingSystem -Like "*Server*"} # выбираются все серверы текущего домена (того, где залогинен компьютер, с которого вы работаете).

Get-ADComputer -Filter * -Server domainname/dcname # благодаря параметру -Server можно получить список всех компьютеров нужного домена; нужно лишь указать имя домена или DC - домен контроллера требуемого домена.

Get-ADComputer -Filter {OperatingSystem -Like "*Server*"} -Server domainname/dcname # сочетание фильтра и имени DC/домена дает возможность получить список северов любого домена.

Get-ADComputer -Identity computername -Server domainname/dcname -Properties Name,IPv4Address # здесь указывается имя нужных компьютера и домена, нужно лишь следить за их правильным сочетанием.

Несколько примеров для Get-ADDomainController.

Get-ADDomainController # в отличие от предыдущего командлета команда работает без параметров и выдает сразу 24 свойства для одного из контроллеров текущего домена.

Get-ADDomainController -Domain domainname -Discover # так мы получаем свойства одного из DCs указанного домена. 

Get-ADDomainController -Filter * # способ получить все DCs - домен контроллеры текущего домена.

Get-ADDomainController -Filter * -Server dcname # способ получить все DCs любого домена по имени сервера этого домена.

Get-ADDomainController -Filter * -Server domainname # это способ получить все DCs любого домена по имени домена (неважно, что параметр называется -Server - это работает).

Обратите внимание, что работают сочетания параметров  -Domain / -Discover или -Filter / -Server. 
Конечно, для вывода на экран удобнее использовать скобки, Format-Table (FT) или Select-Object (Select). 

Если достаточно показать только одно свойство - скобки ИМХО удобнее:
(Get-ADComputer -Filter *).Name 
В случае необходимости показа нескольких свойств - FT или Select:
Get-ADComputer -Filter * | FT Name,IPv4Address
Get-ADComputer -Filter * | Select Name
Select лучше работает, если вывод направляется не на экран, а в файл или пайп.

Надеюсь, что на сегодня информации достаточно.