diff --git a/README.md b/README.md index ab2f3c5..c7a7b7a 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,12 @@ - [Network](#Network) - [SMB](#SMB) - [WinRM](#WinRM) -- [ComObject](#ComObject) - [WMI](#WMI) - [ActiveDirectory](#ActiveDirectory) - [ServerManager](#ServerManager) +- [DNS](#DNS) +- [DHCP](#DHCP) +- [DFS](#DFS) - [PackageManagement](#PackageManagement) - [PowerCLI](#PowerCLI) - [EMShell](#EMShell) @@ -24,23 +26,26 @@ - [REST API](#REST-API) - [IE](#IE) - [Selenium](#Selenium) -- [Console API](#Console-API) +- [COM Object](#COM-Object) +- [Class .NET Win API](#Class-.NET-Win-API) - [Excel](#Excel) - [XML](#XML) -- [SQLite](#SQLite) - [DSC](#DSC) - [Git](#Git) +- [SQLite](#SQLite) +- [MySQL](#MySQL) ### Help `Get-Command *Service*` поиск команды по имени \ `Get-Help Get-Service` синтаксис \ -`Get-Help Stop-Process -Parameter *` описание всех параметров \ +`Get-Help Get-Service -Parameter *` описание всех параметров \ `Get-Service | Get-Member` отобразить Method (действия: Start, Stop), Property (объекты вывода: Status, DisplayName), Event (события объектов: Click) и Alias \ `Get-Alias ps` \ `Get-Verb` действия, утвержденные для использования в командах \ `Set-ExecutionPolicy Unrestricted` \ `Get-ExecutionPolicy` \ -`$PSVersionTable` +`$PSVersionTable` \ +`powershell -NoExit -ExecutionPolicy Unrestricted -File "$(FULL_CURRENT_PATH)"` NppExec # Object @@ -53,6 +58,10 @@ `Set-PSReadlineOption -HistorySaveStyle SaveNothing` отключить ведение журнала \ `F2` переключиться с InlineView на ListView +### Clipboard +`Set-Clipboard $srv` скопировать в буфер обмена \ +`Get-Clipboard` вставить + ### Array `$srv = @("server-01", "server-02")` создать массив \ `$srv += @("server-03")` добавить в массив новый элемент \ @@ -66,40 +75,49 @@ `$srv[10..100]` срез ### HashTable -`$hashtable = @{}` \ -`$User = "user"` \ -`$Server = "Computer"` \ -`$hashtable.Add($env:username,$env:computername)` \ -`$hashtable.Remove("Lifailon")` - -`$hashtable = @{"User" = "$env:username"; "Server" = "$env:computername"}` \ +``` +$hashtable = @{"User" = "$env:username"; "Server" = "$env:computername"} # создать +$hashtable += @{"User2" = "$env:username"; "Server2" = "$env:computername"} # добавить ключи +$hashtable.Keys # список всех ключей +$hashtable["User"] # получить значение (Values) по ключу +$hashtable["User"] = "Test" # изменить +$hashtable.Remove("User") # удалить ключ +``` `$Tag = @{$true = 'dev'; $false = 'prod'}[([System.Net.Dns]::GetHostEntry("localhost").HostName) -match '.*.TestDomain$']` -### Keys -`$hashtable.Keys` список всех ключей \ -`$hashtable["User"]` получить значение (Values) по ключу - +### List +``` +$Collections = New-Object System.Collections.Generic.List[System.Object] +$Collections.Add([PSCustomObject]@{User = $env:username; Server = $env:computername}) +``` ### PSCustomObject -`$Collections = New-Object System.Collections.Generic.List[System.Object]` \ -`$Collections.Add([PSCustomObject]@{User = $env:username; Server = $env:computername})` - -`$object = New-Object –TypeName PSCustomObject -Property @{User = $env:username; Server = $env:computername}` \ -`$object | Get-Member` \ -`$object | Add-Member –MemberType NoteProperty –Name IP –Value "192.168.1.1"` имеет возможость добавить свойство или -MemberType ScriptMethod \ -`$object.PsObject.Properties.Remove('User')` удалить свойство (столбец) - -`$arr = @()` \ -`$arr += [PSCustomObject]@{User = $env:username; Server = $env:computername}` медленный метод добавления, в каждой интерации перезаписывается массив и коллекция становится фиксированного размера (без возможности удаления) \ -`$arr.Remove(0)` Exception calling "Remove" with "1" argument(s): "Collection was of a fixed size" - -`Class CustomClass {` \ -`[string]$User` \ -`[string]$Server` \ -`}` \ -`$Class = New-Object -TypeName CustomClass` \ -`$Class.User = $env:username` \ -`$Class.Server = $env:computername` +``` +$CustomObject = [PSCustomObject][ordered]@{User = $env:username; Server = $env:computername} +$CustomObject | Add-Member –MemberType NoteProperty –Name Arr –Value @(1,2,3) # добавить Property (свойство/стобец) +$CustomObject.Arr = @(1,3,5) # изменить содержимое +$CustomObject.PsObject.Properties.Remove('User') # удалить Property +``` +### Add-Member +``` +$ScriptBlock = {Get-Service} +$CustomObject | Add-Member -Name "TestMethod" -MemberType ScriptMethod -Value $ScriptBlock # Добавить Method +$CustomObject | Get-Member +$CustomObject.TestMethod() +``` +### Class +``` +Class CustomClass { +[string]$User +[string]$Server +Start([bool]$Param1) { +If ($Param1) {Write-Host "Start Function"}} +} +$Class = New-Object -TypeName CustomClass +$Class.User = $env:username +$Class.Server = $env:computername +$Class.Start(1) +``` ### Pipeline `$obj | Add-Member -MemberType NoteProperty -Name "Type" -Value "user" -Force` добавление объкта вывода NoteProperty \ `$obj | Add-Member -MemberType NoteProperty -Name "User" -Value "admin" -Force` изменеие содержимого для сущности объекта User \ @@ -132,7 +150,7 @@ `Get-Process | Select-Object -Property *` отобразить все доступные объекты вывода \ `Get-Process | select -Unique "Name"` удалить повторяющиеся значения в массиве \ `Get-Process | select -ExpandProperty ProcessName` преобразовать из объекта-коллекции в массив (вывести содержимое без наименовая столбца) \ -`(Get-Process).ProcessName` +`(Get-Process | ? Name -match iperf).Modules` список используемых модулей процессом ### Expression ``` @@ -241,10 +259,11 @@ ps | Sort-Object -Descending CPU | select -first 10 ProcessName, # сортир `$char = $srv.ToCharArray()` разбить строку [string] на массив [System.Array] из букв \ `$char.GetType()` тип данных: Char[] \ `[Object]` массив (BaseType:System.Array) \ +`[DateTime]` формат времени (BaseType:System.ValueType) \ +`[Boolean]` логический тип ($True/$False) \ `[int]` целое число (BaseType:System.ValueType) \ `[String]` строка-текст (BaseType:System.Object) \ -`[DateTime]` формат времени (BaseType:System.ValueType) \ -`[Boolean]` логический тип ($True/$False) +`(4164539/1MB).ToString(".00")` округлить до 3,97 ### Property `$srv.Count` кол-во элементов в массиве \ @@ -382,9 +401,9 @@ ps | Sort-Object -Descending CPU | select -first 10 ProcessName, # сортир ### Filehash `Get-Filehash -Algorithm SHA256 "$env:USERPROFILE\Documents\RSA.conf.txt"` -### Clipboard -`Set-Clipboard $srv` скопировать в буфер обмена \ -`Get-Clipboard` вставить +### Microsoft.PowerShell.Archive +`Compress-Archive -Path $sourcepath -DestinationPath $dstpath -CompressionLevel Optimal` архивировать \ +`Expand-Archive .\powerlinefonts.zip` разархивировать # Credential @@ -690,52 +709,6 @@ icm $_ {Get-LocalGroupMember "Administrators"} `Get-IscsiTarget | fl` \ `Disconnect-IscsiTarget -NodeAddress ″iqn.1995-05.com.microsoft:srv2-iscsi-target-2-target″ -Confirm:$false` отключиться -# ComObject - -`$wshell = New-Object -ComObject Wscript.Shell` \ -`$wshell | Get-Member` \ -`$link = $wshell.CreateShortcut("$Home\Desktop\Яндекс.lnk")` создать ярлык \ -`$link.TargetPath = "https://yandex.ru"` куда ссылается (метод TargetPath объекта $link где хранится дочерний объект CreateShortcut) \ -`$link.Save()` сохранить \ -`(New-Object -ComObject wscript.shell).SendKeys([char]173)` включить/выключить звук - -`$wshell.Exec("notepad.exe")` запустить приложение \ -`$wshell.AppActivate("Блокнот")` развернуть запущенное приложение \ -`sleep -Milliseconds 500` \ -`$wshell.SendKeys("%")` ALT \ -`$wshell.SendKeys("{ENTER}")` \ -`$wshell.SendKeys("{DOWN}")` \ -`$wshell.SendKeys("{DOWN}")` \ -`$wshell.SendKeys("{ENTER}")` \ -`Set-WinUserLanguageList -LanguageList en-us,ru -Force` изменить языковую раскладку клавиатуры \ -`$wshell.SendKeys("login")` - -`$wshell = New-Object -ComObject Wscript.Shell` \ -`$output = $wshell.Popup("Выберите действие?",0,"Заголовок",4)` \ -`if ($output -eq 6) {"yes"} elseif ($output -eq 7) {"no"} else {"no good"}` - -`Type:` \ -`0` ОК \ -`1` ОК и Отмена \ -`2` Стоп, Повтор, Пропустить \ -`3` Да, Нет, Отмена \ -`4` Да и Нет \ -`5` Повтор и Отмена \ -`16` Stop \ -`32` Question \ -`48` Exclamation \ -`64` Information - -`Output:` \ -`-1` Timeout \ -`1` ОК \ -`2` Отмена \ -`3` Стоп \ -`4` Повтор \ -`5` Пропустить \ -`6` Да \ -`7` Нет - # WMI ### WMI/CIM (Windows Management Instrumentation/Common Information Model) @@ -763,7 +736,11 @@ icm $_ {Get-LocalGroupMember "Administrators"} `gwmi -list -Namespace root\CIMV2\Terminalservices` \ `(gwmi -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).AllowTSConnections` \ `(gwmi -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).SetAllowTSConnections(1)` включить RDP \ -`(Get-WmiObject win32_battery).estimatedChargeRemaining` заряд батареи в процентах +`(Get-WmiObject win32_battery).estimatedChargeRemaining` заряд батареи в процентах \ +`gwmi Win32_UserAccount` доменные пользователи \ +`(gwmi Win32_SystemUsers).PartComponent` \ +`Get-CimInstance -ClassName Win32_LogonSession` \ +`Get-CimInstance -ClassName Win32_BIOS` ``` $srv = "localhost" gwmi Win32_logicalDisk -ComputerName $srv | where {$_.Size -ne $null} | select @{ @@ -800,12 +777,21 @@ Label="Value"; Expression={$_.DeviceID}}, @{Label="AllSize"; Expression={ `Import-Module ActiveDirectory` \ `Get-Command -Module ActiveDirectory` -### LDAP (Lightweight Directory Access Protocol) -`$ldapsearcher = New-Object System.DirectoryServices.DirectorySearcher` \ +### ADSI (Active Directory Service Interface) `$d0 = $env:userdnsdomain` \ `$d0 = $d0 -split "\."` \ `$d1 = $d0[0]` \ `$d2 = $d0[1]` \ +`$group = [ADSI]"LDAP://OU=Domain Controllers,DC=$d1,DC=$d2"` \ +`$group | select *` + +`$Local_User = [ADSI]"WinNT://./Администратор,user"` \ +`$Local_User | Get-Member` \ +`$Local_User.Description` \ +`$Local_User.LastLogin` время последней авторизации локального пользователя + +### LDAP (Lightweight Directory Access Protocol) +`$ldapsearcher = New-Object System.DirectoryServices.DirectorySearcher` \ `$ldapsearcher.SearchRoot = "LDAP://OU=Domain Controllers,DC=$d1,DC=$d2"` \ `$ldapsearcher.Filter = "(objectclass=computer)"` \ `$dc = $ldapsearcher.FindAll().path` @@ -1057,7 +1043,12 @@ Error: 1722 - сервер rpc недоступен (ошибка отката `Install-WindowsFeature -Name DNS` установить роль \ `Get-Command *DNS*` \ `Get-DnsServerSetting -ALL` \ -`Uninstall-WindowsFeature -Name DNS` +`Uninstall-WindowsFeature -Name DNS` удалить роль + +### PSWA +`Install-WindowsFeature -Name WindowsPowerShellWebAccess -IncludeManagementTools` \ +`Install-PswaWebApplication -UseTestCertificate` Создать веб-приложение /pswa \ +`Add-PswaAuthorizationRule -UserGroupName "$domain\Domain Admins" -ComputerName * -ConfigurationName * -RuleName "For Admins"` добавить права авторизации ### WSB (Windows Server Backup) При создании backup DC через WSB, создается копия состояния системы (System State), куда попадает база AD (NTDS.DIT), объекты групповых политик, содержимое каталога SYSVOL, реестр, метаданные IIS, база AD CS, и другие системные файлы и ресурсы. Резервная копия создается через службу теневого копирования VSS. \ @@ -1071,7 +1062,18 @@ $WBadmin_cmd = "wbadmin.exe START BACKUP -backupTarget:$TargetUNC -systemState - # $WBadmin_cmd = "wbadmin start backup -backuptarget:$path -include:C:\Windows\NTDS\ntds.dit -quiet" # Backup DB NTDS Invoke-Expression $WBadmin_cmd ``` -### DNS +### RDS +`Get-Command -Module RemoteDesktop` \ +`Get-RDServer -ConnectionBroker $broker` список всех серверов в фермеы, указывается полное доменное имя при обращение к серверу с ролью RDCB \ +`Get-RDRemoteDesktop -ConnectionBroker $broker` список коллекций \ +`(Get-RDLicenseConfiguration -ConnectionBroker $broker | select *).LicenseServer` список серверов с ролью RDL \ +`Get-RDUserSession -ConnectionBroker $broker` список всех активных пользователей \ +`Disconnect-RDUser -HostServer $srv -UnifiedSessionID $id -Force` отключить сессию пользователя \ +`Get-RDAvailableApp -ConnectionBroker $broker -CollectionName C03` список установленного ПО на серверах в коллекции \ +`(Get-RDSessionCollectionConfiguration -ConnectionBroker $broker -CollectionName C03 | select *).CustomRdpProperty` use redirection server name:i:1 \ +`Get-RDConnectionBrokerHighAvailability` + +# DNS ``` $zone = icm $srv {Get-DnsServerZone} | select ZoneName,ZoneType,DynamicUpdate,ReplicationScope,SecureSecondaries, DirectoryPartitionName | Out-GridView -Title "DNS Server: $srv" –PassThru @@ -1104,7 +1106,7 @@ $TextA = "$FQDN IN A $IP" [Void]$DNSRR.CreateInstanceFromTextRepresentation($DNSServer,$DNSFZone,$TextA) } ``` -### DHCP +# DHCP ``` $mac = icm $srv -ScriptBlock {Get-DhcpServerv4Scope | Get-DhcpServerv4Lease} | select AddressState, HostName,IPAddress,ClientId,DnsRegistration,DnsRR,ScopeId,ServerIP | Out-GridView -Title "HDCP Server: $srv" –PassThru @@ -1112,18 +1114,8 @@ HostName,IPAddress,ClientId,DnsRegistration,DnsRR,ScopeId,ServerIP | Out-GridVie ``` `Add-DhcpServerv4Reservation -ScopeId 192.168.1.0 -IPAddress 192.168.1.10 -ClientId 00-50-56-C0-00-08 -Description "new reservation"` -### RDS -`Get-Command -Module RemoteDesktop` \ -`Get-RDServer -ConnectionBroker $broker` список всех серверов в фермеы, указывается полное доменное имя при обращение к серверу с ролью RDCB \ -`Get-RDRemoteDesktop -ConnectionBroker $broker` список коллекций \ -`(Get-RDLicenseConfiguration -ConnectionBroker $broker | select *).LicenseServer` список серверов с ролью RDL \ -`Get-RDUserSession -ConnectionBroker $broker` список всех активных пользователей \ -`Disconnect-RDUser -HostServer $srv -UnifiedSessionID $id -Force` отключить сессию пользователя \ -`Get-RDAvailableApp -ConnectionBroker $broker -CollectionName C03` список установленного ПО на серверах в коллекции \ -`(Get-RDSessionCollectionConfiguration -ConnectionBroker $broker -CollectionName C03 | select *).CustomRdpProperty` use redirection server name:i:1 \ -`Get-RDConnectionBrokerHighAvailability` +# DFS -### DFSR `dfsutil /root:\\domain.sys\public /export:C:\export-dfs.txt` экспорт конфигурации namespace root \ `dfsutil /AddFtRoot /Server:\\$srv /Share:public` на новой машине предварительно создать корень на основе домена \ `dfsutil /root:\\domain.sys\public /import:C:\export-dfs.txt / $Image = [Drawing.Bitmap]::FromStream([IO.MemoryStream][Convert]::FromBase64String($Base64img)) $Image.Save("$home\Desktop\YaLogo.jpg") ``` -# Console API +# IE -`[Console] | Get-Member -Static` \ -`[Console]::BackgroundColor = "Blue"` +`$ie.document.IHTMLDocument3_getElementsByTagName("input") | select name` получить имена всех Input Box \ +`$ie.document.IHTMLDocument3_getElementsByTagName("button") | select innerText` получить имена всех Button \ +`$ie.Document.documentElement.innerHTML` прочитать сырой Web Content (