PS-Commands/index.html
2024-03-01 17:54:02 +03:00

8106 lines
923 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>README</title>
<style>
html {
color: #1a1a1a;
background-color: #fdfdfd;
}
body {
margin: 0 auto;
max-width: 36em;
padding-left: 50px;
padding-right: 50px;
padding-top: 50px;
padding-bottom: 50px;
hyphens: auto;
overflow-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
}
@media (max-width: 600px) {
body {
font-size: 0.9em;
padding: 12px;
}
h1 {
font-size: 1.8em;
}
}
@media print {
html {
background-color: white;
}
body {
background-color: transparent;
color: black;
font-size: 12pt;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3, h4 {
page-break-after: avoid;
}
}
p {
margin: 1em 0;
}
a {
color: #1a1a1a;
}
a:visited {
color: #1a1a1a;
}
img {
max-width: 100%;
}
svg {
height: auto;
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 1.4em;
}
h5, h6 {
font-size: 1em;
font-style: italic;
}
h6 {
font-weight: normal;
}
ol, ul {
padding-left: 1.7em;
margin-top: 1em;
}
li > ol, li > ul {
margin-top: 0;
}
blockquote {
margin: 1em 0 1em 1.7em;
padding-left: 1em;
border-left: 2px solid #e6e6e6;
color: #606060;
}
code {
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
font-size: 85%;
margin: 0;
hyphens: manual;
}
pre {
margin: 1em 0;
overflow: auto;
}
pre code {
padding: 0;
overflow: visible;
overflow-wrap: normal;
}
.sourceCode {
background-color: transparent;
overflow: visible;
}
hr {
background-color: #1a1a1a;
border: none;
height: 1px;
margin: 1em 0;
}
table {
margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
display: block;
font-variant-numeric: lining-nums tabular-nums;
}
table caption {
margin-bottom: 0.75em;
}
tbody {
margin-top: 0.5em;
border-top: 1px solid #1a1a1a;
border-bottom: 1px solid #1a1a1a;
}
th {
border-top: 1px solid #1a1a1a;
padding: 0.25em 0.5em 0.25em 0.5em;
}
td {
padding: 0.125em 0.5em 0.25em 0.5em;
}
header {
margin-bottom: 4em;
text-align: center;
}
#TOC li {
list-style: none;
}
#TOC ul {
padding-left: 1.3em;
}
#TOC > ul {
padding-left: 0;
}
#TOC a:not(:hover) {
text-decoration: none;
}
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
/* The extra [class] is a hack that increases specificity enough to
override a similar rule in reveal.js */
ul.task-list[class]{list-style: none;}
ul.task-list li input[type="checkbox"] {
font-size: inherit;
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
/* CSS for syntax highlighting */
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { display: inline-block; text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { color: #008000; } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { color: #008000; font-weight: bold; } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
</style>
</head>
<body>
<figure>
<img
src="https://github.com/Lifailon/PS-Commands/blob/rsa/Logo/PowerShell-Commands.png"
alt="Image alt" />
<figcaption aria-hidden="true">Image alt</figcaption>
</figure>
<p><img
src="https://img.shields.io/github/languages/top/lifailon/PS-Commands"
alt="GitHub top language" /> <img
src="https://img.shields.io/github/last-commit/lifailon/PS-Commands"
alt="GitHub last commit (by committer)" /> <img
src="https://img.shields.io/github/languages/code-size/lifailon/PS-Commands"
alt="GitHub code size in bytes" /> <img
src="https://img.shields.io/github/stars/Lifailon/PS-Commands"
alt="GitHub Repo stars" /></p>
<p>?? Habr: <a href="https://habr.com/ru/articles/782592/">PowerShell и
его возможности</a></p>
<ul>
<li><a href="#help">Help</a></li>
<li><a href="#object">Object</a></li>
<li><a href="#npp">npp</a></li>
<li><a href="#regex">Regex</a></li>
<li><a href="#datatype">DataType</a></li>
<li><a href="#bit">Bit</a></li>
<li><a href="#files">Files</a></li>
<li><a href="#credential">Credential</a></li>
<li><a href="#winevent">WinEvent</a></li>
<li><a href="#firewall">Firewall</a></li>
<li><a href="#defender">Defender</a></li>
<li><a href="#windowsupdate">WindowsUpdate</a></li>
<li><a href="#dism">DISM</a></li>
<li><a href="#scheduled">Scheduled</a></li>
<li><a href="#network">Network</a></li>
<li><a href="#rdp">RDP</a></li>
<li><a href="#shutdown">Shutdown</a></li>
<li><a href="#localaccounts">LocalAccounts</a></li>
<li><a href="#smb">SMB</a></li>
<li><a href="#activedirectory">ActiveDirectory</a></li>
<li><a href="#repadmin">repadmin</a></li>
<li><a href="#dcdiag">dcdiag</a></li>
<li><a href="#ntdsutil">ntdsutil</a></li>
<li><a href="#gpo">GPO</a></li>
<li><a href="#servermanager">ServerManager</a></li>
<li><a href="#dnsserver">DNS</a></li>
<li><a href="#dhcpserver">DHCP</a></li>
<li><a href="#dfs">DFS</a></li>
<li><a href="#storagereplica">StorageReplica</a></li>
<li><a href="#ps2exe">PS2EXE</a></li>
<li><a href="#nssm">NSSM</a></li>
<li><a href="#jobs">Jobs</a></li>
<li><a href="#smtp">SMTP</a></li>
<li><a href="#hyper-v">Hyper-V</a></li>
<li><a href="#vmwarepowercli">VMWare/PowerCLI</a></li>
<li><a href="#exchangeemshell">Exchange/EMShell</a></li>
<li><a href="#truenas">TrueNAS</a></li>
<li><a href="#veeam">Veeam</a></li>
<li><a href="#rest-api">REST API</a></li>
<li><a href="#pode">Pode</a></li>
<li><a href="#selenium">Selenium</a></li>
<li><a href="#ie">IE</a></li>
<li><a href="#com">COM</a></li>
<li><a href="#dotnet">dotNET</a></li>
<li><a href="#console-api">Console API</a></li>
<li><a href="#drawing">Drawing</a></li>
<li><a href="#objectevent">ObjectEvent</a></li>
<li><a href="#sockets">Sockets</a></li>
<li><a href="#excel">Excel</a></li>
<li><a href="#csv">CSV</a></li>
<li><a href="#xml">XML</a></li>
<li><a href="#json">JSON</a></li>
<li><a href="#yaml">YAML</a></li>
<li><a href="#html">HTML</a></li>
<li><a href="#sqlite">SQLite</a></li>
<li><a href="#mysql">MySQL</a></li>
<li><a href="#mssql">MSSQL</a></li>
<li><a href="#influxdb">InfluxDB</a></li>
<li><a href="#telegraf">Telegraf</a></li>
<li><a href="#elasticsearch">Elasticsearch</a></li>
<li><a href="#cdata">CData</a></li>
<li><a href="#odbc">ODBC</a></li>
<li><a href="#postgresql">PostgreSQL</a></li>
<li><a href="#wmi">WMI</a></li>
<li><a href="#regedit">Regedit</a></li>
<li><a href="#performance">Performance</a></li>
<li><a href="#snmp">SNMP</a></li>
<li><a href="#zabbix">Zabbix</a></li>
<li><a href="#pki">pki</a></li>
<li><a href="#openssl">OpenSSL</a></li>
<li><a href="#openvpn">OpenVPN</a></li>
<li><a href="#route">Route</a></li>
<li><a href="#nat">NAT</a></li>
<li><a href="#wireguard">WireGuard</a></li>
<li><a href="#vpnclient">VpnClient</a></li>
<li><a href="#proxy">Proxy</a></li>
<li><a href="#openssh">OpenSSH</a></li>
<li><a href="#winrm">WinRM</a></li>
<li><a href="#packagemanagement">PackageManagement</a></li>
<li><a href="#nuget">NuGet</a></li>
<li><a href="#git">Git</a></li>
<li><a href="#dsc">DSC</a></li>
<li><a href="#ansible">Ansible</a></li>
<li><a href="#GigaChat">GigaChat</a></li>
<li><a href="#YandexGPT">YandexGPT</a></li>
<li><a href="#superagi">SuperAGI</a></li>
<li><a href="#replicate">Replicate</a></li>
<li><a href="#google-api">Google-API</a></li>
<li><a href="#rapidapi">RapidAPI</a></li>
<li><a href="#tmdb">TMDB</a></li>
<li><a href="#ivi">ivi</a></li>
<li><a href="#kinopoisk">Kinopoisk</a></li>
<li><a href="#videocdn">VideoCDN</a></li>
<li><a href="#telegram">Telegram</a></li>
<li><a href="#discord">Discord</a></li>
<li><a href="#oh-my-posh">oh-my-posh</a></li>
<li><a href="#pester">Pester</a></li>
<li><a href="#ffmpeg">FFmpeg</a></li>
<li><a href="#pandoc">Pandoc</a></li>
</ul>
<h1 id="help">Help</h1>
<p><code>Get-Verb</code> действия/глаголы, утвержденные для
использования в командлетах<br />
<code>Get-Command *Language*</code> поиск команды по имени<br />
<code>(Get-Command Get-Language).Module</code> узнать к какому модулю
принадлежит команда<br />
<code>Get-Command Get-Content | fl Module,DLL</code> узнать
принадлежность команды к модулю и dll<br />
<code>Get-Command -Module LanguagePackManagement</code> отобразить
список команд указанного модуля<br />
<code>(Get-Module LanguagePackManagement).ExportedCommands.Values</code>
отобразить список команд указанного модуля<br />
<code>Get-Language | Get-Member</code> отобразить список методов команды
(действия), объекты вывода и Event (события объектов: Click)<br />
<code>(Get-Help Get-Service).Aliases</code> узнать псевдонимом
команды<br />
<code>Get-Alias gsv</code> узнать имя команды по псевдониму<br />
<code>Get-Help Get-Service</code> синтаксис<br />
<code>Get-Help Get-Service -Parameter *</code> описание всех
параметров<br />
<code>Get-Help Get-Service -Online</code><br />
<code>Get-Help Get-Service -ShowWindow</code> описание параметров в GUI
с фильтрацией<br />
<code>Show-Command</code> вывести список команд в GUI<br />
<code>Show-Command Get-Service</code> список параметров команды в
GUI<br />
<code>Invoke-Expression</code> iex принимает текст для выполнения в
консоли как команды<br />
<code>$PSVersionTable</code> версия PowerShell<br />
<code>Set-ExecutionPolicy Unrestricted</code><br />
<code>Get-ExecutionPolicy</code><br />
<code>$Metadata = New-Object System.Management.Automation.CommandMetaData (Get-Command Get-Service)</code>
получить информацию о командлете<br />
<code>[System.Management.Automation.ProxyCommand]::Create($Metadata)</code>
исходный код функции</p>
<h1 id="object">Object</h1>
<h3 id="variable">Variable</h3>
<p><code>$var = Read-Host "Enter"</code> ручной ввод<br />
<code>$pass = Read-Host "Enter Password" -AsSecureString</code> скрывать
набор<br />
<code>$global:path = "\\path"</code> задать глобальную переменную,
например в функции<br />
<code>$using:srv</code> использовать переменную текущей сесси в
Invoke-сессии<br />
<code>Get-Variable</code> отобразить все переменные<br />
<code>ls variable:/</code> отобразить все переменные<br />
<code>Get-Variable *srv*</code> найти переменную по имени<br />
<code>Get-Variable -Scope Global</code> отобразить все глобальные
переменные<br />
<code>Get-Variable Error</code> последняя команда с ошибкой<br />
<code>Remove-Variable -Name *</code> очистить все переменные<br />
<code>$LASTEXITCODE</code> содержит код вывода последней запущенной
программы, например ping. Если код возврата положительный (True), то
$LastExitCode = 0</p>
<h3 id="env">ENV</h3>
<p><code>Get-ChildItem Env:</code> отобразить все переменные
окружения<br />
<code>$env:PSModulePath</code> директории импорта модулей<br />
<code>$env:userprofile</code><br />
<code>$env:computername</code><br />
<code>$env:username</code><br />
<code>$env:userdnsdomain</code><br />
<code>$env:logonserver</code><br />
<code>([DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).Name</code><br />
<code>[Environment]::GetFolderPath('ApplicationData')</code></p>
<h3 id="history">History</h3>
<p><code>Get-History</code> история команд текущей сессии<br />
<code>(Get-History)[-1].Duration.TotalSeconds</code> время выполнения
последней команды<br />
<code>(Get-PSReadLineOption).HistorySavePath</code> путь к сохраненному
файлу с 4096 последних команд (из модуля PSReadLine)<br />
<code>Get-Content (Get-PSReadlineOption).HistorySavePath | Select-String Get</code>
поиск по содержимому файла (GREP)<br />
<code>Set-PSReadlineOption -MaximumHistoryCount 10000</code> изменить
количество сохраняемых команд в файл<br />
<code>Get-PSReadLineOption | select MaximumHistoryCount</code><br />
<code>Set-PSReadlineOption -HistorySaveStyle SaveNothing</code>
отключить ведение журнала<br />
<code>F2</code> переключиться с InlineView на ListView</p>
<h3 id="clipboard">Clipboard</h3>
<p><code>Set-Clipboard $srv</code> скопировать в буфер обмена<br />
<code>Get-Clipboard</code> вставить</p>
<h3 id="write">Write</h3>
<p><code>Write-Host -ForegroundColor Black -BackgroundColor Green "Test" -NoNewline</code><br />
<code>Write-Error Test</code><br />
<code>Foreach ($n in 1..100) {Write-Progress -Activity "Test Progress" -PercentComplete $n}</code></p>
<h3 id="array">Array</h3>
<p><code>$srv = @("server-01", "server-02")</code> создать массив<br />
<code>$srv += @("server-03")</code> добавить в массив новый
элемент<br />
<code>$srv.Count</code> отобразить кол-во элементов в массиве<br />
<code>Out-String</code> построчный вывод</p>
<h3 id="index">Index</h3>
<p><code>$srv[0]</code> вывести первое значение элемента массива<br />
<code>$srv[0] = Name</code> замена элемента в массиве<br />
<code>$srv[0].Length</code> узнать кол-во символов первого значения в
массиве<br />
<code>$srv[10..100]</code> срез</p>
<div class="sourceCode" id="cb1"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="va">$array</span> <span class="op">=</span> <span class="st">&quot;a&quot;</span><span class="op">,</span><span class="st">&quot;b&quot;</span><span class="op">,</span><span class="st">&quot;c&quot;</span><span class="op">,</span><span class="st">&quot;d&quot;</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="va">$num</span> <span class="op">=</span> <span class="dv">0</span></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="dt">foreach</span> <span class="op">(</span><span class="va">$a</span> <span class="kw">in</span> <span class="va">$array</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="va">$num</span> <span class="op">+=</span> <span class="dv">1</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="va">$index</span> <span class="op">=</span> <span class="op">[</span>array<span class="op">]::</span>IndexOf<span class="op">(</span><span class="va">$array</span><span class="op">,</span> <span class="va">$a</span><span class="op">)</span> <span class="co"># узнать номер индекса по зачению</span></span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a><span class="va">$array</span><span class="op">[</span><span class="va">$index</span><span class="op">]</span> <span class="op">=</span> <span class="va">$num</span> <span class="co"># пересобрать исходный массив</span></span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<h3 id="hashtable">HashTable</h3>
<div class="sourceCode" id="cb2"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="va">$hashtable</span> <span class="op">=</span> @<span class="op">{</span><span class="st">&quot;User&quot;</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$env</span><span class="op">:</span><span class="va">username</span><span class="st">&quot;</span><span class="op">;</span> <span class="st">&quot;Server&quot;</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$env</span><span class="op">:</span><span class="va">computername</span><span class="st">&quot;</span><span class="op">}</span> <span class="co"># создать</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="va">$hashtable</span> <span class="op">+=</span> @<span class="op">{</span><span class="st">&quot;User2&quot;</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$env</span><span class="op">:</span><span class="va">username</span><span class="st">&quot;</span><span class="op">;</span> <span class="st">&quot;Server2&quot;</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$env</span><span class="op">:</span><span class="va">computername</span><span class="st">&quot;</span><span class="op">}</span> <span class="co"># добавить ключи</span></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="va">$hashtable</span><span class="op">.</span><span class="fu">Keys</span> <span class="co"># список всех ключей</span></span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="va">$hashtable</span><span class="op">[</span><span class="st">&quot;User&quot;</span><span class="op">]</span> <span class="co"># получить значение (Values) по ключу</span></span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a><span class="va">$hashtable</span><span class="op">[</span><span class="st">&quot;User&quot;</span><span class="op">]</span> <span class="op">=</span> <span class="st">&quot;Test&quot;</span> <span class="co"># изменить</span></span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a><span class="va">$hashtable</span><span class="op">.</span><span class="fu">Remove</span><span class="op">(</span><span class="st">&quot;User&quot;</span><span class="op">)</span> <span class="co"># удалить ключ</span></span></code></pre></div>
<p><code>$Tag = @{$true = 'dev'; $false = 'prod'}[([System.Net.Dns]::GetHostEntry("localhost").HostName) -match '.*.TestDomain$']</code></p>
<h3 id="collectionslist">Collections/List</h3>
<div class="sourceCode" id="cb3"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Collections</span><span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>System<span class="op">.</span><span class="fu">Object</span><span class="op">]</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span><span class="op">.</span><span class="fu">Add</span><span class="op">([</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span>User <span class="op">=</span> <span class="va">$env</span><span class="op">:</span><span class="va">username</span><span class="op">;</span> Server <span class="op">=</span> <span class="va">$env</span><span class="op">:</span><span class="va">computername</span><span class="op">})</span></span></code></pre></div>
<h3 id="pscustomobject">PSCustomObject</h3>
<div class="sourceCode" id="cb4"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="va">$CustomObject</span> <span class="op">=</span> <span class="op">[</span>PSCustomObject<span class="op">][</span>ordered<span class="op">]</span>@<span class="op">{</span>User <span class="op">=</span> <span class="va">$env</span><span class="op">:</span><span class="va">username</span><span class="op">;</span> Server <span class="op">=</span> <span class="va">$env</span><span class="op">:</span><span class="va">computername</span><span class="op">}</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="va">$CustomObject</span> <span class="op">|</span> <span class="fu">Add-Member</span> MemberType NoteProperty Name Arr Value <span class="op">@(</span><span class="dv">1</span><span class="op">,</span><span class="dv">2</span><span class="op">,</span><span class="dv">3</span><span class="op">)</span> <span class="co"># добавить Property (свойство/стобец)</span></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a><span class="va">$CustomObject</span><span class="op">.</span><span class="fu">Arr</span> <span class="op">=</span> <span class="op">@(</span><span class="dv">1</span><span class="op">,</span><span class="dv">3</span><span class="op">,</span><span class="dv">5</span><span class="op">)</span> <span class="co"># изменить содержимое</span></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a><span class="va">$CustomObject</span><span class="op">.</span><span class="fu">PsObject</span><span class="op">.</span><span class="fu">Properties</span><span class="op">.</span><span class="fu">Remove</span><span class="op">(</span><span class="st">&#39;User&#39;</span><span class="op">)</span> <span class="co"># удалить Property</span></span></code></pre></div>
<h3 id="add-member">Add-Member</h3>
<div class="sourceCode" id="cb5"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="va">$ScriptBlock</span> <span class="op">=</span> <span class="op">{</span><span class="fu">Get-Service</span><span class="op">}</span></span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a><span class="va">$CustomObject</span> <span class="op">|</span> <span class="fu">Add-Member</span> <span class="op">-</span>Name <span class="st">&quot;TestMethod&quot;</span> <span class="op">-</span>MemberType ScriptMethod <span class="op">-</span>Value <span class="va">$ScriptBlock</span> <span class="co"># Добавить Method</span></span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a><span class="va">$CustomObject</span> <span class="op">|</span> <span class="fu">Get-Member</span></span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true" tabindex="-1"></a><span class="va">$CustomObject</span><span class="op">.</span><span class="fu">TestMethod</span><span class="op">()</span></span></code></pre></div>
<h3 id="class">Class</h3>
<div class="sourceCode" id="cb6"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="cf">Class</span> CustomClass <span class="op">{</span></span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$User</span></span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$Server</span></span>
<span id="cb6-4"><a href="#cb6-4" aria-hidden="true" tabindex="-1"></a><span class="fu">Start</span><span class="op">([</span><span class="dt">bool</span><span class="op">]</span><span class="va">$Param1</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb6-5"><a href="#cb6-5" aria-hidden="true" tabindex="-1"></a><span class="cf">If</span> <span class="op">(</span><span class="va">$Param1</span><span class="op">)</span> <span class="op">{</span><span class="fu">Write-Host</span> <span class="st">&quot;Start Function&quot;</span><span class="op">}}</span></span>
<span id="cb6-6"><a href="#cb6-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb6-7"><a href="#cb6-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb6-8"><a href="#cb6-8" aria-hidden="true" tabindex="-1"></a><span class="va">$Class</span> <span class="op">=</span> <span class="fu">New-Object</span> <span class="op">-</span>TypeName CustomClass</span>
<span id="cb6-9"><a href="#cb6-9" aria-hidden="true" tabindex="-1"></a><span class="va">$Class</span><span class="op">.</span><span class="fu">User</span> <span class="op">=</span> <span class="va">$env</span><span class="op">:</span><span class="va">username</span></span>
<span id="cb6-10"><a href="#cb6-10" aria-hidden="true" tabindex="-1"></a><span class="va">$Class</span><span class="op">.</span><span class="fu">Server</span> <span class="op">=</span> <span class="va">$env</span><span class="op">:</span><span class="va">computername</span></span>
<span id="cb6-11"><a href="#cb6-11" aria-hidden="true" tabindex="-1"></a><span class="va">$Class</span><span class="op">.</span><span class="fu">Start</span><span class="op">(</span><span class="dv">1</span><span class="op">)</span></span></code></pre></div>
<h3 id="pipeline">Pipeline</h3>
<p><code>$obj | Add-Member -MemberType NoteProperty -Name "Type" -Value "user" -Force</code>
добавление объкта вывода NoteProperty<br />
<code>$obj | Add-Member -MemberType NoteProperty -Name "User" -Value "admin" -Force</code>
изменеие содержимого для сущности объекта User<br />
<code>ping $srv | Out-Null</code> перенаправить результат вывода в
Out-Null</p>
<h3 id="select-object">Select-Object</h3>
<p><code>Get-Process | Select-Object -Property *</code> отобразить все
доступные объекты вывода<br />
<code>Get-Process | select -Unique "Name"</code> удалить повторяющиеся
значения в массиве<br />
<code>Get-Process | select -ExpandProperty ProcessName</code>
преобразовать из объекта-коллекции в массив (вывести содержимое без
наименовая столбца)<br />
<code>(Get-Process | ? Name -match iperf).Modules</code> список
используемых модулей процессом</p>
<h3 id="expression">Expression</h3>
<div class="sourceCode" id="cb7"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="fu">ps</span> <span class="op">|</span> <span class="fu">Sort-Object</span> <span class="op">-</span>Descending CPU <span class="op">|</span> <span class="fu">select</span> <span class="op">-</span>first <span class="dv">10</span> ProcessName<span class="op">,</span> <span class="co"># сортировка по CPU, вывести первых 10 значений (-first)</span></span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a>@<span class="op">{</span>Name<span class="op">=</span><span class="st">&quot;ProcessorTime&quot;</span><span class="op">;</span> Expression<span class="op">={</span><span class="va">$_</span><span class="op">.</span><span class="fu">TotalProcessorTime</span> <span class="op">-replace</span> <span class="st">&quot;\.\d+$&quot;</span><span class="op">}},</span> <span class="co"># затрачено процессорного времени в минутах</span></span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a>@<span class="op">{</span>Name<span class="op">=</span><span class="st">&quot;Memory&quot;</span><span class="op">;</span> Expression<span class="op">={[</span><span class="dt">string</span><span class="op">]([</span><span class="dt">int</span><span class="op">](</span><span class="va">$_</span><span class="op">.</span><span class="fu">WS</span> <span class="op">/</span> <span class="dv">1024</span><span class="dt">kb</span><span class="op">))+</span><span class="st">&quot;MB&quot;</span><span class="op">}},</span> <span class="co"># делим байты на КБ</span></span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a>@<span class="op">{</span>Label<span class="op">=</span><span class="st">&quot;RunTime&quot;</span><span class="op">;</span> Expression<span class="op">={((</span><span class="fu">Get-Date</span><span class="op">)</span> <span class="op">-</span> <span class="va">$_</span><span class="op">.</span><span class="fu">StartTime</span><span class="op">)</span> <span class="op">-replace</span> <span class="st">&quot;\.\d+$&quot;</span><span class="op">}}</span> <span class="co"># вычесть из текущего времени - время запуска, и удалить milisec</span></span></code></pre></div>
<h3 id="select-string">Select-String</h3>
<p><code>$(ipconfig | Select-String IPv4) -replace ".+: " | Where-Object {$_ -match "^172."}</code>
узнать только IP<br />
<code>$Current_IP = Get-Content $RDCMan_RDG_PATH | Select-String $RDCMan_Display_Name -Context 0,1</code>
получить две строки<br />
<code>$Current_IP = $Current_IP.Context.DisplayPostContext[0] -replace ".+&lt;name&gt;|&lt;\/name&gt;"</code>
забрать только вторую строку и удалить тэги</p>
<h3 id="format-tableformat-list">Format-Table/Format-List</h3>
<p><code>Get-Process | ft ProcessName, StartTime -Autosize</code>
автоматическая группировка размера столбцов</p>
<h3 id="measure-object">Measure-Object</h3>
<p><code>Get-Process | Measure | select Count</code> кол-во
объектов<br />
<code>Get-Process | Measure -Line -Word -Character</code> кол-во строк,
слов и Char объектов<br />
<code>Get-Process | Measure-Object PM -sum | Select-Object Count,@{Name="MEM_MB"; Expression={[int]($_.Sum/1mb)}}</code>
кол-во процессов и общий объем занятой памяти в МБайт</p>
<h3 id="compare-object">Compare-Object</h3>
<p><code>Compare-Object -ReferenceObject (Get-Content -Path .\file1.txt) -DifferenceObject (Get-Content -Path .\file2.txt)</code>
сравнение двух файлов<br />
<code>$group1 = Get-ADGroupMember -Identity "Domain Admins"</code><br />
<code>$group2 = Get-ADGroupMember -Identity "Enterprise Admins"</code><br />
<code>Compare-Object -ReferenceObject $group1 -DifferenceObject $group2 -IncludeEqual</code>
<code>==</code> нет изменений<br />
<code>&lt;=</code> есть изменения в $group1<br />
<code>=&gt;</code> есть изменения в $group2</p>
<h3 id="where-object">Where-Object (?)</h3>
<p><code>Get-Process | Where-Object {$_.ProcessName -match "zabbix"}</code>
фильтрация/поиск процессов по имени свойства объекта<br />
<code>Get-Process | where CPU -gt 10 | Sort-Object -Descending CPU</code>
вывести объекты, где значения CPU больше 10<br />
<code>Get-Process | where WS -gt 200MB</code> отобразить процессы где WS
выше 200МБ<br />
<code>Get-Service | where Name -match "zabbix"</code> поиск службы<br />
<code>Get-Service -ComputerName $srv | Where {$_.Name -match "WinRM"} | Restart-Service</code>
перезапустить службу на удаленном компьютере<br />
<code>(Get-Service).DisplayName</code> вывести значения свойства
массива<br />
<code>netstat -an | where {$_ -match 443}</code><br />
<code>netstat -an | ?{$_ -match 443}</code><br />
<code>(netstat -an) -match 443</code></p>
<h3 id="sort-object">Sort-Object</h3>
<p><code>Get-Process | Sort-Object -Descending CPU | ft</code> обратная
(-Descending) сортировка по CPU<br />
<code>$path[-1..-10]</code> обратная сборка массива без сортировки</p>
<h3 id="lastfirst">Last/First</h3>
<p><code>Get-Process | Sort-Object -Descending CPU | select -First 10</code>
вывести первых 10 объектов<br />
<code>Get-Process | Sort-Object -Descending CPU | select -Last 10</code>
вывести последних 10 объектов</p>
<h3 id="group-object">Group-Object</h3>
<div class="sourceCode" id="cb8"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Groups</span> <span class="op">=</span> <span class="fu">Get-CimInstance</span> <span class="op">-</span>Class Win32_PnPSignedDriver <span class="op">|</span></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a><span class="fu">Select-Object</span> DriverProviderName<span class="op">,</span> FriendlyName<span class="op">,</span> Description<span class="op">,</span> DriverVersion<span class="op">,</span> DriverDate <span class="op">|</span></span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a><span class="fu">Group-Object</span> DriverProviderName<span class="op">,</span> FriendlyName<span class="op">,</span> Description<span class="op">,</span> DriverVersion<span class="op">,</span> DriverDate</span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a><span class="op">$(</span><span class="cf">foreach</span> <span class="op">(</span><span class="va">$Group</span> <span class="kw">in</span> <span class="va">$Groups</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb8-5"><a href="#cb8-5" aria-hidden="true" tabindex="-1"></a> <span class="va">$Group</span><span class="op">.</span><span class="fu">Group</span><span class="op">[</span><span class="dv">0</span><span class="op">]</span></span>
<span id="cb8-6"><a href="#cb8-6" aria-hidden="true" tabindex="-1"></a><span class="op">})</span> <span class="op">|</span> <span class="fu">Format-Table</span></span></code></pre></div>
<h1 id="npp">npp</h1>
<p><code>pwsh -NoExit -ExecutionPolicy Unrestricted -WindowStyle Maximized -File "$(FULL_CURRENT_PATH)"</code></p>
<p><code>%AppData%\Notepad++</code> themes/shortcuts.xml</p>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;
&lt;NotepadPlus&gt;
&lt;InternalCommands /&gt;
&lt;Macros&gt;
&lt;Macro name=&quot;`+\+&amp;gt;&quot; Ctrl=&quot;yes&quot; Alt=&quot;no&quot; Shift=&quot;no&quot; Key=&quot;190&quot;&gt;
&lt;Action type=&quot;0&quot; message=&quot;2453&quot; wParam=&quot;0&quot; lParam=&quot;0&quot; sParam=&quot;&quot; /&gt;
&lt;Action type=&quot;1&quot; message=&quot;2170&quot; wParam=&quot;0&quot; lParam=&quot;0&quot; sParam=&quot;`&quot; /&gt;
&lt;Action type=&quot;0&quot; message=&quot;2451&quot; wParam=&quot;0&quot; lParam=&quot;0&quot; sParam=&quot;&quot; /&gt;
&lt;Action type=&quot;0&quot; message=&quot;2451&quot; wParam=&quot;0&quot; lParam=&quot;0&quot; sParam=&quot;&quot; /&gt;
&lt;Action type=&quot;1&quot; message=&quot;2170&quot; wParam=&quot;0&quot; lParam=&quot;0&quot; sParam=&quot; &quot; /&gt;
&lt;Action type=&quot;1&quot; message=&quot;2170&quot; wParam=&quot;0&quot; lParam=&quot;0&quot; sParam=&quot;\&quot; /&gt;
&lt;Action type=&quot;0&quot; message=&quot;2300&quot; wParam=&quot;0&quot; lParam=&quot;0&quot; sParam=&quot;&quot; /&gt;
&lt;/Macro&gt;
&lt;/Macros&gt;
&lt;UserDefinedCommands&gt;
&lt;Command name=&quot;PowerShell7&quot; Ctrl=&quot;no&quot; Alt=&quot;yes&quot; Shift=&quot;no&quot; Key=&quot;116&quot;&gt;pwsh -NoExit -ExecutionPolicy Unrestricted -WindowStyle Maximized -File &amp;quot;$(FULL_CURRENT_PATH)&amp;quot;&lt;/Command&gt;
&lt;/UserDefinedCommands&gt;
&lt;PluginCommands /&gt;
&lt;ScintillaKeys /&gt;
&lt;/NotepadPlus&gt;</code></pre>
<p><code>Parsing text to Markdown:</code><br />
<code>Macros: FnLeft+'+FnRight+FnRight+\s\\+Down</code><br />
<code>Replace: "# ","'"</code></p>
<pre><code>. # Обозначает любой символ
\ # Экранирующий символ. Символы которые экранируются: ^, [, ., $, {, *, (, ), \, +, |, ?, &lt;, &gt;
^ # Начало строки
$ # Конец строки
\n # Новая строка
\d # Любая цифра
\D # Не цифра
\w # Любая буква латиницы, цифра, или знак подчёркивания
\W # Не латиница, не цифра, не подчёркивание
\s # Пробел, табуляция, перенос строки
\S # Не пробел
\b # Граница слова. Применяется когда нужно выделить, что искомые символы являются словом, а не частью другого слова
\B # Не граница слова
\&lt; # Начало слова
\&gt; # Конец слова
\A # Начало текста
\Z # Конец текста
* # Повторитель. Означает что предшествующий символ может работать 0 и более раз
+ # Количество предшествующего не менее 1-го.
? # Ограничитель. Не более одного раза
| # Или. Соединяет несколько вариантов
() # В круглые скобки заключаются все комбинации с &quot;или&quot; и поиск начала и конца строк
[ ] # В квадратных скобках задаются символы к поиску, например [a-яА-Я], или [0-9]
[^ ] # Исключает из поиска символы указанные в квадратных скобках
{ } # В фигурных скобках указывается точное количество вхождений
\d{2} # Найти две цифры
\d{2,4} # Найти две или четыре
{4,} # Найти четыре и более
^\s{1,}#.+` поиск вначале строки комментария и пробел после него 1 или больше и любое кол-во символов</code></pre>
<h1 id="regex">Regex</h1>
<p><code>-replace "1","2"</code> замена элементов в индексах массива
(везде где присутствует 1, заменить на 2), для удаления используется
только первое значение<br />
<code>-split " "</code> преобразовать строку в массив, разделителем
указан пробел, которой удаляется ($url.Split(“/”)[-1])<br />
<code>-join " "</code> преобразовать массив (коллекцию) в единую строку
(string), добавить разделителем пробел<br />
</p>
<p><code>-like *txt*</code> поиск по маскам wildcard, выводит значение
на экран<br />
<code>-match txt</code> поиска по шаблонам, проверка на соответствие
содержимого текста<br />
<code>-match "zabbix|rpc"</code> условия, для поиска по нескольким
словам<br />
<code>-NotMatch</code> проверка на отсутствие вхождения<br />
</p>
<h3 id="matches">Matches</h3>
<p><code>$ip = "192.168.10.1"</code><br />
<code>$ip -match "(\.\d{1,3})\.\d{1,2}"</code> True<br />
<code>$Matches</code> отобразить все подходящие переменные последнего
поиска, которые входят и не входят в группы ()</p>
<p><code>$String = "09/14/2017 12:00:27 - mtbill_post_201709141058.txt 7577_Delivered: OK"</code><br />
<code>$String -Match ".*(?=\.txt)" | Out-Null</code><br />
<code>$Matches[0][-4..-1] -Join ""</code></p>
<p><code>$string.Substring($string.IndexOf(".txt")-4, 4)</code> 2-й
вариант (IndexOf)`</p>
<h3 id="форматирование-.net-method-format">Форматирование (.NET method
format)</h3>
<p><code>[string]::Format("{1} {0}","Index0","Index1")</code><br />
<code>"{1} {0}" -f "Index0","Index1"</code><br />
<code>"{0:###-##-##}" -f 1234567</code> записать число в другом формате
(#)<br />
<code>"{0:0000}" -f 123</code> вывести число в формате не меньше 4
знаков (0123)<br />
<code>"{0:P0}" -f (220/1000)</code> посчитать в процентах (P)<br />
<code>"{0:P}" -f (512MB/1GB)</code> сколько % составляет 512Мб от
б<br />
<code>"{0:0.0%}" -f 0.123</code> умножить на 100%</p>
<div class="sourceCode" id="cb11"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="va">$gp</span> <span class="op">=</span> <span class="fu">Get-Process</span> <span class="op">|</span> <span class="fu">sort</span> cpu <span class="op">-</span>Descending <span class="op">|</span> <span class="fu">select</span> <span class="op">-</span>First <span class="dv">10</span></span>
<span id="cb11-2"><a href="#cb11-2" aria-hidden="true" tabindex="-1"></a><span class="dt">foreach</span> <span class="op">(</span><span class="va">$p</span> <span class="kw">in</span> <span class="va">$gp</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb11-3"><a href="#cb11-3" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;{0} - {1:N2}&quot;</span> <span class="op">-</span>f <span class="va">$p</span><span class="op">.</span><span class="fu">processname</span><span class="op">,</span> <span class="va">$p</span><span class="op">.</span><span class="fu">cpu</span> <span class="co"># округлить</span></span>
<span id="cb11-4"><a href="#cb11-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<h3 id="условный-оператор">Условный оператор</h3>
<p><code>$rh = Read-Host</code><br />
<code>if ($rh -eq 1) {ipconfig} elseif ($rh -eq 2) {getmac} else {hostname}</code><br />
Если условие if () является истенным (<span
class="math inline"><em>T</em><em>r</em><em>u</em><em>e</em>),<em>в</em><em>ы</em><em>п</em><em>о</em><em>л</em><em>н</em><em>и</em><em>т</em><em>ь</em><em>д</em><em>е</em><em>й</em><em>с</em><em>т</em><em>в</em><em>и</em><em>е</em><em>в</em> <em>Е</em><em>с</em><em>л</em><em>и</em><em>у</em><em>с</em><em>л</em><em>о</em><em>в</em><em>и</em><em>е</em><em>i</em><em>f</em>()<em>я</em><em>в</em><em>л</em><em>я</em><em>е</em><em>т</em><em>с</em><em>я</em><em>л</em><em>о</em><em>ж</em><em>н</em><em>ы</em><em>м</em>(</span>False),
выполнить действие не обязательного оператора else<br />
Условие Elseif идёт после условия if для проверки дополнительных условий
перед выполнение оператора else. Оператор, который первый вернет $True,
отменит выполнение следующих дополнительных условий<br />
Если передать переменную в условие без оператора, то будет проверяться
наличие значения у переменной на <span
class="math inline"><em>T</em><em>r</em><em>u</em><em>e</em>/</span>False<br />
<code>if ((tnc $srv -Port 80).TcpTestSucceeded) {"Opened port"} else {"Closed port"}</code></p>
<h3 id="операторы">Операторы</h3>
<p><code>-eq</code> равно (equal)<br />
<code>-ceq</code> учитывать регистр<br />
<code>-ne</code> не равно (not equal)<br />
<code>-gt</code> больше (greater)<br />
<code>-ge</code> больше или равно<br />
<code>-lt</code> меньше (less)<br />
<code>-le</code> меньше или равно<br />
<code>-in</code> проверить на наличие (5 -in @(1,2,3,4,5))<br />
<code>-NOT</code> логическое НЕТ !(Test-Path $path)<br />
<code>-and</code> логическое И<br />
<code>-or</code> логическое ИЛИ<br />
<code>if ((($1 -eq 1) -and ($2 -eq 2)) -or ($1 -ne 3)) {"$true"} else {"$false"}</code>
два условия: (если $1 = 1 и $2 = 2) или $1 не равно 3</p>
<h3 id="pipeline-operators">Pipeline Operators</h3>
<p><code>Write-Output "First" &amp;&amp; Write-Output "Second"</code>
две успешные команды выполняются<br />
<code>Write-Error "Bad" &amp;&amp; Write-Output "Second"</code> первая
команда завершается ошибкой, из-за чего вторая команда не
выполняется<br />
<code>Write-Error "Bad" || Write-Output "Second"</code> первая команда
завершается ошибкой, поэтому выполняется вторая команда<br />
<code>Write-Output "First" || Write-Output "Second"</code> первая
команда выполнена успешно, поэтому вторая команда не выполняется</p>
<h3 id="invocation-operator">Invocation Operator</h3>
<p><code>$addr = "8.8.8.8"</code><br />
<code>$ping = "ping"</code><br />
<code>&amp; $ping $addr</code> запускает текст как команду</p>
<p><code>&amp; $ping $addr &amp;</code> запустить команду в фоне<br />
<code>(Get-Job)[-1] | Receive-Job -Keep</code></p>
<h3 id="специальные-символы">Специальные символы</h3>
<p><code>\d</code> число от 0 до 9 (20-07-2022 эквивалент: “)<br />
<code>\D</code> обозначает любой символ, кроме цифры. Удаления всех
символов, кроме цифр: [int]$(”123 test” -replace “”)<br />
<code>\w</code> буква от “a” до “z” и от “A” до “Z” или число от 0 до
9<br />
<code>\s</code> пробел, эквивалент: ” ”<br />
<code>\n</code> новая строка<br />
<code>\b</code> маска, определяет начало и конец целого словосочетания
для поиска<br />
<code>.</code> обозначает любой символ, кроме новой строки<br />
<code>\</code> экранирует любой специальны символ (метасимвол).
Используется, если нужно указать конкретный символ, вместо специального
({ } [ ] /  + * . $ ^ | ?)<br />
<code>+</code> повторяется 1 и более раз (+)<br />
<code>{1,25}</code> квантификатор, указывает количество повторений
символа слева на право (от 1 до 25 раз)<br />
<code>[]</code> поиск совпадения любой буквы, например, [A-z0-9] от A до
z и цифры от 0 до 9 (“192.168.1.1” -match “192.1[6-7][0-9]”)</p>
<h3 id="якори">Якори</h3>
<p><code>^</code> или <code>\A</code> определяет начало строки. <span
class="math inline">$url -replace '^','https:'` добавить в начало; \
`$</span><code>или</code><code>обозначают конец строки. $ip -replace "\d{1,3}$","0" \</code>(?=text)<code>поиск слова слева. Пишем слева на право от искомого (ищет только целые словосочетания) "Server:\s(.{1,30})\s(?=$username)" \</code>(?&lt;=text)<code>поиск слова справа. $in_time -replace ".+(?&lt;=Last)"</code>
удалить все до слова Last<br />
<code>(?!text)</code> не совпадает со словом слева<br />
<code>(?&lt;!text)</code> не совпадает со словом справа</p>
<p><code>$test = "string"</code><br />
<code>$test -replace ".{1}$"</code> удалить любое кол-во символов в
конце строки<br />
<code>$test -replace "^.{1}"</code> удалить любое кол-во символов в
начале строки<br />
</p>
<h3 id="группы-захвата">Группы захвата</h3>
<p><code>$date = '12.31.2021'</code><br />
<code>$date -replace '^(\d{2}).(\d{2})','$2.$1'</code> поменять
местами<br />
<code>$1</code> содержимое первой группы в скобках<br />
<code>$2</code> содержимое второй группы</p>
<h1 id="datatype">DataType</h1>
<p><code>$srv.GetType()</code> узнать тип данных<br />
<code>$srv -is [string]</code> проверка на соответствие типа
данных<br />
<code>$srv -isnot [System.Object]</code> проверка на
несоответствие<br />
<code>[Object]</code> массив (BaseType:System.Array)<br />
<code>[DateTime]</code> формат времени (BaseType:System.ValueType)<br />
<code>[Bool]/[Boolean]</code> логическое значение (<span
class="math inline"><em>T</em><em>r</em><em>u</em><em>e</em>/</span>False)
или 1/0 (1 бит) наличие/отсуствие напряжения<br />
<code>[Byte]</code> 8-битное (1 байт) целое число без знака
(0..255)<br />
<code>[Int16]</code> 16-битное знаковое целое число от -32767 до 32767
(тип данных WORD 0..65535)<br />
<code>[Int]</code> 32-битное (4 байта) знаковое целое число от
2147483648 до 2147483647 (DWORD)<br />
<code>[Int64]</code> 64-битное от -9223372036854775808 до
9223372036854775808 (LWORD)<br />
<code>[Decimal]</code> 128-битное десятичное значение от
79228162514264337593543950335 до 79228162514264337593543950335<br />
<code>[Single]</code> число с плавающей запятой (32-разрядное)<br />
<code>[Double]</code> число с плавающей запятой с двойной точностью
(64-разрядное)<br />
<code>[String]</code> неизменяемая строка символов Юникода фиксированной
длины (BaseType:System.Object)</p>
<h3 id="math">Math</h3>
<p><code>[math] | Get-Member -Static</code><br />
<code>[math]::Pow(2,4)</code> 2 в 4 степени<br />
<code>[math]::Truncate(1.8)</code> грубое округление, удаляет дробную
часть<br />
<code>[math]::Ceiling(1.8)</code> округляет число в большую сторону до
ближайшего целого значения<br />
<code>[math]::Floor(-1.8)</code> округляет число в меньшую сторону<br />
<code>[math]::Min(33,22)</code> возвращает наименьшее значение двух
значений<br />
<code>[math]::Max(33,22)</code> возвращает наибольшее значение двух
значений</p>
<h3 id="round">Round</h3>
<p><code>[double]::Round(87.5, 0)</code> 88 (нечетное), в .NET по
умолчанию используется округление в средней точке ToEven, где *.5
значения округляются до ближайшего четного целого числа.<br />
<code>[double]::Round(88.5, 0)</code> 88 (четное)<br />
<code>[double]::Round(88.5, 0, 1)</code> 89 (округлять в большую
сторону)<br />
<code>[double]::Round(1234.56789, 2)</code> округлить до 2 символов
после запятой</p>
<h3 id="tostring">ToString</h3>
<p><code>(4164539/1MB).ToString("0.00")</code> разделить на дважды на
1024/1024 и округлить до 3,97</p>
<h3 id="char">Char</h3>
<p><code>[Char]</code> cимвол Юникода (16-разрядный)<br />
<code>$char = $srv.ToCharArray()</code> разбить строку [string] на
массив [System.Array] из букв<br />
</p>
<h3 id="switch">Switch</h3>
<div class="sourceCode" id="cb12"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="va">$MMM</span> <span class="op">=</span> <span class="fu">Get-Date</span> <span class="op">-</span>UFormat <span class="st">&quot;%m&quot;</span></span>
<span id="cb12-2"><a href="#cb12-2" aria-hidden="true" tabindex="-1"></a><span class="cf">switch</span><span class="op">(</span><span class="va">$MMM</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb12-3"><a href="#cb12-3" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;01&quot;</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">&#39;Jan&#39;</span><span class="op">}</span></span>
<span id="cb12-4"><a href="#cb12-4" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;02&quot;</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">&#39;Feb&#39;</span><span class="op">}</span></span>
<span id="cb12-5"><a href="#cb12-5" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;03&quot;</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">&#39;Mar&#39;</span><span class="op">}</span></span>
<span id="cb12-6"><a href="#cb12-6" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;04&quot;</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">&#39;Apr&#39;</span><span class="op">}</span></span>
<span id="cb12-7"><a href="#cb12-7" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;05&quot;</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">&#39;May&#39;</span><span class="op">}</span></span>
<span id="cb12-8"><a href="#cb12-8" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;06&quot;</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">&#39;Jun&#39;</span><span class="op">}</span></span>
<span id="cb12-9"><a href="#cb12-9" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;07&quot;</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">&#39;Jul&#39;</span><span class="op">}</span></span>
<span id="cb12-10"><a href="#cb12-10" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;08&quot;</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">&#39;Aug&#39;</span><span class="op">}</span></span>
<span id="cb12-11"><a href="#cb12-11" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;09&quot;</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">&#39;Sep&#39;</span><span class="op">}</span></span>
<span id="cb12-12"><a href="#cb12-12" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;10&quot;</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">&#39;Oct&#39;</span><span class="op">}</span></span>
<span id="cb12-13"><a href="#cb12-13" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;11&quot;</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">&#39;Nov&#39;</span><span class="op">}</span></span>
<span id="cb12-14"><a href="#cb12-14" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;12&quot;</span> <span class="op">{</span><span class="va">$Month</span> <span class="op">=</span> <span class="st">&#39;Dec&#39;</span><span class="op">}</span></span>
<span id="cb12-15"><a href="#cb12-15" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<h3 id="function-switch">function switch</h3>
<div class="sourceCode" id="cb13"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="kw">Function</span> fun-switch <span class="op">(</span></span>
<span id="cb13-2"><a href="#cb13-2" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">switch</span><span class="op">]</span><span class="va">$param</span></span>
<span id="cb13-3"><a href="#cb13-3" aria-hidden="true" tabindex="-1"></a><span class="op">)</span> <span class="op">{</span></span>
<span id="cb13-4"><a href="#cb13-4" aria-hidden="true" tabindex="-1"></a><span class="cf">If</span> <span class="op">(</span><span class="va">$param</span><span class="op">)</span> <span class="op">{</span><span class="st">&quot;yes&quot;</span><span class="op">}</span> <span class="cf">else</span> <span class="op">{</span><span class="st">&quot;no&quot;</span><span class="op">}</span></span>
<span id="cb13-5"><a href="#cb13-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb13-6"><a href="#cb13-6" aria-hidden="true" tabindex="-1"></a>fun-switch <span class="op">-</span>param</span></code></pre></div>
<h1 id="bit">Bit</h1>
<pre><code>Двоичное Десятичное
1 1
10 2
11 3
100 4
101 5
110 6
111 7
1000 8
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
1111 15
1 0000 16
Двоичное Десятичное Номер разряда
1 1 0
10 2 1
100 4 2
1000 8 3
1 0000 16 4
10 0000 32 5
100 0000 64 6
1000 0000 128 7
1 0000 0000 256 8
Из двоичного =&gt; десятичное (1-й вариант по таблице)
1001 0011 = 1000 0000 + 1 0000 + 10 + 1 = 128 + 16 + 2 + 1 = 147
2-й вариант
7654 3210 (разряды двоичного выражения) = (1*2^7)+(0*2^6)+(0*2^5)+(1*2^4)+(0*2^3)+(0*2^2)+(1*2^1)+(1*2^0) = 147
[math]::Pow(2,7) + [math]::Pow(2,4) + [math]::Pow(2,1) + [math]::Pow(2,0) = 147` исключить 0 и сложить степень
Из десятичного =&gt; двоичное (1-й вариант по таблице)
347 вычесть ближайшие 256 = 91 (+ 1 0000 0000 забрать двоичный остаток)
91 - 64 = 27 ближайшее 16 (+ 100 0000)
27 - 16 = 11 ближайшее 8 (+ 1 0000)
11 - 8 = 3 ближайшее 2 (+ 1000)
3 - 2 = 1 (+ 10)
1 - 1 = 0 (+ 1)
1 0101 1011
2-й вариант
Последовательное деления числа на 2, предворительно забирая остаток для получения четного числа в меньшую сторону
347 - 346 = остаток 1, (347-1)/2 = 173
173 - 172 = остаток 1, (172-1)/2 = 86
86 - 86 = остаток 0, 86/2 = 43
43 - 42 = остаток 1, (43-1)/2 = 21
21 - 20 = остаток 1, (21-1)/2 = 10
10 - 10 = остаток 0, 10/2 = 5
5 - 4 = остаток 1, (5-1)/2 = 2
2 - 2 = остаток 0, 2/2 = 1
1 - 2 = остаток 1, (1-1)/2 = 0
Результат деления записывается снизу вверх</code></pre>
<h3 id="bit-convertor">Bit Convertor</h3>
<div class="sourceCode" id="cb15"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> ConvertTo-Bit <span class="op">{</span></span>
<span id="cb15-2"><a href="#cb15-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">param</span> <span class="op">(</span></span>
<span id="cb15-3"><a href="#cb15-3" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="dt">Int</span><span class="op">]</span><span class="va">$int</span></span>
<span id="cb15-4"><a href="#cb15-4" aria-hidden="true" tabindex="-1"></a> <span class="op">)</span></span>
<span id="cb15-5"><a href="#cb15-5" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span>array<span class="op">]</span><span class="va">$bits</span> <span class="op">=</span> <span class="op">@()</span></span>
<span id="cb15-6"><a href="#cb15-6" aria-hidden="true" tabindex="-1"></a> <span class="va">$test</span> <span class="op">=</span> <span class="va">$true</span></span>
<span id="cb15-7"><a href="#cb15-7" aria-hidden="true" tabindex="-1"></a> <span class="cf">while</span> <span class="op">(</span><span class="va">$test</span> <span class="op">-eq</span> <span class="va">$true</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb15-8"><a href="#cb15-8" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">((</span><span class="va">$int</span><span class="op">/</span><span class="dv">2</span><span class="op">).</span><span class="fu">GetType</span><span class="op">()</span> <span class="op">-match</span> <span class="op">[</span><span class="dt">double</span><span class="op">])</span> <span class="op">{</span></span>
<span id="cb15-9"><a href="#cb15-9" aria-hidden="true" tabindex="-1"></a> <span class="va">$int</span> <span class="op">=</span> <span class="op">(</span><span class="va">$int</span><span class="op">-</span><span class="dv">1</span><span class="op">)/</span><span class="dv">2</span></span>
<span id="cb15-10"><a href="#cb15-10" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span>array<span class="op">]</span><span class="va">$bits</span> <span class="op">+=</span> <span class="dv">1</span></span>
<span id="cb15-11"><a href="#cb15-11" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb15-12"><a href="#cb15-12" aria-hidden="true" tabindex="-1"></a> <span class="cf">elseif</span> <span class="op">((</span><span class="va">$int</span><span class="op">/</span><span class="dv">2</span><span class="op">).</span><span class="fu">GetType</span><span class="op">()</span> <span class="op">-match</span> <span class="op">[</span><span class="dt">int</span><span class="op">])</span> <span class="op">{</span></span>
<span id="cb15-13"><a href="#cb15-13" aria-hidden="true" tabindex="-1"></a> <span class="va">$int</span> <span class="op">=</span> <span class="va">$int</span><span class="op">/</span><span class="dv">2</span></span>
<span id="cb15-14"><a href="#cb15-14" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span>array<span class="op">]</span><span class="va">$bits</span> <span class="op">+=</span> <span class="dv">0</span></span>
<span id="cb15-15"><a href="#cb15-15" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb15-16"><a href="#cb15-16" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="va">$int</span> <span class="op">-eq</span> <span class="dv">0</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb15-17"><a href="#cb15-17" aria-hidden="true" tabindex="-1"></a> <span class="va">$test</span> <span class="op">=</span> <span class="va">$false</span></span>
<span id="cb15-18"><a href="#cb15-18" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb15-19"><a href="#cb15-19" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb15-20"><a href="#cb15-20" aria-hidden="true" tabindex="-1"></a> <span class="va">$bits</span> <span class="op">=</span> <span class="va">$bits</span><span class="op">[</span>-1<span class="op">..</span>-999<span class="op">]</span></span>
<span id="cb15-21"><a href="#cb15-21" aria-hidden="true" tabindex="-1"></a> <span class="op">([</span><span class="dt">string</span><span class="op">](</span><span class="va">$bits</span><span class="op">))</span> <span class="op">-replace</span> <span class="st">&quot;\s&quot;</span></span>
<span id="cb15-22"><a href="#cb15-22" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>ConvertTo-Bit 347</code></p>
<div class="sourceCode" id="cb16"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> ConvertFrom-Bit <span class="op">{</span></span>
<span id="cb16-2"><a href="#cb16-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">param</span> <span class="op">(</span></span>
<span id="cb16-3"><a href="#cb16-3" aria-hidden="true" tabindex="-1"></a> <span class="va">$bit</span></span>
<span id="cb16-4"><a href="#cb16-4" aria-hidden="true" tabindex="-1"></a> <span class="op">)</span></span>
<span id="cb16-5"><a href="#cb16-5" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="dt">int</span><span class="op">]</span><span class="va">$int</span> <span class="op">=</span> <span class="dv">0</span></span>
<span id="cb16-6"><a href="#cb16-6" aria-hidden="true" tabindex="-1"></a> <span class="va">$bits</span> <span class="op">=</span> <span class="va">$bit</span><span class="op">.</span><span class="fu">ToString</span><span class="op">().</span><span class="fu">ToCharArray</span><span class="op">()</span></span>
<span id="cb16-7"><a href="#cb16-7" aria-hidden="true" tabindex="-1"></a> <span class="va">$index</span> <span class="op">=</span> <span class="op">(</span><span class="va">$bits</span><span class="op">.</span><span class="fu">Count</span><span class="op">)-</span><span class="dv">1</span></span>
<span id="cb16-8"><a href="#cb16-8" aria-hidden="true" tabindex="-1"></a> <span class="cf">foreach</span> <span class="op">(</span><span class="va">$b</span> <span class="kw">in</span> <span class="va">$bits</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb16-9"><a href="#cb16-9" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="va">$b</span> <span class="op">-notlike</span> <span class="dv">0</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb16-10"><a href="#cb16-10" aria-hidden="true" tabindex="-1"></a> <span class="va">$int</span> <span class="op">+=</span> <span class="op">[</span>math<span class="op">]::</span>Pow<span class="op">(</span><span class="dv">2</span><span class="op">,</span><span class="va">$index</span><span class="op">)</span></span>
<span id="cb16-11"><a href="#cb16-11" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb16-12"><a href="#cb16-12" aria-hidden="true" tabindex="-1"></a> <span class="va">$index</span> <span class="op">-=</span> <span class="dv">1</span></span>
<span id="cb16-13"><a href="#cb16-13" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb16-14"><a href="#cb16-14" aria-hidden="true" tabindex="-1"></a> <span class="va">$int</span></span>
<span id="cb16-15"><a href="#cb16-15" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>ConvertFrom-Bit 10010011</code></p>
<p><code>Get-Process pwsh | fl ProcessorAffinity</code> привязка
процесса к ядрам, представляет из себя битовую маску (bitmask), где
каждому биту соответствует ядро процессора. Если для ядра отмечено
сходство (affinity), то бит выставляется в 1, если нет — то в 0.
Например, если выбраны все 16 ядер, то это 1111 1111 1111 1111 или
65535.<br />
<code>(Get-Process pwsh).ProcessorAffinity = 15</code> 0000000000001111
присвоить 4 первых ядра<br />
<code>(Get-Process pwsh).ProcessorAffinity = 61440</code>
1111000000000000 присвоить 4 последних ядра<br />
<code>(Get-Process pwsh).ProcessorAffinity = (ConvertFrom-Bit 1111000000000000)</code></p>
<h3 id="property">Property</h3>
<p><code>$srv.Count</code> кол-во элементов в массиве<br />
<code>$srv.Length</code> содержит количество символом строки переменной
[string] или количество значений (строк) объекта<br />
<code>$srv.Chars(2)</code> отобразить 3-й символ в строке<br />
<code>$srv[2]</code> отобразить 3-ю строку в массиве</p>
<h3 id="method">Method</h3>
<p><code>$srv.Insert(0,"https://")</code> добавить значение перед первым
символом<br />
<code>$srv.Substring(4)</code> удалить (из всего массива) первые 4
символа<br />
<code>$srv.Remove(3)</code> удалить из всего массива все после 3
символа<br />
<code>$string = "123"</code> создать строку<br />
<code>$int = [convert]::ToInt32($string)</code> преобразовать строку в
тип данных число<br />
<code>[string]::Concat($text,$num)</code> объеденить переменные в одну
строку<br />
<code>[string]::Join(":",$text,$num)</code> объеденить используя
разделитель<br />
<code>[string]::Compare($text,$num,$true)</code> выдает 0 при совпадении
или 1/-1 при несовпадении, $true (без учета регистра) или <span
class="math inline">$false (с учетом регистра) \
`[string]::Equals($</span>text,$num)<code>производит сравнение двух строк и выдает $true при их совпадении или $false при несовпадении \</code>[string]::IsNullOrEmpty($text)<code>проверяет наличие строки, если строка пуста $true, если нет $false \</code>[string]::IsNullOrWhiteSpace($text2)`
проверяет на наличие только символов пробел, табуляция или символ новой
строки</p>
<h3 id="datetime">DateTime</h3>
<p><code>Get-TimeZone</code> часовой пояс<br />
<code>[DateTime]::UtcNow</code> время в формате UTC 0<br />
<code>(Get-Date).AddHours(-3)</code><br />
<code>$Date = (Get-Date -Format "dd/MM/yyyy hh:mm:ss")</code><br />
<code>$Date = Get-Date -f "dd/MM/yyyy"</code> получаем тип данных
[string]<br />
<code>[DateTime]$gDate = Get-Date "$Date"</code> преобразовать в тип <a
href="#datetime">DateTime</a><br />
<code>[int32]$days=($fDate-$gDate).Days</code> получить разницу в
днях<br />
<code>"5/7/07" -as [DateTime]</code> преобразовать входные данные в тип
данных <a href="#datetime">DateTime</a><br />
<code>New-TimeSpan -Start $VBRRP.CreationTimeUTC -End $VBRRP.CompletionTimeUTC</code>
получить разницу во времени</p>
<h3 id="measure-command">Measure-Command</h3>
<p><code>(Measure-Command {ping ya.ru}).TotalSeconds</code> узнать
только время выполнения<br />
<code>(Get-History)[-1] | select @{Name="RunTime"; Expression={$_.EndExecutionTime - $_.StartExecutionTime}},ExecutionStatus,CommandLine</code>
посчитать время работы последней [-1] (select -Last 1) выполненной
команды и узнать ее статус</p>
<h3 id="timer">Timer</h3>
<p><code>$start_time = Get-Date</code> зафиксировать время до выполнения
команды<br />
<code>$end_time = Get-Date</code> зафиксировать время по
завершению<br />
<code>$time = $end_time - $start_time</code> высчитать время работы
скрипта<br />
<code>$min = $time.minutes</code><br />
<code>$sec = $time.seconds</code><br />
<code>Write-Host "$min минут $sec секунд"</code><br />
<code>$timer = [System.Diagnostics.Stopwatch]::StartNew()</code>
запустить таймер<br />
<code>$timer.IsRunning</code> статус работы таймера<br />
<code>$timer.Elapsed.TotalSeconds</code> отобразить время с момента
запуска (в секундах)<br />
<code>$timer.Stop()</code> остановить таймер</p>
<h3 id="foreach">Foreach</h3>
<p><code>$list = 100..110</code> создать массив из цифр от 100 до
110<br />
<code>foreach ($srv in $list) {ping 192.168.3.$srv -n 1 -w 50}</code>
$srv хранит текущий элемент из <span class="math inline">$list и
повторяет команду до последнего элемента в массиве \
`$</span>foreach.Current<code>текущий элемент в цикле \</code><span
class="math inline">$foreach.Reset()` обнуляет итерацию, перебор
начнется заново, что приводит к бесконечному циклу \
`$</span>foreach.MoveNext()` переход к следующему элементу в цикле</p>
<h3 id="foreach-object">ForEach-Object (%)</h3>
<p><code>100..110 | %{ping -n 1 -w 50 192.168.3.$_ &gt; $null</code><br />
<code>if ($LastExitCode -eq 0) {Write-Host "192.168.3.$_" -ForegroundColor green</code><br />
<code>} else {</code><br />
<code>Write-Host "192.168.3.$_"-ForegroundColor Red}}</code><br />
<code>%</code> передать цикл через конвеер (ForEach-Object)<br />
<code>$_</code> переменная цикла и конвеера (<span
class="math inline">$PSItem) \
`gwmi Win32_QuickFixEngineering | where
{$</span><em>.InstalledOn.ToString() -match “2022”} |
%{($</em>.HotFixID.Substring(2))}` gwmi создает массив, вывод команды
передается where для поиска подходящих под критерии объектов. По
конвееру передается в цикл для удаления первых (2) символов методом
Substring из всех объектов HotFixID.</p>
<h3 id="while">While</h3>
<p><code>$srv = "yandex.ru"</code><br />
<code>$out2 = "Есть пинг"</code><br />
<code>$out3 = "Нет пинга"</code><br />
<code>$out = $false`` предварительно сбросить переменную, While проверяет условие до запуска цикла \</code>While
($out -eq
$false){`<code>пока условие является $true, цикл будет повторяться \</code>$out
= ping -n 1 -w 50 <span class="math inline">$srv` \
`if ($</span>out -match “ttl”) {$out = $true; <span
class="math inline">$out2} else {$</span>out = $false; $out3; sleep
1}<code>\</code>}`</p>
<p><code>while ($True){`` запустить бесконечный цикл \</code><span
class="math inline">$result = ping yandex.ru -n 1 -w 50` \
`if ($</span>result -match
“TTL”){<code>условие, при котором будет выполнен break \ `Write-Host "Сайт доступен"` \ `break</code>
остановит цикл<br />
<code>} else {Write-Host "Сайт недоступен"; sleep 1}</code><br />
<code>}</code></p>
<h3 id="try-catch-finally">Try-Catch-Finally</h3>
<div class="sourceCode" id="cb17"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true" tabindex="-1"></a><span class="cf">Try</span> <span class="op">{</span><span class="va">$out</span> <span class="op">=</span> pping <span class="dv">192.168</span><span class="op">.</span><span class="dv">3.1</span><span class="op">}</span></span>
<span id="cb17-2"><a href="#cb17-2" aria-hidden="true" tabindex="-1"></a><span class="cf">Catch</span> <span class="op">{</span><span class="fu">Write-Warning</span> <span class="st">&quot;</span><span class="op">$(</span><span class="va">$error</span><span class="op">[</span><span class="dv">0</span><span class="op">])</span><span class="st">&quot;</span><span class="op">}</span> <span class="co"># выводит в случае ошибки (вместо ошибки)</span></span>
<span id="cb17-3"><a href="#cb17-3" aria-hidden="true" tabindex="-1"></a><span class="cf">finally</span> <span class="op">{</span><span class="va">$out</span> <span class="op">=</span> <span class="st">&quot;End&quot;</span><span class="op">}</span> <span class="co"># выполняется в конце в любом случае</span></span></code></pre></div>
<h3 id="error">Error</h3>
<p><code>$Error</code> выводит все ошибки текущего сеанса<br />
<code>$Error[0].InvocationInfo</code> развернутый отчет об ошибке<br />
<code>$Error.clear()</code><br />
<code>$LASTEXITCODE</code> результат выполнения последней команды (0 -
успех)<br />
<code>exit 1</code> код завершения, который возвращается
$LASTEXITCODE</p>
<h1 id="files">Files</h1>
<p><code>$file = [System.IO.File]::Create("$home\desktop\test.txt")</code>
создать файл<br />
<code>$file.Close()</code> закрыть файл<br />
<code>[System.IO.File]::ReadAllLines("$home\desktop\test.txt")</code>
прочитать файл<br />
<code>$file = New-Object System.IO.StreamReader("$home\desktop\test.txt")</code>
файл будет занят процессом PowerShell<br />
<code>$file | gm</code><br />
<code>$file.ReadLine()</code> построчный вывод<br />
<code>$file.ReadToEnd()</code> прочитать файл целиком</p>
<h3 id="readwrite-bytes">Read/Write Bytes</h3>
<p><code>$file = [io.file]::ReadAllBytes("$home\desktop\powershell.jpg")</code>
метод открывает двоичный файл, считывает его в массив байт и закрывает
файл<br />
<code>[io.file]::WriteAllBytes("$home\desktop\tloztotk-2.jpg",$file)</code>
сохранить байты в файл (можно использовать для выгрузки двоичных файлов
из БД)</p>
<p><code>Get-Content $home/desktop\test.txt -Wait</code> аналог
tail<br />
<code>Test-Path $path</code> проверить доступность пути<br />
<code>Get-ChildItem $path -Filter *.txt -Recurse</code> отобразить
содержимое каталога (Alias: ls/gci/dir) и дочерних каталогов (-Recurse)
и отфильтровать вывод<br />
<code>Get-Location</code> отобразить текущие месторасположение (Alias:
pwd/gl)<br />
<code>Set-Location $path</code> перемещение по каталогам (Alias:
cd/sl)<br />
<code>Invoke-Item $path</code> открыть файл (Alias: ii/start)<br />
<code>Get-ItemProperty $env:userprofile\Documents\dns-list.txt | select FullName,Directory,Name,BaseName,Extension</code>
свойтсва файла<br />
<code>Get-ItemProperty -Path $path\* | select FullName,CreationTime,LastWriteTime</code>
свойства файлов содержимого директории, дата их создания и последнего
изменения<br />
<code>New-Item -Path "C:\test\" -ItemType "Directory"</code> создать
директорию (Alias: mkdir/md)<br />
<code>New-Item -Path "C:\test\file.txt" -ItemType "File" -Value "Добавить текст в файл"</code>
создать файл<br />
<code>"test" &gt; "C:\test\file.txt"</code> заменить содержимое<br />
<code>"test" &gt;&gt; "C:\test\file.txt"</code> добавить строку в
файл<br />
<code>New-Item -Path "C:\test\test\file.txt" -Force</code> ключ
используется для создания отсутствующих в пути директорий или перезаписи
файла если он уже существует<br />
<code>Move-Item</code> перемещение объектов (Alias: mv/move)<br />
<code>Remove-Item "$path\" -Recurse</code> удаление всех файлов внутри
каталога, без запроса подверждения (Alias: rm/del)<br />
<code>Remove-Item $path -Recurse -Include "*.txt","*.temp" -Exclude "log.txt"</code>
удалить все файлы с расширением txt и temp (<a href="#array">Array</a>),
кроме log.txt<br />
<code>Rename-Item "C:\test\*.*" "*.jpg"</code> переименовать файлы по
маске (Alias: ren)<br />
<code>Copy-Item</code> копирование файлов и каталогов (Alias:
cp/copy)<br />
<code>Copy-Item -Path "\\server-01\test" -Destination "C:\" -Recurse</code>
копировать директорию с ее содержимым (-Recurse)<br />
<code>Copy-Item -Path "C:\*.txt" -Destination "C:\test\"</code> знак '
в конце Destination используется для переноса папки внутрь указанной,
отсутствие, что это новое имя директории<br />
<code>Copy-Item -Path "C:\*" -Destination "C:\test\" -Include '*.txt','*.jpg'</code>
копировать объекты с указанным расширением (Include)<br />
<code>Copy-Item -Path "C:\*" -Destination "C:\test\" -Exclude '*.jpeg'</code>
копировать объекты, за исключением файлов с расширением (Exclude)<br />
<code>$log = Copy-Item "C:\*.txt" "C:\test\" -PassThru</code> вывести
результат копирования (логирование) в переменную, можно забирать строки
с помощью индексов $log[0].FullName</p>
<h3 id="clear-env-temp-14-days">Clear-env-Temp-14-days</h3>
<div class="sourceCode" id="cb18"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true" tabindex="-1"></a><span class="va">$ls</span> <span class="op">=</span> <span class="fu">Get-Item</span> <span class="va">$env</span><span class="op">:</span><span class="va">TEMP</span>\<span class="op">*.</span><span class="fu">tmp</span> <span class="co"># считать все файлы с указанным расширением</span></span>
<span id="cb18-2"><a href="#cb18-2" aria-hidden="true" tabindex="-1"></a><span class="va">$date</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Date</span><span class="op">).</span><span class="fu">AddDays</span><span class="op">(-</span><span class="dv">14</span><span class="op">)</span></span>
<span id="cb18-3"><a href="#cb18-3" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$l</span> <span class="kw">in</span> <span class="va">$ls</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb18-4"><a href="#cb18-4" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="va">$l</span><span class="op">.</span><span class="fu">LastWriteTime</span> <span class="op">-le</span> <span class="va">$date</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb18-5"><a href="#cb18-5" aria-hidden="true" tabindex="-1"></a> <span class="va">$l</span><span class="op">.</span><span class="fu">FullName</span></span>
<span id="cb18-6"><a href="#cb18-6" aria-hidden="true" tabindex="-1"></a> <span class="fu">Remove-Item</span> <span class="va">$l</span><span class="op">.</span><span class="fu">FullName</span> <span class="op">-</span>Recurse</span>
<span id="cb18-7"><a href="#cb18-7" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb18-8"><a href="#cb18-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<h3 id="filehash">Filehash</h3>
<p><code>Get-Filehash -Algorithm SHA256 "$env:USERPROFILE\Documents\RSA.conf.txt"</code></p>
<h3 id="microsoft.powershell.archive">Microsoft.PowerShell.Archive</h3>
<p><code>Compress-Archive -Path $sourcepath -DestinationPath $dstpath -CompressionLevel Optimal</code>
архивировать<br />
<code>Expand-Archive .\powerlinefonts.zip</code> разархивировать</p>
<h1 id="credential">Credential</h1>
<p><code>$Cred = Get-Credential</code> сохраняет креды в переменные
$Cred.Username и <span class="math inline">$Cred.Password \
`$</span>Cred.GetNetworkCredential().password<code>извлечь пароль \</code>cmdkey
/generic:“TERMSRV/<span class="math inline">$srv"
/user:"$</span>username” /pass:“<span class="math inline">$password"`
добавить указанные креды аудентификации на на терминальный сервер для
подключения без пароля \
`mstsc /admin /v:$</span>srv<code>авторизоваться \</code>cmdkey
/delete:”TERMSRV/<span class="math inline">$srv"` удалить добавленные
креды аудентификации из системы \
`rundll32.exe keymgr.dll,KRShowKeyMgr` хранилище Stored User Names and
Password \
`Get-Service VaultSvc` служба для работы Credential Manager \
`Install-Module CredentialManager` установить модуль управления
Credential Manager к хранилищу PasswordVault из PowerShell \
`[System.Net.ServicePointManager]::SecurityProtocol =
[System.Net.SecurityProtocolType]'Tls11,Tls12'` для устаноки модуля \
`Get-StoredCredential` получить учетные данные из хранилища Windows
Vault \
`Get-StrongPassword` генератор пароля \
`New-StoredCredential -UserName test -Password "123456"` добавить
учетную запись \
`Remove-StoredCredential` удалить учетную запись \
`$</span>Cred = Get-StoredCredential | where {<span
class="math inline">$_.username -match "admin"}` \
`$</span>pass = <span class="math inline">$cred.password` \
`$</span>BSTR =
[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR(<span
class="math inline">$pass)` \
`[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($</span>BSTR)`</p>
<h3 id="out-gridview">Out-Gridview</h3>
<p><code>Get-Service -cn $srv | Out-GridView -Title "Service $srv" -OutputMode Single PassThru | Restart-Service</code>
перезапустить выбранную службу</p>
<h3 id="out-file">Out-File</h3>
<p><code>Read-Host AsSecureString | ConvertFrom-SecureString | Out-File "$env:userprofile\desktop\password.txt"</code>
писать в файл. Преобразовать пароль в формат SecureString с
использованием шифрования Windows Data Protection API (DPAPI)</p>
<h3 id="get-content-gccattype">Get-Content (gc/cat/type)</h3>
<p><code>$password = gc "$env:userprofile\desktop\password.txt" | ConvertTo-SecureString</code>
читать хэш пароля из файла с помощью ключей, хранящихся в профиле
текущего пользователя, который невозможно прочитать на другом
копьютере</p>
<h3 id="aes-key">AES Key</h3>
<p><code>$AESKey = New-Object Byte[] 32</code><br />
<code>[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($AESKey)</code><br />
<code>$AESKey | Out-File "C:\password.key"</code><br />
<code>$Cred.Password | ConvertFrom-SecureString -Key (Get-Content "C:\password.key") | Set-Content "C:\password.txt"</code>
сохранить пароль в файл используя внешний ключ<br />
<code>$pass = Get-Content "C:\password.txt" | ConvertTo-SecureString -Key (Get-Content "\\Server\Share\password.key")</code>
расшифровать пароль на втором компьютере</p>
<h1 id="winevent">WinEvent</h1>
<p><code>Get-WinEvent -ListLog *</code> отобразить все доступные журналы
логов<br />
<code>Get-WinEvent -ListLog * | where RecordCount -ne 0 | where RecordCount -ne $null | sort -Descending RecordCount</code>
отобразить не пустые журналы с сортировкой по кол-ву записей<br />
<code>Get-WinEvent -ListProvider * | ft</code> отобразить всех
провайдеров приложений<br />
<code>Get-WinEvent -ListProvider GroupPolicy</code> найти в какой журнал
LogLinks {Application} пишутся логи приложения<br />
<code>Get-WinEvent -ListProvider *smb*</code><br />
<code>Get-WinEvent -ListLog * | where logname -match SMB | sort -Descending RecordCount</code>
найти все журналы по имени<br />
<code>Get-WinEvent -LogName "Microsoft-Windows-SmbClient/Connectivity"</code><br />
<code>Get-WinEvent -ListProvider *firewall*</code></p>
<h3 id="filter-xpathhashtable">Filter XPath/Hashtable</h3>
<p><code>Get-WinEvent -FilterHashtable @{LogName="Security";ID=4624}</code>
найти логи по ID в журнале Security<br />
<code>Get-WinEvent -FilterHashtable @{LogName="System";Level=2}</code>
найти все записи ошибки (1 - критический, 3 - предупреждение, 4 -
сведения)<br />
<code>Get-WinEvent -FilterHashtable @{LogName="System";Level=2;ProviderName="Service Control Manager"}</code>
отфильтровать по имени провайдера</p>
<p><code>([xml](Get-WinEvent -FilterHashtable @{LogName="Security";ID=4688} -MaxEvents 1).ToXml()).Event.EventData.Data</code>
отобразить все свойства, хранимые в EventData (Message)<br />
<code>Get-WinEvent -FilterHashtable @{logname="security";ID=4688} -MaxEvents 1 | select timecreated,{$_.Properties[5].value}</code>
отфильтровать время события и имя запущенного процесса</p>
<pre><code>$query = &#39;
&lt;QueryList&gt;
&lt;Query Id=&quot;0&quot; Path=&quot;Security&quot;&gt;
&lt;Select Path=&quot;Security&quot;&gt;
*[System[EventID=4688]] and
*[EventData[Data[@Name=&quot;NewProcessName&quot;]=&quot;C:\Windows\System32\autochk.exe&quot; or Data[@Name=&quot;NewProcessName&quot;]=&quot;C:\Windows\System32\services.exe&quot;]]
&lt;/Select&gt;
&lt;/Query&gt;
&lt;/QueryList&gt;
&#39;
Get-WinEvent -LogName Security -FilterXPath $query</code></pre>
<h3 id="reboot">Reboot</h3>
<pre><code>$query = &#39;
&lt;QueryList&gt;
&lt;Query Id=&quot;0&quot; Path=&quot;System&quot;&gt;
&lt;Select Path=&quot;System&quot;&gt;
*[
System[
EventID=41 or
EventID=1074 or
EventID=1076 or
EventID=6005 or
EventID=6006 or
EventID=6008 or
EventID=6009 or
EventID=6013
]
]
&lt;/Select&gt;
&lt;/Query&gt;
&lt;/QueryList&gt;
&#39;
Get-WinEvent -LogName System -FilterXPath $query
41 ` Система была перезагружена без корректного завершения работы.
1074` Система была корректного выключена пользователем или процессом.
1076` Следует за Event ID 6008 и означает, что первый пользователь (с правом выключения системы) подключившийся к серверу после неожиданной перезагрузки или выключения, указал причину этого события.
6005` Запуск &quot;Журнала событий Windows&quot; (Event Log). Указывает на включение системы.
6006` Остановка «Журнала событий Windows». Указывает на выключение системы.
6008` Предыдущее выключение системы было неожиданным.
6009` Версия операционной системы, зафиксированная при загрузке системы.
6013` Время работы системы (system uptime) в секундах.</code></pre>
<h3 id="logon">Logon</h3>
<div class="sourceCode" id="cb21"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb21-1"><a href="#cb21-1" aria-hidden="true" tabindex="-1"></a><span class="va">$srv</span> <span class="op">=</span> <span class="st">&quot;localhost&quot;</span></span>
<span id="cb21-2"><a href="#cb21-2" aria-hidden="true" tabindex="-1"></a><span class="va">$FilterXPath</span> <span class="op">=</span> <span class="st">&#39;&lt;QueryList&gt;&lt;Query Id=&quot;0&quot;&gt;&lt;Select&gt;*[System[EventID=21]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;&#39;</span></span>
<span id="cb21-3"><a href="#cb21-3" aria-hidden="true" tabindex="-1"></a><span class="va">$RDPAuths</span> <span class="op">=</span> <span class="fu">Get-WinEvent</span> <span class="op">-</span>ComputerName <span class="va">$srv</span> <span class="op">-</span>LogName <span class="st">&quot;Microsoft-Windows-TerminalServices-LocalSessionManager/Operational&quot;</span> <span class="op">-</span>FilterXPath <span class="va">$FilterXPath</span></span>
<span id="cb21-4"><a href="#cb21-4" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>xml<span class="op">[]]</span><span class="va">$xml</span> <span class="op">=</span> <span class="va">$RDPAuths</span> <span class="op">|</span> <span class="cf">Foreach</span> <span class="op">{</span><span class="va">$_</span><span class="op">.</span><span class="fu">ToXml</span><span class="op">()}</span></span>
<span id="cb21-5"><a href="#cb21-5" aria-hidden="true" tabindex="-1"></a><span class="va">$EventData</span> <span class="op">=</span> <span class="cf">Foreach</span> <span class="op">(</span><span class="va">$event</span> <span class="kw">in</span> <span class="va">$xml</span><span class="op">.</span><span class="fu">Event</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb21-6"><a href="#cb21-6" aria-hidden="true" tabindex="-1"></a><span class="fu">New-Object</span> PSObject <span class="op">-</span>Property @<span class="op">{</span></span>
<span id="cb21-7"><a href="#cb21-7" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;Connection Time&quot;</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Date</span> <span class="op">(</span><span class="va">$event</span><span class="op">.</span><span class="fu">System</span><span class="op">.</span><span class="fu">TimeCreated</span><span class="op">.</span><span class="fu">SystemTime</span><span class="op">)</span> <span class="op">-</span>Format <span class="st">&#39;yyyy-MM-dd hh:mm K&#39;</span><span class="op">)</span></span>
<span id="cb21-8"><a href="#cb21-8" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;User Name&quot;</span> <span class="op">=</span> <span class="va">$event</span><span class="op">.</span><span class="fu">UserData</span><span class="op">.</span><span class="fu">EventXML</span><span class="op">.</span><span class="fu">User</span></span>
<span id="cb21-9"><a href="#cb21-9" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;User ID&quot;</span> <span class="op">=</span> <span class="va">$event</span><span class="op">.</span><span class="fu">UserData</span><span class="op">.</span><span class="fu">EventXML</span><span class="op">.</span><span class="fu">SessionID</span></span>
<span id="cb21-10"><a href="#cb21-10" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;User Address&quot;</span> <span class="op">=</span> <span class="va">$event</span><span class="op">.</span><span class="fu">UserData</span><span class="op">.</span><span class="fu">EventXML</span><span class="op">.</span><span class="fu">Address</span></span>
<span id="cb21-11"><a href="#cb21-11" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;Event ID&quot;</span> <span class="op">=</span> <span class="va">$event</span><span class="op">.</span><span class="fu">System</span><span class="op">.</span><span class="fu">EventID</span></span>
<span id="cb21-12"><a href="#cb21-12" aria-hidden="true" tabindex="-1"></a><span class="op">}}</span></span>
<span id="cb21-13"><a href="#cb21-13" aria-hidden="true" tabindex="-1"></a><span class="va">$EventData</span> <span class="op">|</span> <span class="fu">ft</span></span></code></pre></div>
<h3 id="eventlog">EventLog</h3>
<p><code>Get-EventLog -List</code> отобразить все корневые журналы логов
и их размер<br />
<code>Clear-EventLog Application</code> очистить логи указанного
журнала<br />
<code>Get-EventLog -LogName Security -InstanceId 4624</code> найти логи
по ID в журнале Security</p>
<h1 id="firewall">Firewall</h1>
<div class="sourceCode" id="cb22"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb22-1"><a href="#cb22-1" aria-hidden="true" tabindex="-1"></a><span class="va">$days</span> <span class="op">=</span> <span class="dv">5</span></span>
<span id="cb22-2"><a href="#cb22-2" aria-hidden="true" tabindex="-1"></a><span class="va">$obj</span> <span class="op">=</span> <span class="op">@()</span></span>
<span id="cb22-3"><a href="#cb22-3" aria-hidden="true" tabindex="-1"></a><span class="va">$fw</span> <span class="op">=</span> <span class="fu">Get-WinEvent</span> <span class="st">&quot;Microsoft-Windows-Windows Firewall With Advanced Security/Firewall&quot;</span></span>
<span id="cb22-4"><a href="#cb22-4" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$temp_fw</span> <span class="kw">in</span> <span class="va">$fw</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb22-5"><a href="#cb22-5" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$temp_fw</span><span class="op">.</span><span class="fu">id</span> <span class="op">-eq</span> <span class="dv">2097</span><span class="op">)</span> <span class="op">{</span> <span class="co"># 2004</span></span>
<span id="cb22-6"><a href="#cb22-6" aria-hidden="true" tabindex="-1"></a> <span class="va">$type</span> <span class="op">=</span> <span class="st">&quot;Added Rule&quot;</span></span>
<span id="cb22-7"><a href="#cb22-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb22-8"><a href="#cb22-8" aria-hidden="true" tabindex="-1"></a><span class="cf">elseif</span> <span class="op">(</span><span class="va">$temp_fw</span><span class="op">.</span><span class="fu">id</span> <span class="op">-eq</span> <span class="dv">2006</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb22-9"><a href="#cb22-9" aria-hidden="true" tabindex="-1"></a> <span class="va">$type</span> <span class="op">=</span> <span class="st">&quot;Deleted Rule&quot;</span></span>
<span id="cb22-10"><a href="#cb22-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb22-11"><a href="#cb22-11" aria-hidden="true" tabindex="-1"></a><span class="va">$port</span> <span class="op">=</span> <span class="va">$temp_fw</span><span class="op">.</span><span class="fu">Properties</span><span class="op">[</span><span class="dv">7</span><span class="op">]</span> <span class="op">|</span> <span class="fu">select</span> <span class="op">-</span>ExpandProperty value</span>
<span id="cb22-12"><a href="#cb22-12" aria-hidden="true" tabindex="-1"></a><span class="va">$name</span> <span class="op">=</span> <span class="va">$temp_fw</span><span class="op">.</span><span class="fu">Properties</span><span class="op">[</span><span class="dv">1</span><span class="op">]</span> <span class="op">|</span> <span class="fu">select</span> <span class="op">-</span>ExpandProperty value</span>
<span id="cb22-13"><a href="#cb22-13" aria-hidden="true" tabindex="-1"></a><span class="va">$obj</span> <span class="op">+=</span> <span class="op">[</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
<span id="cb22-14"><a href="#cb22-14" aria-hidden="true" tabindex="-1"></a> Time <span class="op">=</span> <span class="va">$temp_fw</span><span class="op">.</span><span class="fu">TimeCreated</span><span class="op">;</span></span>
<span id="cb22-15"><a href="#cb22-15" aria-hidden="true" tabindex="-1"></a> <span class="fu">Type</span> <span class="op">=</span> <span class="va">$type</span><span class="op">;</span></span>
<span id="cb22-16"><a href="#cb22-16" aria-hidden="true" tabindex="-1"></a> Port <span class="op">=</span> <span class="va">$port</span><span class="op">;</span></span>
<span id="cb22-17"><a href="#cb22-17" aria-hidden="true" tabindex="-1"></a> Name <span class="op">=</span> <span class="va">$name</span><span class="op">}</span></span>
<span id="cb22-18"><a href="#cb22-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb22-19"><a href="#cb22-19" aria-hidden="true" tabindex="-1"></a><span class="va">$obj</span> <span class="op">|</span> <span class="fu">Where-Object</span> time <span class="op">-gt</span> <span class="op">(</span><span class="fu">Get-Date</span><span class="op">).</span><span class="fu">AddDays</span><span class="op">(-</span><span class="va">$days</span><span class="op">)</span></span></code></pre></div>
<p><code>New-NetFirewallRule -Profile Any -DisplayName "Open Port 135 RPC" -Direction Inbound -Protocol TCP -LocalPort 135</code>
открыть in-порт<br />
<code>Get-NetFirewallRule | where DisplayName -match kms | select *</code>
найти правило по имени<br />
<code>Get-NetFirewallPortFilter | where LocalPort -like 80</code> найти
действующие правило по номеру порта</p>
<div class="sourceCode" id="cb23"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb23-1"><a href="#cb23-1" aria-hidden="true" tabindex="-1"></a>Get-NetFirewallRule <span class="op">-</span>Enabled True <span class="op">-</span>Direction Inbound <span class="op">|</span> <span class="fu">select</span> <span class="op">-</span>Property DisplayName<span class="op">,</span></span>
<span id="cb23-2"><a href="#cb23-2" aria-hidden="true" tabindex="-1"></a>@<span class="op">{</span>Name<span class="op">=</span><span class="st">&#39;Protocol&#39;</span><span class="op">;</span>Expression<span class="op">={(</span><span class="va">$_</span> <span class="op">|</span> Get-NetFirewallPortFilter<span class="op">).</span><span class="fu">Protocol</span><span class="op">}},</span></span>
<span id="cb23-3"><a href="#cb23-3" aria-hidden="true" tabindex="-1"></a>@<span class="op">{</span>Name<span class="op">=</span><span class="st">&#39;LocalPort&#39;</span><span class="op">;</span>Expression<span class="op">={(</span><span class="va">$_</span> <span class="op">|</span> Get-NetFirewallPortFilter<span class="op">).</span><span class="fu">LocalPort</span><span class="op">}},</span></span>
<span id="cb23-4"><a href="#cb23-4" aria-hidden="true" tabindex="-1"></a>@<span class="op">{</span>Name<span class="op">=</span><span class="st">&#39;RemotePort&#39;</span><span class="op">;</span>Expression<span class="op">={(</span><span class="va">$_</span> <span class="op">|</span> Get-NetFirewallPortFilter<span class="op">).</span><span class="fu">RemotePort</span><span class="op">}},</span></span>
<span id="cb23-5"><a href="#cb23-5" aria-hidden="true" tabindex="-1"></a>@<span class="op">{</span>Name<span class="op">=</span><span class="st">&#39;RemoteAddress&#39;</span><span class="op">;</span>Expression<span class="op">={(</span><span class="va">$_</span> <span class="op">|</span> Get-NetFirewallAddressFilter<span class="op">).</span><span class="fu">RemoteAddress</span><span class="op">}},</span></span>
<span id="cb23-6"><a href="#cb23-6" aria-hidden="true" tabindex="-1"></a>Enabled<span class="op">,</span>Profile</span></code></pre></div>
<h3 id="firewall-manager">Firewall-Manager</h3>
<p><code>Install-Module Firewall-Manager</code><br />
<code>Export-FirewallRules -Name * -CSVFile $home\documents\fw.csv</code>
-Inbound -Outbound -Enabled -Disabled -Allow -Block (фильтр правил для
экспорта)<br />
<code>Import-FirewallRules -CSVFile $home\documents\fw.csv</code></p>
<h1 id="defender">Defender</h1>
<p><code>Import-Module Defender</code><br />
<code>Get-Command -Module Defender</code><br />
<code>Get-MpComputerStatus</code><br />
<code>(Get-MpComputerStatus).AntivirusEnabled</code> статус работы
антивируса</p>
<p><code>$session = NewCimSession -ComputerName hostname</code>
подключиться к удаленному компьютеру, используется WinRM<br />
<code>Get-MpComputerStatus -CimSession $session | fl fullscan*</code>
узнать дату последнего сканирования на удаленном компьютере</p>
<p><code>Get-MpPreference</code> настройки<br />
<code>(Get-MpPreference).ScanPurgeItemsAfterDelay</code> время хранения
записей журнала защитника в днях<br />
<code>Set-MpPreference -ScanPurgeItemsAfterDelay 30</code> изменить
время хранения<br />
<code>ls "C:\ProgramData\Microsoft\Windows Defender\Scans\History"</code><br />
<code>Get-MpPreference | select disable*</code> отобразить статус всех
видов проверок/сканирований<br />
<code>Set-MpPreference -DisableRealtimeMonitoring $true</code> отключить
защиту Defender в реальном времени (использовать только ручное
сканирование)<br />
<code>Set-MpPreference -DisableRemovableDriveScanning $false</code>
включить сканирование USB накопителей<br />
<code>Get-MpPreference | select excl*</code> отобразить список всех
исключений<br />
<code>(Get-MpPreference).ExclusionPath</code><br />
<code>Add-MpPreference -ExclusionPath C:\install</code> добавить
директорию в исключение<br />
<code>Remove-MpPreference -ExclusionPath C:\install</code> удалить из
исключения<br />
<code>New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name DisableAntiSpyware -Value 1 -PropertyType DWORD -Force</code>
полностью отключить Windows Defender</p>
<p><code>Set-MpPreference -SignatureDefinitionUpdateFileSharesSources \\FileShare1\Updates</code>
для обновления из сетевой папки нужно предварительно скачать файлы с
сигнатурами баз с сайта
https://www.microsoft.com/security/portal/definitions/adl.aspx и
поместить в сетевой каталог
<code>Update-MpSignature -UpdateSource FileShares</code> изменить
источник обновлений (MicrosoftUpdateServer сервера обновлений MS в
интернете, InternalDefinitionUpdateServer — внутренний WSUS
сервер)<br />
<code>Update-MpSignature</code> обновить сигнатуры</p>
<p><code>Start-MpScan -ScanType QuickScan</code> быстрая проверка или
FullScan<br />
<code>Start-MpScan -ScanType FullScan -AsJob</code><br />
<code>Set-MpPreference -RemediationScheduleDay 1-7</code> выбрать дни,
начиная с воскресенья или 0 каждый день, 8 - сбросить<br />
<code>Set-MpPreference -ScanScheduleQuickScanTime 14:00:00</code><br />
<code>Start-MpScan -ScanType CustomScan -ScanPath "C:\Program Files"</code>
сканировать выбранную директорию</p>
<p><code>Get-MpThreat</code> история угроз и тип угрозы (ThreatName:
HackTool/Trojan)<br />
<code>Get-MpThreatCatalog</code> список известных видов угроз<br />
<code>Get-MpThreatDetection</code> история защиты (активных и прошлые) и
ID угрозы<br />
<code>Get-MpThreat -ThreatID 2147760253</code></p>
<p><code>ls "C:\ProgramData\Microsoft\Windows Defender\Quarantine\"</code>
директория хранения файлов в карантине<br />
<code>cd "C:\Program Files\Windows Defender\"</code><br />
<code>.\MpCmdRun.exe -restore -name $ThreatName</code> восстановить файл
из карантина<br />
<code>.\MpCmdRun.exe -restore -filepath $path_file</code></p>
<h1 id="windowsupdate">WindowsUpdate</h1>
<p><code>Get-Hotfix | Sort-Object -Descending InstalledOn</code> список
установленных обновлений (информация из cimv2)<br />
<code>Get-Hotfix -Description "Security update"</code><br />
<code>Get-CimInstance Win32_QuickFixEngineering</code><br />
<code>Get-Command -Module WindowsUpdate</code><br />
<code>Get-WindowsUpdateLog</code><br />
<code>Get-Service uhssvc</code> служба Microsoft Health Update Tools,
которая отвечает за предоставление обновлений</p>
<p><code>Install-Module -Name PSWindowsUpdate -Scope CurrentUser</code><br />
<code>Import-Module PSWindowsUpdate</code><br />
<code>Get-Command -Module PSWindowsUpdate</code><br />
<code>Get-WindowsUpdate</code> список обновлений для скачать и
установить с сервера WSUS или Microsoft Update<br />
<code>Get-WindowsUpdate -Download</code> загрузить все обновления<br />
<code>Get-WindowsUpdate Install</code> установить все обновления<br />
<code>Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -IgnoreReboot</code>
установить все обновления без перезагрузки<br />
<code>Get-WindowsUpdate -KBArticleID KB2267602, KB4533002 -Install</code><br />
<code>Get-WindowsUpdate -KBArticleID KB2538243 -Hide</code> скрыть
обновления, что бы они никогда не устанавливались<br />
<code>Get-WindowsUpdate IsHidden</code> отобразить скрытые обновления
(Hide-WindowsUpdate)<br />
<code>Remove-WindowsUpdate -KBArticleID KB4011634 -NoRestart</code>
удалить обновление<br />
<code>Uninstall-WindowsUpdate</code> удалить обновление<br />
<code>Add-WUServiceManager</code> регистрация сервера обновления
(Windows Update Service Manager)<br />
<code>Enable-WURemoting</code> включить правила Windows Defender,
разрешающие удаленное использование командлета PSWindowsUpdate<br />
<code>Get-WUApiVersion</code> версия Windows Update Agent<br />
<code>Get-WUHistory</code> список всех установленных обновлений (история
обновлений)<br />
<code>Get-WUHistory | Where-Object {$_.Title -match "KB4517389"}</code>
поиск обновления<br />
<code>Get-WULastResults</code> даты последнего поиска и установки
обновлений<br />
<code>Get-WURebootStatus</code> проверить, нужна ли перезагрузка для
применения конкретного обновления<br />
<code>Get-WUServiceManager</code> выводит источники обновлений<br />
<code>Get-WUInstallerStatus</code> статус службы Windows Installer<br />
<code>Remove-WUServiceManager</code> отключить Windows Update Service
Manager</p>
<h1 id="dism">DISM</h1>
<p><code>Get-Command -Module Dism -Name *Driver*</code><br />
<code>Export-WindowsDriver -Online -Destination C:\Users\Lifailon\Documents\Drivers\</code>
извлечение драйверов из текущей системы (C:), выгружает список файлов,
которые необходимы для установки драйвера (dll,sys,exe) в соответствии
со списком файлов, указанных в секции [CopyFiles] inf-файла
драйвера.<br />
<code>Export-WindowsDriver -Path C:\win_image -Destination C:\drivers</code>
извлечь драйвера из офлайн образа Windows, смонтированного в каталог
c:_image<br />
<code>$BackupDrivers = Export-WindowsDriver -Online -Destination C:\Drivers</code><br />
<code>$BackupDrivers | ft Driver,ClassName,ProviderName,Date,Version,ClassDescription</code>
список драйверов в объектном представлении<br />
<code>$BackupDrivers | where classname -match printer</code><br />
<code>pnputil.exe /add-driver C:\drivers\*.inf /subdirs /install</code>
установить все (параметр subdirs) драйвера из указанной папки (включая
вложенные)</p>
<p><code>sfc /scannow</code> проверить целостность системных файлов с
помощью утилиты SFC (System File Checker), в случае поиска ошибок,
попробует восстановить их оригинальные копии из хранилища системных
компонентов Windows (каталог C:). Вывод работы логируется в C:с тегом
SR<br />
<code>Get-ComputerInfo | select *</code> подробная информация о системе
(WindowsVersion,WindowsEditionId,<em>Bios</em>)<br />
<code>Get-WindowsImage -ImagePath E:\sources\install.wim</code> список
доступных версий в образе<br />
<code>Repair-WindowsImage -Online ScanHealth</code><br />
<code>Repair-WindowsImage -Online -RestoreHealth</code> восстановление
хранилища системных компонентов<br />
<code>Repair-WindowsImage -Online -RestoreHealth -Source E:\sources\install.wim:3 LimitAccess</code>
восстановление в оффлайн режиме из образа по номеру индекса</p>
<h1 id="scheduled">Scheduled</h1>
<p><code>$Trigger = New-ScheduledTaskTrigger -At 01:00am -Daily</code>
1:00 ночи<br />
<code>$Trigger = New-ScheduledTaskTrigger AtLogon</code> запуск при
входе пользователя в систему<br />
<code>$Trigger = New-ScheduledTaskTrigger -AtStartup</code> при запуске
системы<br />
<code>$User = "NT AUTHORITY\SYSTEM"</code><br />
<code>$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "$home\Documents\DNS-Change-Tray-1.3.ps1"</code><br />
<code>$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -WindowStyle Hidden -File $home\Documents\DNS-Change-Tray-1.3.ps1"</code><br />
<code>Register-ScheduledTask -TaskName "DNS-Change-Tray-Startup" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest Force</code></p>
<p><code>Get-ScheduledTask | ? state -ne Disabled</code> список всех
активных заданий<br />
<code>Start-ScheduledTask DNS-Change-Tray-Startup</code> запустить
задание немедленно<br />
<code>Get-ScheduledTask DNS-Change-Tray-Startup | Disable-ScheduledTask</code>
отключить задание<br />
<code>Get-ScheduledTask DNS-Change-Tray-Startup | Enable-ScheduledTask</code>
включить задание<br />
<code>Unregister-ScheduledTask DNS-Change-Tray-Startup</code> удалить
задание<br />
<code>Export-ScheduledTask DNS-Change-Tray-Startup | Out-File $home\Desktop\Task-Export-Startup.xml</code>
экспортировать задание в xml<br />
<code>Register-ScheduledTask -Xml (Get-Content $home\Desktop\Task-Export-Startup.xml | Out-String) -TaskName "DNS-Change-Tray-Startup"</code></p>
<h1 id="network">Network</h1>
<h3 id="ping">ping</h3>
<p><code>Test-Connection -Count 1 $srv1, $srv2</code> отправить
icmp-пакет двум хостам<br />
<code>Test-Connection $srv -ErrorAction SilentlyContinue</code> не
выводить ошибок, если хост не отвечает<br />
<code>Test-Connection -Source $srv1 -ComputerName $srv2</code> пинг с
удаленного компьютера</p>
<div class="sourceCode" id="cb24"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb24-1"><a href="#cb24-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Test-PingNetwork <span class="op">{</span></span>
<span id="cb24-2"><a href="#cb24-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span> <span class="op">(</span></span>
<span id="cb24-3"><a href="#cb24-3" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span>Parameter<span class="op">(</span>Mandatory<span class="op">,</span>ValueFromPipeline<span class="op">)][</span><span class="dt">string</span><span class="op">[]]</span><span class="va">$Network</span><span class="op">,</span></span>
<span id="cb24-4"><a href="#cb24-4" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span>ValidateRange<span class="op">(</span><span class="dv">100</span><span class="op">,</span><span class="dv">10000</span><span class="op">)][</span><span class="dt">int</span><span class="op">]</span><span class="va">$Timeout</span> <span class="op">=</span> <span class="dv">100</span></span>
<span id="cb24-5"><a href="#cb24-5" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
<span id="cb24-6"><a href="#cb24-6" aria-hidden="true" tabindex="-1"></a><span class="va">$ping</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">NetworkInformation</span><span class="op">.</span><span class="fu">Ping</span></span>
<span id="cb24-7"><a href="#cb24-7" aria-hidden="true" tabindex="-1"></a><span class="va">$Network</span> <span class="op">=</span> <span class="va">$Network</span> <span class="op">-replace</span> <span class="st">&quot;0$&quot;</span></span>
<span id="cb24-8"><a href="#cb24-8" aria-hidden="true" tabindex="-1"></a><span class="va">$net</span> <span class="op">=</span> <span class="op">@()</span></span>
<span id="cb24-9"><a href="#cb24-9" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$r</span> <span class="kw">in</span> <span class="op">@(</span><span class="dv">1</span><span class="op">..</span><span class="dv">254</span><span class="op">))</span> <span class="op">{</span></span>
<span id="cb24-10"><a href="#cb24-10" aria-hidden="true" tabindex="-1"></a> <span class="va">$net</span> <span class="op">+=</span> <span class="st">&quot;</span><span class="va">$network$r</span><span class="st">&quot;</span></span>
<span id="cb24-11"><a href="#cb24-11" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb24-12"><a href="#cb24-12" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$n</span> <span class="kw">in</span> <span class="va">$net</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb24-13"><a href="#cb24-13" aria-hidden="true" tabindex="-1"></a> <span class="va">$ping</span><span class="op">.</span><span class="fu">Send</span><span class="op">(</span><span class="va">$n</span><span class="op">,</span> <span class="va">$timeout</span><span class="op">)</span> <span class="op">|</span> <span class="fu">select</span> @<span class="op">{</span>Name<span class="op">=</span><span class="st">&quot;Address&quot;</span><span class="op">;</span> Expression<span class="op">={</span><span class="va">$n</span> <span class="op">-replace</span> <span class="st">&quot;.+\.&quot;</span><span class="op">}},</span> Status</span>
<span id="cb24-14"><a href="#cb24-14" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb24-15"><a href="#cb24-15" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Test-PingNetwork -Network 192.168.3.0</code><br />
<code>Test-PingNetwork -Network 192.168.3.0 -Timeout 1000</code></p>
<p><code>Get-CimInstance -Class Win32_PingStatus -Filter "Address='127.0.0.1'"</code><br />
<code>Get-CimInstance -Class Win32_PingStatus -Filter "Address='127.0.0.1'" | Format-Table -Property Address,ResponseTime,StatusCode -Autosize</code>
0 - успех<br />
<code>'127.0.0.1','8.8.8.8' | ForEach-Object -Process {Get-CimInstance -Class Win32_PingStatus -Filter ("Address='$_'") | Select-Object -Property Address,ResponseTime,StatusCode}</code><br />
<code>$ips = 1..254 | ForEach-Object -Process {'192.168.1.' + $_}</code>
сформировать массив из ip-адресов подсети</p>
<h3 id="dhcp">dhcp</h3>
<p><code>Get-CimInstance -Class Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=$true"</code>
отобразить адаптеры с включенным DHCP<br />
<code>$wql = 'SELECT * from Win32_NetworkAdapterConfiguration WHERE IPEnabled=True and DHCPEnabled=False'</code><br />
<code>Invoke-CimMethod -MethodName ReleaseDHCPLease -Query $wql</code>
включение DHCP на всех адаптерах<br />
<code>Invoke-CimMethod -ClassName Win32_NetworkAdapterConfiguration -MethodName ReleaseDHCPLeaseAll</code>
отменить аренду адресов DHCP на всех адаптерах<br />
<code>Invoke-CimMethod -ClassName Win32_NetworkAdapterConfiguration -MethodName RenewDHCPLeaseAll</code>
обновить аренду адресов DHCP на всех адаптерах</p>
<h3 id="port">port</h3>
<p><code>tnc $srv -p 5985</code><br />
<code>tnc $srv -CommonTCPPort WINRM</code> HTTP,RDP,SMB<br />
<code>tnc ya.ru TraceRoute -Hops 2</code> TTL=2<br />
<code>tnc ya.ru -DiagnoseRouting</code> маршрутизация до хоста, куда
(DestinationPrefix: 0.0.0.0/0) через (NextHop: 192.168.1.254)</p>
<h3 id="nslookup">nslookup</h3>
<p><code>nslookup ya.ru 1.1.1.1</code> с указанием DNS сервера<br />
<code>nslookup -type=any ya.ru</code> указать тип записи<br />
<code>Resolve-DnsName ya.ru -Type MX</code>
ALL,ANY,A,NS,SRV,CNAME,PTR,TXT(spf)<br />
<code>[System.Net.Dns]::GetHostEntry("ya.ru")</code></p>
<h3 id="ipconfig">ipconfig</h3>
<p><code>Get-NetIPConfiguration</code><br />
<code>Get-NetIPConfiguration -InterfaceIndex 14 -Detailed</code></p>
<h3 id="adapter">Adapter</h3>
<p><code>Get-NetAdapter</code><br />
<code>Set-NetIPInterface -InterfaceIndex 14 -Dhcp Disabled</code>
отключить DHCP<br />
<code>Get-NetAdapter -InterfaceIndex 14 | New-NetIPAddress IPAddress 192.168.3.99 -DefaultGateway 192.168.3.1 -PrefixLength 24</code>
задать/добавить статический IP-адрес<br />
<code>Set-NetIPAddress -InterfaceIndex 14 -IPAddress 192.168.3.98</code>
изменить IP-адреас на адаптере<br />
<code>Remove-NetIPAddress -InterfaceIndex 14 -IPAddress 192.168.3.99</code>
удалить IP-адрес на адаптере<br />
<code>Set-NetIPInterface -InterfaceIndex 14 -Dhcp Enabled</code>
включить DHCP</p>
<h3 id="dnsclient">DNSClient</h3>
<p><code>Get-DNSClientServerAddress</code><br />
<code>Set-DNSClientServerAddress -InterfaceIndex 14 -ServerAddresses 8.8.8.8</code></p>
<h3 id="dnscache">DNSCache</h3>
<p><code>Get-DnsClientCache</code> отобразить кэшированные записи
клиента DNS<br />
<code>Clear-DnsClientCache</code> очистить кэш</p>
<h3 id="binding">Binding</h3>
<p><code>Get-NetAdapterBinding -Name Ethernet -IncludeHidden -AllBindings</code><br />
<code>Get-NetAdapterBinding -Name "Беспроводная сеть" -DisplayName "IP версии 6 (TCP/IPv6)" | Set-NetAdapterBinding -Enabled $false</code>
отключить IPv6 на адаптере</p>
<h3 id="tcpsetting">TCPSetting</h3>
<p><code>Get-NetTCPSetting</code><br />
<code>Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CongestionProvider DCTCP</code><br />
<code>Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CwndRestart True</code><br />
<code>Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -ForceWS Disabled</code></p>
<h3 id="netstat">netstat</h3>
<p><code>netstat -anop tcp</code> -n/-f/-b<br />
<code>Get-NetTCPConnection -State Established,Listen | ? LocalPort -Match 3389</code><br />
<code>Get-NetTCPConnection -State Established,Listen | ? RemotePort -Match 22</code><br />
<code>Get-NetUDPEndpoint | ? LocalPort -Match 514</code> netstat -ap
udp`</p>
<h3 id="statistics">Statistics</h3>
<p><code>netstat -se</code><br />
<code>Get-NetAdapterStatistics</code></p>
<h3 id="hostname">hostname</h3>
<p><code>$env:computername</code><br />
<code>hostname.exe</code><br />
<code>(Get-CIMInstance CIM_ComputerSystem).Name</code><br />
<code>(New-Object -ComObject WScript.Network).ComputerName</code><br />
<code>[System.Environment]::MachineName</code><br />
<code>[System.Net.Dns]::GetHostName()</code></p>
<h3 id="arp">arp</h3>
<p><code>ipconfig /all | Select-String "физ"</code> grep<br />
<code>Get-NetNeighbor -AddressFamily IPv4</code></p>
<div class="sourceCode" id="cb25"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb25-1"><a href="#cb25-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-ARP <span class="op">{</span></span>
<span id="cb25-2"><a href="#cb25-2" aria-hidden="true" tabindex="-1"></a><span class="kw">Param</span> <span class="op">(</span></span>
<span id="cb25-3"><a href="#cb25-3" aria-hidden="true" tabindex="-1"></a><span class="va">$proxy</span><span class="op">,</span></span>
<span id="cb25-4"><a href="#cb25-4" aria-hidden="true" tabindex="-1"></a><span class="va">$search</span></span>
<span id="cb25-5"><a href="#cb25-5" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
<span id="cb25-6"><a href="#cb25-6" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(!</span><span class="va">$proxy</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb25-7"><a href="#cb25-7" aria-hidden="true" tabindex="-1"></a><span class="va">$arp</span> <span class="op">=</span> arp <span class="op">-</span>a</span>
<span id="cb25-8"><a href="#cb25-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb25-9"><a href="#cb25-9" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$proxy</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb25-10"><a href="#cb25-10" aria-hidden="true" tabindex="-1"></a><span class="va">$arp</span> <span class="op">=</span> <span class="fu">icm</span> <span class="va">$proxy</span> <span class="op">{</span>arp <span class="op">-</span>a<span class="op">}</span></span>
<span id="cb25-11"><a href="#cb25-11" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb25-12"><a href="#cb25-12" aria-hidden="true" tabindex="-1"></a><span class="va">$mac</span> <span class="op">=</span> <span class="va">$arp</span><span class="op">[</span><span class="dv">3</span><span class="op">..</span><span class="dv">260</span><span class="op">]</span></span>
<span id="cb25-13"><a href="#cb25-13" aria-hidden="true" tabindex="-1"></a><span class="va">$mac</span> <span class="op">=</span> <span class="va">$mac</span> <span class="op">-replace</span> <span class="st">&quot;^\s\s&quot;</span></span>
<span id="cb25-14"><a href="#cb25-14" aria-hidden="true" tabindex="-1"></a><span class="va">$mac</span> <span class="op">=</span> <span class="va">$mac</span> <span class="op">-replace</span> <span class="st">&quot;\s{1,50}&quot;</span><span class="op">,</span><span class="st">&quot; &quot;</span></span>
<span id="cb25-15"><a href="#cb25-15" aria-hidden="true" tabindex="-1"></a><span class="va">$mac_coll</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Collections</span><span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>System<span class="op">.</span><span class="fu">Object</span><span class="op">]</span></span>
<span id="cb25-16"><a href="#cb25-16" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$m</span> <span class="kw">in</span> <span class="va">$mac</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb25-17"><a href="#cb25-17" aria-hidden="true" tabindex="-1"></a><span class="va">$smac</span> <span class="op">=</span> <span class="va">$m</span> <span class="op">-split</span> <span class="st">&quot; &quot;</span></span>
<span id="cb25-18"><a href="#cb25-18" aria-hidden="true" tabindex="-1"></a><span class="va">$mac_coll</span><span class="op">.</span><span class="fu">Add</span><span class="op">([</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
<span id="cb25-19"><a href="#cb25-19" aria-hidden="true" tabindex="-1"></a>IP <span class="op">=</span> <span class="va">$smac</span><span class="op">[</span><span class="dv">0</span><span class="op">];</span></span>
<span id="cb25-20"><a href="#cb25-20" aria-hidden="true" tabindex="-1"></a>MAC <span class="op">=</span> <span class="va">$smac</span><span class="op">[</span><span class="dv">1</span><span class="op">];</span></span>
<span id="cb25-21"><a href="#cb25-21" aria-hidden="true" tabindex="-1"></a><span class="fu">Type</span> <span class="op">=</span> <span class="va">$smac</span><span class="op">[</span><span class="dv">2</span><span class="op">]</span></span>
<span id="cb25-22"><a href="#cb25-22" aria-hidden="true" tabindex="-1"></a><span class="op">})</span></span>
<span id="cb25-23"><a href="#cb25-23" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb25-24"><a href="#cb25-24" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$search</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb25-25"><a href="#cb25-25" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$search</span> <span class="op">-NotMatch</span> <span class="st">&quot;\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}&quot;</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb25-26"><a href="#cb25-26" aria-hidden="true" tabindex="-1"></a><span class="co">#$ns = nslookup $search</span></span>
<span id="cb25-27"><a href="#cb25-27" aria-hidden="true" tabindex="-1"></a><span class="co">#$ns = $ns[-2]</span></span>
<span id="cb25-28"><a href="#cb25-28" aria-hidden="true" tabindex="-1"></a><span class="co">#$global:ns = $ns -replace &quot;Address:\s{1,10}&quot;</span></span>
<span id="cb25-29"><a href="#cb25-29" aria-hidden="true" tabindex="-1"></a><span class="va">$rdns</span> <span class="op">=</span> Resolve-DnsName <span class="va">$search</span> <span class="op">-</span>ErrorAction Ignore</span>
<span id="cb25-30"><a href="#cb25-30" aria-hidden="true" tabindex="-1"></a><span class="va">$ns</span> <span class="op">=</span> <span class="va">$rdns</span><span class="op">.</span><span class="fu">IPAddress</span></span>
<span id="cb25-31"><a href="#cb25-31" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$ns</span> <span class="op">-eq</span> <span class="va">$null</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb25-32"><a href="#cb25-32" aria-hidden="true" tabindex="-1"></a><span class="cf">return</span></span>
<span id="cb25-33"><a href="#cb25-33" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb25-34"><a href="#cb25-34" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">else</span> <span class="op">{</span></span>
<span id="cb25-35"><a href="#cb25-35" aria-hidden="true" tabindex="-1"></a><span class="va">$ns</span> <span class="op">=</span> <span class="va">$search</span></span>
<span id="cb25-36"><a href="#cb25-36" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb25-37"><a href="#cb25-37" aria-hidden="true" tabindex="-1"></a><span class="va">$mac_coll</span> <span class="op">=</span> <span class="va">$mac_coll</span> <span class="op">|</span> <span class="op">?</span> ip <span class="op">-Match</span> <span class="va">$ns</span></span>
<span id="cb25-38"><a href="#cb25-38" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb25-39"><a href="#cb25-39" aria-hidden="true" tabindex="-1"></a><span class="va">$mac_coll</span></span>
<span id="cb25-40"><a href="#cb25-40" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Get-ARP -search 192.168.3.100</code><br />
<code>Get-ARP -search 192.168.3.100 -proxy dc-01</code></p>
<h1 id="rdp">RDP</h1>
<p><code>Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "PortNumber"</code>
отобразить номер текущего RDP порта<br />
<code>Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "PortNumber" -Value "3390"</code>
изменить RDP-порт<br />
<code>$(Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server\" -Name "fDenyTSConnections").fDenyTSConnections</code>
если 0, то включен<br />
<code>Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server\" -Name "fDenyTSConnections" -Value 0</code>
включить RDP<br />
<code>reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f</code><br />
<code>(gcim -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).SetAllowTSConnections(0)</code>
включить RDP (для Windows Server)<br />
<code>Get-Service TermService | Restart-Service -Force</code>
перезапустить rdp-службу<br />
<code>New-NetFirewallRule -Profile Any -DisplayName "RDP 3390" -Direction Inbound -Protocol TCP -LocalPort 3390</code>
открыть RDP-порт</p>
<h3 id="ipban">IPBan</h3>
<p><code>auditpol /get /category:*</code> отобразить все политики
аудита<br />
<code>auditpol /get /category:Вход/выход</code> отобразить локальные
политики аудита для Входа и Выхода из системы<br />
<code>auditpol /set /subcategory:"Вход в систему" /success:enable /failure:enable</code>
включить локальные политики - Аудит входа в систему<br />
<code>auditpol /set /subcategory:"Выход из системы" /success:enable /failure:enable</code></p>
<p><code>$url = $($(Invoke-RestMethod https://api.github.com/repos/DigitalRuby/IPBan/releases/latest).assets | Where-Object name -match ".+win.+x64.+").browser_download_url</code>
получить ссылку для загрузки последней версии<br />
<code>$version = $(Invoke-RestMethod https://api.github.com/repos/DigitalRuby/IPBan/releases/latest).tag_name</code>
получить номер последней версии<br />
<code>$path = "$home\Documents\ipban-$version"</code> путь для
установки<br />
<code>Invoke-RestMethod $url -OutFile "$home\Downloads\IPBan-$version.zip"</code>
скачать дистрибутив<br />
<code>Expand-Archive "$home\Downloads\ipban-$version.zip" -DestinationPath $path</code>
разархивировать в путь для установки<br />
<code>Remove-Item "$home\Downloads\ipban-$version.zip"</code> удалить
дистрибутив<br />
<code>sc create IPBan type=own start=delayed-auto binPath="$path\DigitalRuby.IPBan.exe" DisplayName=IPBan</code>
создать службу<br />
<code>Get-Service IPBan</code> статус службы<br />
<code>$conf = $(Get-Content "$path\ipban.config")</code> читаем
конфигурацию<br />
<code>$conf = $conf -replace '&lt;add key="Whitelist" value=""/&gt;','&lt;add key="Whitelist" value="192.168.3.0/24"/&gt;'</code>
добавить в белый лист домашнюю сеть для исключения<br />
<code>$conf = $conf -replace '&lt;add key="ProcessInternalIPAddresses" value="false"/&gt;','&lt;add key="ProcessInternalIPAddresses" value="true"/&gt;'</code>
включить обработку локальных (внутренних) ip-адресов<br />
<code>$conf = $conf -replace '&lt;add key="FailedLoginAttemptsBeforeBanUserNameWhitelist" value="20"/&gt;','&lt;add key="FailedLoginAttemptsBeforeBanUserNameWhitelist" value="5"/&gt;'</code>
указать количество попыток подключения до блокировки<br />
<code>$conf = $conf -replace '&lt;add key="ExpireTime" value="01:00:00:00"/&gt;','&lt;add key="ExpireTime" value="00:01:00:00"/&gt;'</code>
задать время блокировки 1 час<br />
<code>$conf &gt; "$path\ipban.config"</code> обновить конфигурацию<br />
<code>Get-Service IPBan | Start-Service</code> запустить службу</p>
<pre><code>Get-NetFirewallRule | Where-Object DisplayName -Match &quot;IPBan&quot; | ForEach-Object {
$Name = $_.DisplayName
Get-NetFirewallAddressFilter -AssociatedNetFirewallRule $_ | Select-Object @{Name=&quot;Name&quot;; Expression={$Name}},LocalIP,RemoteIP
} # отобразить область применения правил Брандмауэра для IPBan</code></pre>
<p><code>Get-Content -Wait "$path\logfile.txt"</code> читать лог<br />
<code>Get-Service IPBan | Stop-Service</code> остановить службу<br />
<code>sc delete IPBan</code> удалить службу</p>
<h1 id="shutdown">shutdown</h1>
<p><code>shutdown /r /o</code> перезагрузка в безопасный режим<br />
<code>shutdown /s /t 600 /c "Power off after 10 minutes"</code>
выключение<br />
<code>shutdown /s /f</code> принудительное закрытие приложений<br />
<code>shutdown /a</code> отмена<br />
<code>shutdown /r /t 0 /m \\192.168.3.100</code><br />
<code>Restart-Computer -ComputerName 192.168.3.100 -Protocol WSMan</code>
через WinRM<br />
<code>Restart-Computer ComputerName 192.168.3.100 Force</code> через
WMI<br />
<code>Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PolicyManager\default\Start\HideShutDown" -Name "value" -Value 1</code>
скрыть кнопку выключения<br />
<code>Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PolicyManager\default\Start\HideRestart" -Name "value" -Value 1</code>
скрыть кнопку перезагрузки</p>
<div class="sourceCode" id="cb27"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb27-1"><a href="#cb27-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Start-Shutdown <span class="op">{</span></span>
<span id="cb27-2"><a href="#cb27-2" aria-hidden="true" tabindex="-1"></a> <span class="co">&lt;#</span></span>
<span id="cb27-3"><a href="#cb27-3" aria-hidden="true" tabindex="-1"></a><span class="co"> .SYNOPSIS</span></span>
<span id="cb27-4"><a href="#cb27-4" aria-hidden="true" tabindex="-1"></a><span class="co"> Module for shutdown and restart the computer at a specified time</span></span>
<span id="cb27-5"><a href="#cb27-5" aria-hidden="true" tabindex="-1"></a><span class="co"> .DESCRIPTION</span></span>
<span id="cb27-6"><a href="#cb27-6" aria-hidden="true" tabindex="-1"></a><span class="co"> Example:</span></span>
<span id="cb27-7"><a href="#cb27-7" aria-hidden="true" tabindex="-1"></a><span class="co"> # Start-Shutdown -Time &quot;18:00&quot;</span></span>
<span id="cb27-8"><a href="#cb27-8" aria-hidden="true" tabindex="-1"></a><span class="co"> # Start-Shutdown -Restart -Time &quot;18:00&quot;</span></span>
<span id="cb27-9"><a href="#cb27-9" aria-hidden="true" tabindex="-1"></a><span class="co"> # Start-Shutdown -Cancel</span></span>
<span id="cb27-10"><a href="#cb27-10" aria-hidden="true" tabindex="-1"></a><span class="co"> .LINK</span></span>
<span id="cb27-11"><a href="#cb27-11" aria-hidden="true" tabindex="-1"></a><span class="co"> https://github.com/Lifailon/PS-Commands</span></span>
<span id="cb27-12"><a href="#cb27-12" aria-hidden="true" tabindex="-1"></a><span class="co"> #&gt;</span></span>
<span id="cb27-13"><a href="#cb27-13" aria-hidden="true" tabindex="-1"></a> <span class="kw">param</span><span class="op">(</span></span>
<span id="cb27-14"><a href="#cb27-14" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$Time</span><span class="op">,</span></span>
<span id="cb27-15"><a href="#cb27-15" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="dt">switch</span><span class="op">]</span><span class="va">$Restart</span><span class="op">,</span></span>
<span id="cb27-16"><a href="#cb27-16" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="dt">switch</span><span class="op">]</span><span class="va">$Cancel</span></span>
<span id="cb27-17"><a href="#cb27-17" aria-hidden="true" tabindex="-1"></a> <span class="op">)</span></span>
<span id="cb27-18"><a href="#cb27-18" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="va">$Time</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb27-19"><a href="#cb27-19" aria-hidden="true" tabindex="-1"></a> <span class="va">$currentDateTime</span> <span class="op">=</span> <span class="fu">Get-Date</span></span>
<span id="cb27-20"><a href="#cb27-20" aria-hidden="true" tabindex="-1"></a> <span class="va">$shutdownTime</span> <span class="op">=</span> <span class="fu">Get-Date</span> <span class="va">$Time</span></span>
<span id="cb27-21"><a href="#cb27-21" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="va">$shutdownTime</span> <span class="op">-lt</span> <span class="va">$currentDateTime</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb27-22"><a href="#cb27-22" aria-hidden="true" tabindex="-1"></a> <span class="va">$shutdownTime</span> <span class="op">=</span> <span class="va">$shutdownTime</span><span class="op">.</span><span class="fu">AddDays</span><span class="op">(</span><span class="dv">1</span><span class="op">)</span></span>
<span id="cb27-23"><a href="#cb27-23" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb27-24"><a href="#cb27-24" aria-hidden="true" tabindex="-1"></a> <span class="va">$timeUntilShutdown</span> <span class="op">=</span> <span class="va">$shutdownTime</span> <span class="op">-</span> <span class="va">$currentDateTime</span></span>
<span id="cb27-25"><a href="#cb27-25" aria-hidden="true" tabindex="-1"></a> <span class="va">$secondsUntilShutdown</span> <span class="op">=</span> <span class="op">[</span>math<span class="op">]::</span>Round<span class="op">(</span><span class="va">$timeUntilShutdown</span><span class="op">.</span><span class="fu">TotalSeconds</span><span class="op">)</span></span>
<span id="cb27-26"><a href="#cb27-26" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb27-27"><a href="#cb27-27" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="va">$Cancel</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb27-28"><a href="#cb27-28" aria-hidden="true" tabindex="-1"></a> <span class="fu">Start-Process</span> <span class="op">-</span>FilePath <span class="st">&quot;shutdown.exe&quot;</span> <span class="op">-</span>ArgumentList <span class="st">&quot;/a&quot;</span></span>
<span id="cb27-29"><a href="#cb27-29" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span> <span class="cf">elseif</span> <span class="op">(</span><span class="va">$Restart</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb27-30"><a href="#cb27-30" aria-hidden="true" tabindex="-1"></a> <span class="fu">Write-Host</span> <span class="st">&quot;The computer will restart after </span><span class="op">$(</span><span class="va">$timeUntilShutdown</span><span class="op">.</span><span class="fu">Hours</span><span class="op">)</span><span class="st"> hours and </span><span class="op">$(</span><span class="va">$timeUntilShutdown</span><span class="op">.</span><span class="fu">Minutes</span><span class="op">)</span><span class="st"> minutes.&quot;</span></span>
<span id="cb27-31"><a href="#cb27-31" aria-hidden="true" tabindex="-1"></a> <span class="fu">Start-Process</span> <span class="op">-</span>FilePath <span class="st">&quot;shutdown.exe&quot;</span> <span class="op">-</span>ArgumentList <span class="st">&quot;/r&quot;</span><span class="op">,</span> <span class="st">&quot;/f&quot;</span><span class="op">,</span> <span class="st">&quot;/t&quot;</span><span class="op">,</span> <span class="st">&quot;</span><span class="va">$secondsUntilShutdown</span><span class="st">&quot;</span></span>
<span id="cb27-32"><a href="#cb27-32" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span> <span class="cf">else</span> <span class="op">{</span></span>
<span id="cb27-33"><a href="#cb27-33" aria-hidden="true" tabindex="-1"></a> <span class="fu">Write-Host</span> <span class="st">&quot;The computer will shutdown after </span><span class="op">$(</span><span class="va">$timeUntilShutdown</span><span class="op">.</span><span class="fu">Hours</span><span class="op">)</span><span class="st"> hours and </span><span class="op">$(</span><span class="va">$timeUntilShutdown</span><span class="op">.</span><span class="fu">Minutes</span><span class="op">)</span><span class="st"> minutes.&quot;</span></span>
<span id="cb27-34"><a href="#cb27-34" aria-hidden="true" tabindex="-1"></a> <span class="fu">Start-Process</span> <span class="op">-</span>FilePath <span class="st">&quot;shutdown.exe&quot;</span> <span class="op">-</span>ArgumentList <span class="st">&quot;/s&quot;</span><span class="op">,</span> <span class="st">&quot;/f&quot;</span><span class="op">,</span> <span class="st">&quot;/t&quot;</span><span class="op">,</span> <span class="st">&quot;</span><span class="va">$secondsUntilShutdown</span><span class="st">&quot;</span></span>
<span id="cb27-35"><a href="#cb27-35" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb27-36"><a href="#cb27-36" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<h1 id="localaccounts">LocalAccounts</h1>
<p><code>Get-Command -Module Microsoft.PowerShell.LocalAccounts</code><br />
<code>Get-LocalUser</code> список пользователей<br />
<code>Get-LocalGroup</code> список групп<br />
<code>New-LocalUser "1C" -Password $Password -FullName "1C Domain"</code>
создать пользователя<br />
<code>Set-LocalUser -Password $Password 1C</code> изменить пароль<br />
<code>Add-LocalGroupMember -Group "Administrators" -Member "1C"</code>
добавить в группу Администраторов<br />
<code>Get-LocalGroupMember "Administrators"</code> члены группы</p>
<div class="sourceCode" id="cb28"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb28-1"><a href="#cb28-1" aria-hidden="true" tabindex="-1"></a><span class="op">@(</span><span class="st">&quot;vproxy-01&quot;</span><span class="op">,</span><span class="st">&quot;vproxy-02&quot;</span><span class="op">,</span><span class="st">&quot;vproxy-03&quot;</span><span class="op">)</span> <span class="op">|</span> <span class="op">%{</span></span>
<span id="cb28-2"><a href="#cb28-2" aria-hidden="true" tabindex="-1"></a><span class="fu">icm</span> <span class="va">$_</span> <span class="op">{</span>Add-LocalGroupMember <span class="op">-</span>Group <span class="st">&quot;Administrators&quot;</span> <span class="op">-</span>Member <span class="st">&quot;support4&quot;</span><span class="op">}</span></span>
<span id="cb28-3"><a href="#cb28-3" aria-hidden="true" tabindex="-1"></a><span class="fu">icm</span> <span class="va">$_</span> <span class="op">{</span>Get-LocalGroupMember <span class="st">&quot;Administrators&quot;</span><span class="op">}</span></span>
<span id="cb28-4"><a href="#cb28-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<h1 id="smb">SMB</h1>
<p><code>Get-SmbServerConfiguration</code><br />
<code>Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force</code>
отключить протокол SMB v1<br />
<code>Get-WindowsFeature | Where-Object {$_.name -eq "FS-SMB1"} | ft Name,Installstate</code>
модуль ServerManager, проверить установлен ли компонент SMB1<br />
<code>Install-WindowsFeature FS-SMB1</code> установить SMB1<br />
<code>Uninstall-WindowsFeature Name FS-SMB1 Remove</code> удалить SMB1
клиента (понадобится перезагрузка)<br />
<code>Get-WindowsOptionalFeature -Online</code> модуль DISM, для работы
с компонентами Windows<br />
<code>Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -Remove</code>
удалить SMB1<br />
<code>Set-SmbServerConfiguration AuditSmb1Access $true</code> включить
аудит SMB1<br />
<code>Get-SmbConnection</code> список активных сессий и используемая
версия SMB (Dialect)<br />
<code>Get-SmbOpenFile | select ClientUserName,ClientComputerName,Path,SessionID</code>
список открытых файлов<br />
<code>Get-SmbShare</code> список сетевых папок<br />
<code>New-SmbShare -Name xl-share -Path E:\test</code> создать новую
общую сетевую папку (расшарить)<br />
<code>-EncryptData $True</code> включить шифрование SMB<br />
<code>-Description</code> имя в сетевом окружении<br />
<code>-ReadAccess "domain\username"</code> доступ на чтение<br />
<code>-ChangeAccess</code> доступ на запись<br />
<code>-FullAccess</code> полный доступ<br />
<code>-NoAccess ALL</code> нет прав<br />
<code>-FolderEnumerationMode [AccessBased | Unrestricted]</code>
позволяет скрыть в сетевой папке объекты, на которых у пользователя нет
доступа с помощью Access-Based Enumeration (ABE)<br />
<code>Get-SmbShare xl-share | Set-SmbShare -FolderEnumerationMode AccessBased</code>
ключить ABE для всех расшаренных папок<br />
<code>Remove-SmbShare xl-share -force</code> удалить сетевой доступ
(шару)<br />
<code>Get-SmbShareAccess xl-share</code> вывести список доступов
безопасности к шаре<br />
<code>Revoke-SmbShareAccess xl-share -AccountName Everyone Force</code>
удалить группу из списка доступов<br />
<code>Grant-SmbShareAccess -Name xl-share -AccountName "domain\XL-Share" -AccessRight Change force</code>
изменить/добавить разрешения на запись (Full,Read)<br />
<code>Grant-SmbShareAccess -Name xl-share -AccountName "все" -AccessRight Change force</code><br />
<code>Block-SmbShareAccess -Name xl-share -AccountName "domain\noAccess" -Force</code>
принудительный запрет<br />
<code>New-SmbMapping -LocalPath X: -RemotePath \\$srv\xl-share -UserName support4 -Password password Persistent $true</code>
подключить сетевой диск<br />
<code>-Persistent</code> восстановление соединения после отключения
компьютера или сети<br />
<code>-SaveCredential</code> позволяет сохранить учетные данные
пользователя для подключения в диспетчер учетных данных Windows
Credential Manager<br />
<code>Stop-Process -Name "explorer" | Start-Process -FilePath "C:\Windows\explorer.exe"</code>
перезапустить процесс для отображения в проводнике<br />
<code>Get-SmbMapping</code> список подключенных сетевых дисков<br />
<code>Remove-SmbMapping X: -force</code> отмонтировать сетевой
диск<br />
<code>$CIMSession = New-CIMSession Computername $srv</code> создать
сеанс CIM (аудентификация на SMB)<br />
<code>Get-SmbOpenFile -CIMSession $CIMSession | select ClientUserName,ClientComputerName,Path | Out-GridView -PassThru | Close-SmbOpenFile -CIMSession $CIMSession -Confirm:$false Force</code>
закрыть файлы (открыть к ним сетевой доступ)</p>
<h3 id="get-acl">Get-Acl</h3>
<p><code>(Get-Acl \\$srv\xl-share).access</code> доступ ACL на уровне
NTFS<br />
<code>Get-Acl C:\Drivers | Set-Acl C:\Distr</code> скопировать NTFS
разрешения с одной папки и применить их на другую</p>
<h3 id="ntfssecurity">NTFSSecurity</h3>
<p><code>Install-Module -Name NTFSSecurity -force</code><br />
<code>Get-Item "\\$srv\xl-share" | Get-NTFSAccess</code><br />
<code>Add-NTFSAccess -Path "\\$srv\xl-share" -Account "domain\xl-share" -AccessRights Fullcontrol -PassThru</code>
добавить<br />
<code>Remove-NTFSAccess -Path "\\$srv\xl-share" -Account "domain\xl-share" -AccessRights FullControl -PassThru</code>
удалить<br />
<code>Get-ChildItem -Path "\\$srv\xl-share" -Recurse -Force | Clear-NTFSAccess</code>
удалить все разрешения, без удаления унаследованных разрешений<br />
<code>Get-ChildItem -Path "\\$srv\xl-share" -Recurse -Force | Enable-NTFSAccessInheritance</code>
включить NTFS наследование для всех объектов в каталоге</p>
<h3 id="storage">Storage</h3>
<p><code>Get-Command -Module Storage</code><br />
<code>Get-Disk</code> список логических дисков<br />
<code>Get-Partition</code> отобразить разделы на всех дисках<br />
<code>Get-Volume</code> список логичких разделов<br />
<code>Get-PhysicalDisk</code> список физических дисков<br />
<code>Initialize-Disk 1 PartitionStyle MBR</code> инициализировать
диск<br />
<code>New-Partition -DriveLetter D DiskNumber 1 -Size 500gb</code>
создать раздел (выделить все место -UseMaximumSize)<br />
<code>Format-Volume -DriveLetter D -FileSystem NTFS -NewFileSystemLabel Disk-D</code>
форматировать раздел<br />
<code>Set-Partition -DriveLetter D -IsActive $True</code> сделать
активным<br />
<code>Remove-Partition -DriveLetter D DiskNumber 1</code> удалить
раздел<br />
<code>Clear-Disk -Number 1 -RemoveData</code> очистить диск<br />
<code>Repair-Volume driveletter C Scan</code> Check disk<br />
<code>Repair-Volume driveletter C SpotFix</code><br />
<code>Repair-Volume driverletter C -Scan Cimsession $CIMSession</code></p>
<h3 id="iscsi">iSCSI</h3>
<p><code>New-IscsiVirtualDisk -Path D:\iSCSIVirtualDisks\iSCSI2.vhdx -Size 20GB</code>
создать динамический vhdx-диск (для фиксированного размера
-UseFixed)<br />
<code>New-IscsiServerTarget -TargetName iscsi-target-2 -InitiatorIds "IQN:iqn.1991-05.com.microsoft:srv3.contoso.com"</code>
создать Target<br />
<code>Get-IscsiServerTarget | fl TargetName, LunMappings</code><br />
<code>Connect-IscsiTarget -NodeAddress "iqn.1995-05.com.microsoft:srv2-iscsi-target-2-target" -IsPersistent $true</code>
подключиться инициатором к таргету<br />
<code>Get-IscsiTarget | fl</code><br />
<code>Disconnect-IscsiTarget -NodeAddress "iqn.1995-05.com.microsoft:srv2-iscsi-target-2-target" -Confirm:$false</code>
отключиться</p>
<h1 id="activedirectory">ActiveDirectory</h1>
<h3 id="rsat-remote-server-administration-tools">RSAT (Remote Server
Administration Tools)</h3>
<p><code>DISM.exe /Online /add-capability /CapabilityName:Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 /CapabilityName:Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0</code><br />
<code>Add-WindowsCapability online Name Rsat.Dns.Tools~~~~0.0.1.0</code><br />
<code>Add-WindowsCapability -Online -Name Rsat.DHCP.Tools~~~~0.0.1.0</code><br />
<code>Add-WindowsCapability online Name Rsat.FileServices.Tools~~~~0.0.1.0</code><br />
<code>Add-WindowsCapability -Online -Name Rsat.WSUS.Tools~~~~0.0.1.0</code><br />
<code>Add-WindowsCapability -Online -Name Rsat.CertificateServices.Tools~~~~0.0.1.0</code><br />
<code>Add-WindowsCapability -Online -Name Rsat.RemoteDesktop.Services.Tools~~~~0.0.1.0</code><br />
<code>Get-WindowsCapability -Name RSAT* -Online | Select-Object -Property DisplayName, State</code>
отобразить список установленных компанентов</p>
<h3 id="import-module-activedirectory">Import-Module
ActiveDirectory</h3>
<p><code>$Session = New-PSSession -ComputerName $srv</code> -Credential
$cred<code>\</code>Export-PSsession -Session $Session -Module
ActiveDirectory -OutputModule
ActiveDirectory<code>экспортировать модуль из удаленной сесси (например, с DC) \</code>Remove-PSSession
-Session $Session<code>\</code>Import-Module
ActiveDirectory<code>\</code>Get-Command -Module ActiveDirectory`</p>
<h3 id="adsi-active-directory-service-interface">ADSI (Active Directory
Service Interface)</h3>
<p><code>$d0 = $env:userdnsdomain</code><br />
<code>$d0 = $d0 -split "\."</code><br />
<code>$d1 = $d0[0]</code><br />
<code>$d2 = $d0[1]</code><br />
<code>$group = [ADSI]"LDAP://OU=Domain Controllers,DC=$d1,DC=$d2"</code><br />
<code>$group | select *</code></p>
<p><code>$Local_User = [ADSI]"WinNT://./Администратор,user"</code><br />
<code>$Local_User | Get-Member</code><br />
<code>$Local_User.Description</code><br />
<code>$Local_User.LastLogin</code> время последней авторизации
локального пользователя</p>
<h3 id="ldap-lightweight-directory-access-protocol">LDAP (Lightweight
Directory Access Protocol)</h3>
<p><code>$ldapsearcher = New-Object System.DirectoryServices.DirectorySearcher</code><br />
<code>$ldapsearcher.SearchRoot = "LDAP://OU=Domain Controllers,DC=$d1,DC=$d2"</code><br />
<code>$ldapsearcher.Filter = "(objectclass=computer)"</code><br />
<code>$dc = $ldapsearcher.FindAll().path</code></p>
<p><code>$usr = $env:username</code> cписок групп текущего
пользователя<br />
<code>$ldapsearcher = New-Object System.DirectoryServices.DirectorySearcher</code><br />
<code>$ldapsearcher.Filter = "(&amp;(objectCategory=User)(samAccountName=$usr))"</code><br />
<code>$usrfind = $ldapsearcher.FindOne()</code><br />
<code>$groups = $usrfind.properties.memberof -replace "(,OU=.+)"</code><br />
<code>$groups = $groups -replace "(CN=)"</code></p>
<p>DC (Domain Component) - компонент доменного имени<br />
OU (Organizational Unit) - организационные подразделения (type),
используются для упорядочения объектов<br />
Container - так же используется для упорядочения объектов, контейнеры в
отличии от подраделений не могут быть переименованы, удалены, созданы
или связаны с объектом групповой политики (Computers, Domain
Controllers, Users)<br />
DN (Distinguished Name) — уникальное имя объекта и местоположение в лесу
AD. В DN описывается содержимое атрибутов в дереве (путь навигации),
требуемое для доступа к конкретной записи или ее поиска<br />
CN (Common Name) - общее имя</p>
<p><code>(Get-ADObject (Get-ADRootDSE).DefaultNamingContext -Properties wellKnownObjects).wellKnownObjects</code>
отобразить отобразить контейнеры по умолчанию<br />
<code>redircmp OU=Client Computers,DC=root,DC=domain,DC=local</code>
изменить контейнер компьютеров по умолчанию<br />
<code>redirusr</code> изменить контейнер пользователей по умолчанию</p>
<h3 id="laps-local-admin-password-management">LAPS (Local Admin Password
Management)</h3>
<p><code>Import-module AdmPwd.ps</code> импортировать модуль<br />
<code>Get-AdmPwdPassword -ComputerName NAME</code> посмотреть
пароль<br />
<code>Reset-AdmPwdPassword -ComputerName NAME</code> изменить
пароль<br />
<code>Get-ADComputer -Filter * -SearchBase "DC=$d1,DC=$d2" | Get-AdmPwdPassword -ComputerName {$_.Name} | select ComputerName,Password,ExpirationTimestamp | Out-GridView</code><br />
<code>Get-ADComputer -Identity $srv | Get-AdmPwdPassword -ComputerName {$_.Name} | select ComputerName,Password,ExpirationTimestamp</code></p>
<h3 id="recycle-bin">Recycle Bin</h3>
<p>Удаленные объекты хранятся в корзине AD в течении времени захоронения
(определяется в атрибуте домена msDS-deletedObjectLifetime), заданном
для леса. По умолчанию это 180 дней. Если данный срок прошел, объект все
еще остается в контейнере Deleted Objects, но большинство его атрибутов
и связей очищаются (Recycled Object). После истечения периода
tombstoneLifetime (по умолчанию также 180 дней, но можно увеличить)
объект полностью удаляется из AD автоматическим процессом очистки.<br />
<code>Get-ADForest domain.local</code> отобразить уровень работы
леса<br />
<code>Set-ADForestMode -Identity domain.local -ForestMode Windows2008R2Forest -force</code>
увеличить уровень работы леса<br />
<code>Enable-ADOptionalFeature Identity "CN=Recycle Bin Feature,CN=Optional Features,CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=domain,DC=local" Scope ForestOrConfigurationSet Target "domain.local"</code>
включить корзину<br />
<code>Get-ADOptionalFeature "Recycle Bin Feature" | select-object name,EnabledScopes</code>
если значение EnabledScopes не пустое, значит в домене корзина Active
Directory включена<br />
<code>Get-ADObject -Filter 'Name -like "*tnas*"' -IncludeDeletedObjects</code>
найти удаленную (Deleted: True) УЗ (ObjectClass: user) в AD<br />
<code>Get-ADObject -Filter 'Name -like "*tnas*"' IncludeDeletedObjects -Properties *| select-object Name, sAMAccountName, LastKnownParent, memberOf, IsDeleted | fl</code>
проверить значение атрибута IsDeleted, контейнер, в котором находился
пользователе перед удалением (LastKnownParent) и список групп, в которых
он состоял<br />
<code>Get-ADObject filter {Deleted -eq $True -and ObjectClass -eq "user"} includeDeletedObjects</code>
вывести список удаленных пользователей<br />
<code>Restore-ADObject -Identity "3dc33c7c-b912-4a19-b1b7-415c1395a34e"</code>
восстановить по значению атрибута ObjectGUID<br />
<code>Get-ADObject -Filter 'SAMAccountName -eq "tnas-01"' IncludeDeletedObjects | Restore-ADObject</code>
восстановить по SAMAccountName<br />
<code>Get-ADObject -Filter {Deleted -eq $True -and ObjectClass -eq 'group' -and Name -like '*Allow*'} IncludeDeletedObjects | Restore-ADObject Verbose</code>
восстановить группу или компьютер</p>
<h3 id="thumbnailphoto">thumbnailPhoto</h3>
<p><code>$photo = [byte[]](Get-Content C:\Install\adm.jpg -Encoding byte)</code>
преобразовать файл картинки в массив байтов (jpeg/bmp файл, размером
фото до 100 Кб и разрешением 96?96)<br />
<code>Set-ADUser support4 -Replace @{thumbnailPhoto=$photo}</code>
задать значение атрибута thumbnailPhoto</p>
<h3 id="addomaincontroller">ADDomainController</h3>
<p><code>Get-ADDomainController</code> выводит информацию о текущем
контроллере домена (LogonServer), который используется данным
компьютером для аутентификации (DC выбирается при загрузке в
соответствии с топологией сайтов AD)<br />
<code>Get-ADDomainController -Discover -Service PrimaryDC</code> найти
контроллер с ролью PDC в домене<br />
<code>Get-ADDomainController -Filter * | ft HostName,IPv4Address,Name,Site,OperatingSystem,IsGlobalCatalog</code>
список все DC, принадлежность к сайту, версии ОС и GC</p>
<p>При загрузке ОС служба NetLogon делает DNS запрос со списком
контроллеров домена (к SRV записи <em>ldap._tcp.dc._msdcs.domain</em>),
DNS возвращает список DC в домене с записью Service Location (SRV).
Клиент делает LDAP запрос к DC для определения сайта AD по своему IP
адресу. Клиент через DNS запрашивает список контроллеров домена в сайте
(в разделе _tcp.sitename._sites…).</p>
<p>USN (Update Sequence Numbers) - счетчик номера последовательного
обновления, который существует у каждого объекта AD. При репликации
контроллеры обмениваются значениями USN, объект с более низким USN будет
при репликации перезаписан объектом с более высоким USN. Находится в
свойствах - Object (включить View - Advanced Features). Каждый
контроллер домена содержит отдельный счетчик USN, который начинает
отсчет в момент запуска процесса Dcpromo и продолжает увеличивать
значения в течение всего времени существования контроллера домена.
Значение счетчика USN увеличивается каждый раз, когда на контроллере
домена происходит транзакция, это операции создания, обновления или
удаления объекта.</p>
<p><code>Get-ADDomainController -Filter * | % {</code> отобразить USN
объекта на всех DC в домене<code>\</code>Get-ADUser -Server $_.HostName
-Identity support4 -Properties uSNChanged | select
SamAccountName,uSNChanged<code>\</code>}`</p>
<p><code>dcpromo /forceremoval</code> принудительно выполнит понижение в
роли контроллера домена до уровня рядового сервера. После понижения роли
выполняется удаление всех ссылок в домене на этот контроллер. Далее
производит включение сервера в состав домена, и выполнение обратного
процесса, т.е. повышение сервера до уровня контроллера домена.</p>
<h3 id="adcomputer">ADComputer</h3>
<p><code>nltest /DSGETDC:$env:userdnsdomain</code> узнать на каком DC
аудентифицирован хост (Logon Server)<br />
<code>nltest /SC_RESET:$env:userdnsdomain\srv-dc2.$env:userdnsdomain</code>
переключить компьютер на другой контроллер домена AD вручную (The
command completed successfully)<br />
<code>Get-ADComputer Identity $env:computername -Properties PasswordLastSet</code>
время последней смены пароля на сервере<br />
<code>Test-ComputerSecureChannel verbose</code> проверить доверительные
отношения с доменом (соответствует ли локальный пароль компьютера
паролю, хранящемуся в AD)<br />
<code>Reset-ComputerMachinePassword -Credential domain\admin</code>
принудительно обновить пароль<br />
<code>Netdom ResetPWD /Server:dc-01 /UserD:domain\admin /PasswordD:*</code>
сбросить хэш пароля компьютера в домене (перезагрузка не
требуется)<br />
<code>Search-ADAccount -AccountDisabled -ComputersOnly | select Name,LastLogonDate,Enabled</code>
отобразить все отключенные компьютеры</p>
<p><code>Get-ADComputer -Filter * -Properties * | select name</code>
список всех компьютеров в домене (Filter), вывести все свойства
(Properties)<br />
<code>Get-ADComputer -Identity $srv -Properties * | ft Name,LastLogonDate,PasswordLastSet,ms-Mcs-AdmPwd -Autosize</code>
конкретного компьютера в AD (Identity)<br />
<code>Get-ADComputer -SearchBase "OU=Domain Controllers,DC=$d1,DC=$d2" -Filter * -Properties * | ft Name, LastLogonDate, distinguishedName -Autosize</code>
поиск в базе по DN (SearchBase)</p>
<p><code>(Get-ADComputer -Filter {enabled -eq "true"}).count</code>
получить общее количество активных (незаблокированных) компьютеров<br />
<code>(Get-ADComputer -Filter {enabled -eq "true" -and OperatingSystem -like "*Windows Server 2016*"}).count</code>
кол-во активных копьютеров с ОС WS 2016</p>
<p><code>Get-ADComputer -Filter * -Properties * | select @{Label="Ping Status"; Expression={</code><br />
<code>$ping = ping -n 1 -w 50 $_.Name</code><br />
<code>if ($ping -match "TTL") {"Online"} else {"Offline"}</code><br />
<code>}},</code><br />
<code>@{Label="Status"; Expression={</code><br />
<code>if ($_.Enabled -eq "True") {$_.Enabled -replace "True","Active"} else {$_.Enabled -replace "False","Blocked"}</code><br />
<code>}}, Name, IPv4Address, OperatingSystem, @{Label="UserOwner"; Expression={$_.ManagedBy -replace "(CN=|,.+)"}</code><br />
<code>},Created | Out-GridView</code></p>
<h3 id="aduser">ADUser</h3>
<p><code>Get-ADUser -Identity support4 -Properties *</code> список всех
атрибутов<br />
<code>Get-ADUser -Identity support4 -Properties DistinguishedName, EmailAddress, Description</code>
путь DN, email и описание<br />
<code>Get-ADUser -Filter {(Enabled -eq "True") -and (mail -ne "null")} -Properties mail | ft Name,mail</code>
список активных пользователей и есть почтовый ящик<br />
<code>Get-ADUser -Filter {SamAccountName -like "*"} | Measure-Object</code>
посчитать кол-во всех аккаунтов (Count)<br />
<code>Get-ADUser -Filter * -Properties WhenCreated | sort WhenCreated | ft Name, whenCreated</code>
дата создания<br />
<code>Get-ADUser -Identity support4 -property LockedOut | select samaccountName,Name,Enabled,Lockedout</code><br />
<code>Enabled=True</code> учетная запись включена - да<br />
<code>Lockedout=False</code> учетная запись заблокирована (например,
политикой паролей) - нет<br />
<code>Get-ADUser -Identity support4 | Unlock-ADAccount</code>
разблокировать учетную запись<br />
<code>Disable-ADAccount -Identity support4</code> отключить учетную
запись<br />
<code>Enable-ADAccount -Identity support4</code> включить учетную
запись<br />
<code>Search-ADAccount -LockedOut</code> найти все заблокированные
учетные записи<br />
<code>Search-ADAccount -AccountDisabled | select Name,LastLogonDate,Enabled</code>
отобразить все отключенные учетные записи с временем последнего
входа</p>
<p><code>Get-ADUser -Identity support4 -Properties PasswordLastSet,PasswordExpired,PasswordNeverExpires</code><br />
<code>PasswordLastSet</code> время последней смены пароля<br />
<code>PasswordExpired=False</code> пароль истек - нет<br />
<code>PasswordNeverExpires=True</code> срок действия пароля не истекает
- да<br />
<code>Set-ADAccountPassword support4 -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "password" -Force -Verbose)</code>
изменить пароль учетной записи<br />
<code>Set-ADUser -Identity support4 -ChangePasswordAtLogon $True</code>
смена пароля при следующем входе в систему</p>
<p><code>$day = (Get-Date).adddays(-90)</code><br />
<code>Get-ADUser -filter {(passwordlastset -le $day)} | ft</code>
пользователи, которые не меняли свой пароль больше 90 дней</p>
<p><code>$day = (Get-Date).adddays(-30)</code><br />
<code>Get-ADUser -filter {(Created -ge $day)} -Property Created | select Name,Created</code>
Новые пользователи за 30 дней</p>
<p><code>$day = (Get-Date).adddays(-360)</code><br />
<code>Get-ADUser -Filter {(LastLogonTimestamp -le $day)} -Property LastLogonTimestamp | select Name,SamAccountName,@{n='LastLogonTimestamp';e={[DateTime]::FromFileTime($_.LastLogonTimestamp)}} | sort -Descending LastLogonTimestamp</code>
пользователи, которые не логинились больше 360 дней. Репликация атрибута
LastLogonTimestamp составляет от 9 до 14 дней.<br />
<code>| Disable-ADAccount $_.SamAccountName</code> заблокировать<br />
<code>-WhatIf</code> отобразить вывод без применения изменений</p>
<h3 id="adgroupmember">ADGroupMember</h3>
<p><code>(Get-ADUser -Identity support4 -Properties MemberOf).memberof</code>
список групп в которых состоит пользователь<br />
<code>Get-ADGroupMember -Identity "Domain Admins" | Select Name,SamAccountName</code>
список пользователей в группе<br />
<code>Add-ADGroupMember -Identity "Domain Admins" -Members support5</code>
добавить в группу<br />
<code>Remove-ADGroupMember -Identity "Domain Admins" -Members support5 -force</code>
удалить из группы<br />
<code>Get-ADGroup -filter * | where {!($_ | Get-ADGroupMember)} | Select Name</code>
отобразить список пустых групп (-Not)</p>
<h3 id="adreplication">ADReplication</h3>
<p><code>Get-Command -Module ActiveDirectory -Name *Replication*</code>
список всех командлетов модуля<br />
<code>Get-ADReplicationFailure -Target dc-01</code> список ошибок
репликации с партнерами<br />
<code>Get-ADReplicationFailure -Target $env:userdnsdomain -Scope Domain</code><br />
<code>Get-ADReplicationPartnerMetadata -Target dc-01 | select Partner,LastReplicationAttempt,LastReplicationSuccess,LastReplicationResult,LastChangeUsn</code>
время последней и время успешной репликации с партнерами<br />
<code>Get-ADReplicationUpToDatenessVectorTable -Target dc-01</code>
Update Sequence Number (USN) увеличивается каждый раз, когда на
контроллере домена происходит транзакция (операции создания, обновления
или удаления объекта), при репликации DC обмениваются значениями USN,
объект с более низким USN при репликации будет перезаписан высоким
USN.</p>
<h1 id="repadmin">repadmin</h1>
<p><code>repadmin /replsummary</code> отображает время последней
репликации на всех DC по направлению (Source и Destination) и их
состояние с учетом партнеров<br />
<code>repadmin /showrepl $srv</code> отображает всех партнеров по
реплкации и их статус для всех разделов Naming Contexts
(DC=ForestDnsZones, DC=DomainDnsZones, CN=Schema,
CN=Configuration)<br />
<code>repadmin /replicate $srv2 $srv1 DC=domain,DC=local</code>
выполнить репликацию с $srv1 на $srv2 только указанный раздела
домена<br />
<code>repadmin /SyncAll /AdeP</code> запустить межсайтовую исходящую
репликацию всех разделов от текущего сервера со всеми партнерами по
репликации<br />
<code>/A</code> выполнить для всех разделов NC<br />
<code>/d</code> в сообщениях идентифицировать серверы по DN (вместо GUID
DNS - глобальным уникальным идентификаторам)<br />
<code>/e</code> межсайтовая синхронизация (по умолчанию синхронизирует
только с DC текущего сайта)<br />
<code>/P</code> извещать об изменениях с этого сервера (по умолчанию:
опрашивать об изменениях)<br />
<code>repadmin /Queue $srv</code> отображает кол-во запросов входящей
репликации (очередь), которое необходимо обработать (причиной может быть
большое кол-во партнеров или формирование 1000 объектов скриптом)<br />
<code>repadmin /showbackup *</code> узнать дату последнего Backup</p>
<p><code>Error: 1722</code> сервер rpc недоступен (ошибка отката
репликации). Проверить имя домена в настройках сетевого адаптера, первым
должен идти адрес DNS-сервера другого контроллера домена, вторым свой
адрес.<br />
<code>Get-Service -ComputerName $srv | select name,status | ? name -like "RpcSs"</code><br />
<code>Get-Service -ComputerName $srv -Name RpcSs -RequiredServices</code>
зависимые службы<br />
Зависимые службы RPC:<br />
“Служба сведений о подключенных сетях” - должен быть включен отложенный
запуск. Если служба срабатывает до “службы списка сетей”, может падать
связь с доменом (netlogon)<br />
“Центр распространения ключей Kerberos”<br />
“DNS-сервер”<br />
<code>nslookup $srv</code><br />
<code>tnc $srv -p 135</code><br />
<code>repadmin /retry</code> повторить попытку привязки к целевому DC,
если была ошибка 1722 или 1753 (RPC недоступен)</p>
<p><code>repadmin /showrepl $srv</code><br />
<code>Last attempt @ 2022-07-15 10:46:01 завершена с ошибкой, результат 8456 (0x2108)</code>
при проверки showrepl этого партнера, его ошибка: 8457 (0x2109)<br />
<code>Last success @ 2022-07-11 02:29:46</code> последний успех<br />
Когда репликация автоматически отключена, ОС записывает в DSA - not
writable одно из четырех значений:<br />
<code>Path: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NTDS\Parameters</code><br />
<code>Dsa Not Writable</code><br />
<code>#define DSA_WRITABLE_GEN 1</code> версия леса несовместима с
ОС<br />
<code>#define DSA_WRITABLE_NO_SPACE 2</code> на диске, где размещена
база данных Active Directory или файлы журналов (логи), недостаточно
свободного места<br />
<code>#define DSA_WRITABLE_USNROLLBCK 4</code> откат USN произошел из-за
неправильного отката базы данных Active Directory во времени
(восстановление из снапшота)<br />
<code>#define DSA_WRITABLE_CORRUPT_UTDV 8</code> вектор актуальности
поврежден на локальном контроллере домена</p>
<h1 id="dcdiag">dcdiag</h1>
<p><code>dcdiag /s:&lt;DomainController&gt; [/n:&lt;NamingContext&gt;] [[/u:&lt;domain\user&gt;] [/p:&lt;password&gt;]] [{/a|/e}{/q|/v}] [/f:&lt;LogFile&gt;] [/ferr:&lt;ErrorLog&gt;] [/test:&lt;test&gt;] [/fix]</code><br />
<code>dcdiag /Test:replications /s:dc-01</code> отображает ошибки
репликации<br />
<code>dcdiag /Test:DNS /e /v /q</code> тест DNS<br />
<code>/a</code> проверка всех серверов данного сайта<br />
<code>/e</code> проверка всех серверов предприятия<br />
<code>/q</code> выводить только сообщения об ошибках<br />
<code>/v</code> выводить подробную информацию<br />
<code>/fix</code> автоматически исправляет ошибки<br />
<code>/test:</code><br />
<code>NetLogons</code> проверка наличие прав на выполнение
репликации<br />
<code>Connectivity</code> проверяет регистрацию DNS для каждого
контроллера домена, отправляет тестовый эхо-пакет на каждый контроллер
домена и проверяет подключение по протоколам LDAP и RPC к каждому
контроллеру домена<br />
<code>Services</code> проверяет работоспособность всех служб,
необходимых для работы контроллера домена, на указанном контроллере
домена<br />
<code>Systemlog</code> проверяет наличие ошибок в журналах контроллера
домена<br />
<code>FRSEvent</code> проверяет ошибки репликации в работе службы
репликации файлов, что может означать наличие проблем в репликации
SYSVOL и, таким образом, целостности копий объектов групповых
политик<br />
<code>FSMOCheck</code> не проверяет роли хозяев операций, а вместо этого
запрашивает сервер глобального каталога, первичный контроллер домена,
предпочтительный сервер времени, сервер времени и центр распространения
ключей (контроллер домена может подключиться к KDC, PDC, серверу
глобального каталога)<br />
<code>KnowsOfRoleHolders</code> пgроверяет возможность подключения
контроллеров домена ко всем пяти хозяевам операций (ролями FSMO)<br />
<code>MachineAccount</code> проверяет правильность регистрации учетной
записи целевого компьютера и правильность объявлений служб этого
компьютера (корректность доверительных отношения с доменом). Если
обнаружена ошибка, ее можно исправить с помощью утилиты dcdiag, указав
параметры /fixmachineaccount или /recreatemachineaccount<br />
<code>Advertising</code> проверяет, правильно ли контроллер домена
сообщает о себе и о своей роли хозяина операций. Этот тест завершиться
неудачно, если служба NetLogon не запущена<br />
<code>CheckSDRefDom</code> проверяет правильность доменов ссылок
дескрипторов безопасности для каждого раздела каталогов программ<br />
<code>CrossRefValidation</code> проверяет правильность перекрестных
ссылок для доменов<br />
<code>RRSSysvol</code> проверяет состояние готовности для FRS
SYSVOL<br />
<code>Intersite</code> проверяет наличие ошибок, которые могут помешать
нормальной репликации между сайтами. Компания Microsoft предупреждает,
что иногда результаты этого теста могут оказаться неточными<br />
<code>KCCEvent</code> проверяет безошибочность создания объектов
соединений для репликации между сайтами<br />
<code>NCSecDesc</code> проверяет правильность разрешений для репликации
в дескрипторах безопасности для заголовков контекста именования<br />
<code>ObjectsReplicated</code> проверяет правильность репликации агента
сервера каталогов и объектов учетных записей компьютеров<br />
<code>OutboundSecureChannels</code> проверяется наличие безопасных
каналов между всеми контроллерами домена в интересующем домене<br />
<code>Replications</code> проверяет возможность репликации между
контроллерами домена и сообщает обо всех ошибках при репликации<br />
<code>RidManager</code> проверяет работоспособность и доступность
хозяина относительных идентификаторов<br />
<code>VerifyEnterpriseReferences</code> проверяет действительность
системных ссылок службы репликации файлов для всех объектов на всех
контроллерах домена в лесу<br />
<code>VerifyReferences</code> проверяет действительность системных
ссылок службы репликации файлов для всех объектов на указанном
контроллере домена<br />
<code>VerifyReplicas</code> проверяет действительность всех разделов
каталога приложения на всех серверах, принимающих участие в
репликации</p>
<h1 id="ntdsutil">ntdsutil</h1>
<p>Перенос БД AD (ntds.dit):<br />
<code>Get-Acl C:\Windows\NTDS | Set-Acl D:\AD-DB</code> скопировать NTFS
разрешения на новый каталог<br />
<code>Stop-Service -ComputerName dc -name NTDS</code> остановить службу
Active Directory Domain Services<br />
<code>ntdsutil</code> запустить утилиту ntdsutil<br />
<code>activate instance NTDS</code> выбрать активный экземпляр базы
AD<br />
<code>files</code> перейдем в контекст files, в котором возможно
выполнение операция с файлами базы ntds.dit<br />
<code>move DB to D:\AD-DB\</code> перенести базу AD в новый каталог
(предварительно нужно его создать)<br />
<code>info</code> проверить, что БД находится в новом каталоге<br />
<code>move logs to D:\AD-DB\</code> переместим в тот же каталог файлы с
журналами транзакций<br />
<code>quit</code><br />
<code>Start-Service -ComputerName dc -name NTDS</code></p>
<p>Сброс пароля DSRM (режим восстановления служб каталогов):<br />
<code>ntdsutil</code><br />
<code>set dsrm password</code><br />
<code>reset password on server NULL</code><br />
новый пароль<br />
подтверждение пароля<br />
<code>quit</code><br />
<code>quit</code></p>
<p>Синхронизировать с паролем УЗ в AD:<br />
<code>ntdsutil</code><br />
<code>set dsrm password</code><br />
<code>sync from domain account dsrmadmin</code><br />
<code>quit</code><br />
<code>quit</code></p>
<p>Ошибка 0x00002e2 при загрузке ОС.<br />
Загрузиться в режиме восстанавления WinRE (Windows Recovery Environment)
- Startup Settings - Restart - DSRM (Directory Services Restore
Mode)<br />
<code>reagentc /boottore</code> shutdown /f /r /o /t 0 перезагрузка в
режиме WinRE - ОС на базе WinPE (Windows Preinstallation Environment),
образ winre.wim находится на скрытом разделе System Restore<br />
На контроллере домена единственная локальная учетная запись —
администратор DSRM. Пароль создается при установке роли контроллера
домена ADDS на сервере (SafeModeAdministratorPassword).<br />
<code>ntdsutil</code><br />
<code>activate instance ntds</code><br />
<code>Files</code><br />
<code>Info</code><br />
<code>integrity</code> проверить целостность БД<br />
Ошибка: Failed to open DIT for AD DS/LDS instance NTDS. Error
-2147418113<br />
<code>mkdir c:\ntds_bak</code><br />
<code>xcopy c:\Windows\NTDS\*.* c:\ntds_bak</code> backup содержимого
каталога с БД<br />
<code>esentutl /g c:\windows\ntds\ntds.dit</code> проверим целостность
файла<br />
Вывод: Integrity check completed. Database is CORRUPTED ошибка, база AD
повреждена<br />
<code>esentutl /p c:\windows\ntds\ntds.dit</code> исправить ошибки<br />
Вывод: Operation completed successfully in xx seconds. нет ошибок<br />
<code>esentutl /g c:\windows\ntds\ntds.dit</code> проверим целостность
файла<br />
Выполнить анализ семантики базы с помощью ntdsutil:<br />
<code>ntdsutil</code><br />
<code>activate instance ntds</code><br />
<code>semantic database analysis</code><br />
<code>go</code><br />
<code>go fixup</code> исправить семантические ошибки<br />
Сжать файл БД:<br />
<code>activate instance ntds</code><br />
<code>files</code><br />
<code>compact to C:\Windows\NTDS\TEMP</code><br />
<code>copy C:\Windows\NTDS\TEMP\ntds.dit C:\Windows\NTDS\ntds.dit</code>
заменить оригинальный файл ntds.dit<br />
<code>Del C:\Windows\NTDS\*.log</code> удалить все лог файлы из каталога
NTDS</p>
<h1 id="gpo">GPO</h1>
<p><code>Get-Command -Module GroupPolicy</code><br />
<code>Get-GPO -Domain domain.local -All | ft</code><br />
<code>Get-GPO -Name LAPS</code><br />
<code>[xml](Get-GPOReport LAPS -ReportType Xml)</code><br />
<code>Get-GPPermission -Name LAPS -All</code><br />
<code>Get-GPO LAPS | New-GPLink -Target "ou=servers,dc=domain,dc=local"</code><br />
<code>Set-GPLink -Name LAPS -Target "ou=servers,dc=domain,dc=local" -LinkEnabled No</code><br />
<code>Backup-GPO -Name LAPS -Path "$home\Desktop"</code><br />
<code>Backup-GPO -All -Path "$home\Desktop"</code><br />
<code>Restore-GPO -Name LAPS -Path C:\Backup\GPOs\</code></p>
<h1 id="servermanager">ServerManager</h1>
<p><code>Get-Command *WindowsFeature*</code> source module
ServerManager<br />
<code>Get-WindowsFeature -ComputerName "localhost"</code><br />
<code>Get-WindowsFeature | where Installed -eq $True</code> список
установленных ролей и компонентов<br />
<code>Get-WindowsFeature | where FeatureType -eq "Role"</code>
отсортировать по списку ролей<br />
<code>Install-WindowsFeature -Name DNS</code> установить роль<br />
<code>Get-Command *DNS*</code><br />
<code>Get-DnsServerSetting -ALL</code><br />
<code>Uninstall-WindowsFeature -Name DNS</code> удалить роль</p>
<h3 id="pswa">PSWA</h3>
<p><code>Install-WindowsFeature -Name WindowsPowerShellWebAccess -IncludeManagementTools</code><br />
<code>Install-PswaWebApplication -UseTestCertificate</code> Создать
веб-приложение /pswa<br />
<code>Add-PswaAuthorizationRule -UserGroupName "$domain\Domain Admins" -ComputerName * -ConfigurationName * -RuleName "For Admins"</code>
добавить права авторизации</p>
<h3 id="wsb-windows-server-backup">WSB (Windows Server Backup)</h3>
<p>При создании backup DC через WSB, создается копия состояния системы
(System State), куда попадает база AD (NTDS.DIT), объекты групповых
политик, содержимое каталога SYSVOL, реестр, метаданные IIS, база AD CS,
и другие системные файлы и ресурсы. Резервная копия создается через
службу теневого копирования VSS.<br />
<code>Get-WindowsFeature Windows-Server-Backup</code> проверить
установлена ли роль<br />
<code>Add-Windowsfeature Windows-Server-Backup Includeallsubfeature</code>
установить роль</p>
<div class="sourceCode" id="cb29"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb29-1"><a href="#cb29-1" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span><span class="op">=</span><span class="st">&quot;\\</span><span class="va">$srv</span><span class="st">\bak-dc\dc-03\&quot;</span></span>
<span id="cb29-2"><a href="#cb29-2" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$TargetUNC</span><span class="op">=</span><span class="va">$path</span><span class="op">+(</span><span class="fu">get-date</span> <span class="op">-</span>f <span class="st">&#39;yyyy-MM-dd&#39;</span><span class="op">)</span></span>
<span id="cb29-3"><a href="#cb29-3" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">((</span><span class="fu">Test-Path</span> <span class="op">-</span>Path <span class="va">$path</span><span class="op">)</span> <span class="op">-eq</span> <span class="va">$true</span><span class="op">)</span> <span class="op">{</span><span class="fu">New-Item</span> <span class="op">-</span>Path <span class="va">$TargetUNC</span> <span class="op">-</span>ItemType directory<span class="op">}</span> <span class="co"># если путь доступен, создать новую директорию по дате</span></span>
<span id="cb29-4"><a href="#cb29-4" aria-hidden="true" tabindex="-1"></a><span class="va">$WBadmin_cmd</span> <span class="op">=</span> <span class="st">&quot;wbadmin.exe START BACKUP -backupTarget:</span><span class="va">$TargetUNC</span><span class="st"> -systemState -noverify -vssCopy -quiet&quot;</span></span>
<span id="cb29-5"><a href="#cb29-5" aria-hidden="true" tabindex="-1"></a><span class="co"># $WBadmin_cmd = &quot;wbadmin start backup -backuptarget:$path -include:C:\Windows\NTDS\ntds.dit -quiet&quot; # Backup DB NTDS</span></span>
<span id="cb29-6"><a href="#cb29-6" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-Expression</span> <span class="va">$WBadmin_cmd</span></span></code></pre></div>
<h3 id="rds">RDS</h3>
<p><code>Get-Command -Module RemoteDesktop</code><br />
<code>Get-RDServer -ConnectionBroker $broker</code> список всех серверов
в фермеы, указывается полное доменное имя при обращение к серверу с
ролью RDCB<br />
<code>Get-RDRemoteDesktop -ConnectionBroker $broker</code> список
коллекций<br />
<code>(Get-RDLicenseConfiguration -ConnectionBroker $broker | select *).LicenseServer</code>
список серверов с ролью RDL<br />
<code>Get-RDUserSession -ConnectionBroker $broker</code> список всех
активных пользователей<br />
<code>Disconnect-RDUser -HostServer $srv -UnifiedSessionID $id -Force</code>
отключить сессию пользователя<br />
<code>Get-RDAvailableApp -ConnectionBroker $broker -CollectionName C03</code>
список установленного ПО на серверах в коллекции<br />
<code>(Get-RDSessionCollectionConfiguration -ConnectionBroker $broker -CollectionName C03 | select *).CustomRdpProperty</code>
use redirection server name:i:1<br />
<code>Get-RDConnectionBrokerHighAvailability</code></p>
<h1 id="dnsserver">DNSServer</h1>
<p><code>Get-Command -Module DnsServer</code><br />
<code>Show-DnsServerCache</code> отобразить весь кэш DNS-сервера<br />
<code>Show-DnsServerCache | where HostName -match ru</code><br />
<code>Clear-DnsServerCache</code><br />
<code>Get-DnsServerCache</code><br />
<code>Get-DnsServerDiagnostics</code></p>
<div class="sourceCode" id="cb30"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb30-1"><a href="#cb30-1" aria-hidden="true" tabindex="-1"></a><span class="va">$zone</span> <span class="op">=</span> <span class="fu">icm</span> <span class="va">$srv</span> <span class="op">{</span>Get-DnsServerZone<span class="op">}</span> <span class="op">|</span> <span class="fu">select</span> ZoneName<span class="op">,</span>ZoneType<span class="op">,</span>DynamicUpdate<span class="op">,</span>ReplicationScope<span class="op">,</span>SecureSecondaries<span class="op">,</span></span>
<span id="cb30-2"><a href="#cb30-2" aria-hidden="true" tabindex="-1"></a>DirectoryPartitionName <span class="op">|</span> <span class="fu">Out-GridView</span> <span class="op">-</span>Title <span class="st">&quot;DNS Server: </span><span class="va">$srv</span><span class="st">&quot;</span> PassThru</span>
<span id="cb30-3"><a href="#cb30-3" aria-hidden="true" tabindex="-1"></a><span class="va">$zone_name</span> <span class="op">=</span> <span class="va">$zone</span><span class="op">.</span><span class="fu">ZoneName</span></span>
<span id="cb30-4"><a href="#cb30-4" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$zone_name</span> <span class="op">-ne</span> <span class="va">$null</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb30-5"><a href="#cb30-5" aria-hidden="true" tabindex="-1"></a><span class="fu">icm</span> <span class="va">$srv</span> <span class="op">{</span>Get-DnsServerResourceRecord <span class="op">-</span>ZoneName <span class="va">$using</span><span class="op">:</span><span class="va">zone_name</span> <span class="op">|</span> <span class="fu">sort</span> RecordType <span class="op">|</span> <span class="fu">select</span> RecordType<span class="op">,</span>HostName<span class="op">,</span> @<span class="op">{</span></span>
<span id="cb30-6"><a href="#cb30-6" aria-hidden="true" tabindex="-1"></a>Label<span class="op">=</span><span class="st">&quot;IPAddress&quot;</span><span class="op">;</span> Expression<span class="op">={</span><span class="va">$_</span><span class="op">.</span><span class="fu">RecordData</span><span class="op">.</span><span class="fu">IPv4Address</span><span class="op">.</span><span class="fu">IPAddressToString</span><span class="op">}},</span>TimeToLive<span class="op">,</span>Timestamp</span>
<span id="cb30-7"><a href="#cb30-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">|</span> <span class="fu">select</span> RecordType<span class="op">,</span>HostName<span class="op">,</span>IPAddress<span class="op">,</span>TimeToLive<span class="op">,</span>Timestamp <span class="op">|</span> <span class="fu">Out-GridView</span> <span class="op">-</span>Title <span class="st">&quot;DNS Server: </span><span class="va">$srv</span><span class="st">&quot;</span></span>
<span id="cb30-8"><a href="#cb30-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Sync-DnsServerZone passthru</code> синхронизировать зоны с
другими DC в домене<br />
<code>Remove-DnsServerZone -Name domain.local</code> удалить зону<br />
<code>Get-DnsServerResourceRecord -ZoneName domain.local -RRType A</code>
вывести все А-записи в указанной зоне<br />
<code>Add-DnsServerResourceRecordA -Name new-host-name -IPv4Address 192.168.1.100 -ZoneName domain.local -TimeToLive 01:00:00 -CreatePtr</code>
создать А-запись и PTR для нее<br />
<code>Remove-DnsServerResourceRecord -ZoneName domain.local -RRType A -Name new-host-name Force</code>
удалить А-запись</p>
<div class="sourceCode" id="cb31"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb31-1"><a href="#cb31-1" aria-hidden="true" tabindex="-1"></a><span class="va">$DNSServer</span> <span class="op">=</span> <span class="st">&quot;DC-01&quot;</span></span>
<span id="cb31-2"><a href="#cb31-2" aria-hidden="true" tabindex="-1"></a><span class="va">$DNSFZone</span> <span class="op">=</span> <span class="st">&quot;domain.com&quot;</span></span>
<span id="cb31-3"><a href="#cb31-3" aria-hidden="true" tabindex="-1"></a><span class="va">$DataFile</span> <span class="op">=</span> <span class="st">&quot;C:\Scripts\DNS-Create-A-Records-from-File.csv&quot;</span></span>
<span id="cb31-4"><a href="#cb31-4" aria-hidden="true" tabindex="-1"></a><span class="co"># cat $DataFile</span></span>
<span id="cb31-5"><a href="#cb31-5" aria-hidden="true" tabindex="-1"></a><span class="co"># &quot;HostName;IP&quot;</span></span>
<span id="cb31-6"><a href="#cb31-6" aria-hidden="true" tabindex="-1"></a><span class="co"># &quot;server-01;192.168.1.10&quot;</span></span>
<span id="cb31-7"><a href="#cb31-7" aria-hidden="true" tabindex="-1"></a><span class="va">$DNSRR</span> <span class="op">=</span> <span class="op">[</span>WmiClass<span class="op">]</span><span class="st">&quot;\\</span><span class="va">$DNSServer</span><span class="st">\root\MicrosoftDNS:MicrosoftDNS_ResourceRecord&quot;</span></span>
<span id="cb31-8"><a href="#cb31-8" aria-hidden="true" tabindex="-1"></a><span class="va">$ConvFile</span> <span class="op">=</span> <span class="va">$DataFile</span> <span class="op">+</span> <span class="st">&quot;_unicode&quot;</span></span>
<span id="cb31-9"><a href="#cb31-9" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Content</span> <span class="va">$DataFile</span> <span class="op">|</span> <span class="fu">Set-Content</span> <span class="va">$ConvFile</span> <span class="op">-</span>Encoding Unicode</span>
<span id="cb31-10"><a href="#cb31-10" aria-hidden="true" tabindex="-1"></a><span class="fu">Import-CSV</span> <span class="va">$ConvFile</span> <span class="op">-</span>Delimiter <span class="st">&quot;;&quot;</span> <span class="op">|</span> <span class="fu">ForEach-Object</span> <span class="op">{</span></span>
<span id="cb31-11"><a href="#cb31-11" aria-hidden="true" tabindex="-1"></a><span class="va">$FQDN</span> <span class="op">=</span> <span class="va">$_</span><span class="op">.</span><span class="fu">HostName</span> <span class="op">+</span> <span class="st">&quot;.&quot;</span> <span class="op">+</span> <span class="va">$DNSFZone</span></span>
<span id="cb31-12"><a href="#cb31-12" aria-hidden="true" tabindex="-1"></a><span class="va">$IP</span> <span class="op">=</span> <span class="va">$_</span><span class="op">.</span><span class="fu">HostIP</span></span>
<span id="cb31-13"><a href="#cb31-13" aria-hidden="true" tabindex="-1"></a><span class="va">$TextA</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$FQDN</span><span class="st"> IN A </span><span class="va">$IP</span><span class="st">&quot;</span></span>
<span id="cb31-14"><a href="#cb31-14" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Void<span class="op">]</span><span class="va">$DNSRR</span><span class="op">.</span><span class="fu">CreateInstanceFromTextRepresentation</span><span class="op">(</span><span class="va">$DNSServer</span><span class="op">,</span><span class="va">$DNSFZone</span><span class="op">,</span><span class="va">$TextA</span><span class="op">)</span></span>
<span id="cb31-15"><a href="#cb31-15" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<h1 id="dhcpserver">DHCPServer</h1>
<p><code>Get-Command -Module DhcpServer</code></p>
<div class="sourceCode" id="cb32"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb32-1"><a href="#cb32-1" aria-hidden="true" tabindex="-1"></a><span class="va">$mac</span> <span class="op">=</span> <span class="fu">icm</span> <span class="va">$srv</span> <span class="op">-</span>ScriptBlock <span class="op">{</span>Get-DhcpServerv4Scope <span class="op">|</span> Get-DhcpServerv4Lease<span class="op">}</span> <span class="op">|</span> <span class="fu">select</span> AddressState<span class="op">,</span></span>
<span id="cb32-2"><a href="#cb32-2" aria-hidden="true" tabindex="-1"></a>HostName<span class="op">,</span>IPAddress<span class="op">,</span>ClientId<span class="op">,</span>DnsRegistration<span class="op">,</span>DnsRR<span class="op">,</span>ScopeId<span class="op">,</span>ServerIP <span class="op">|</span> <span class="fu">Out-GridView</span> <span class="op">-</span>Title <span class="st">&quot;HDCP Server: </span><span class="va">$srv</span><span class="st">&quot;</span> PassThru</span>
<span id="cb32-3"><a href="#cb32-3" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="fu">New-Object</span> <span class="op">-</span>ComObject Wscript<span class="op">.</span><span class="fu">Shell</span><span class="op">).</span><span class="fu">Popup</span><span class="op">(</span><span class="va">$mac</span><span class="op">.</span><span class="fu">ClientId</span><span class="op">,</span><span class="dv">0</span><span class="op">,</span><span class="va">$mac</span><span class="op">.</span><span class="fu">HostName</span><span class="op">,</span><span class="dv">64</span><span class="op">)</span></span></code></pre></div>
<p><code>Add-DhcpServerv4Reservation -ScopeId 192.168.1.0 -IPAddress 192.168.1.10 -ClientId 00-50-56-C0-00-08 -Description "new reservation"</code></p>
<h1 id="dfs">DFS</h1>
<p><code>dfsutil /root:\\domain.sys\public /export:C:\export-dfs.txt</code>
экспорт конфигурации namespace root<br />
<code>dfsutil /AddFtRoot /Server:\\$srv /Share:public</code> на новой
машине предварительно создать корень на основе домена<br />
<code>dfsutil /root:\\domain.sys\public /import:C:\export-dfs.txt /&lt;verify /set</code>
Import (перед импортом данных в существующий корень DFS, утилита создает
резервную копию конфигурации корня в текущем каталоге, из которого
запускается утилита dfsutil)<br />
<code>/verify</code> выводит изменения, которые будут внесены в процессе
импорта, без применения<br />
<code>/set</code> меняет целевое пространство имен путем полной
перезаписи и замены на конфигурацию пространства имен из импортируемого
файла<br />
<code>/merge</code> импортирует конфигурацию пространства имен в
дополнение к существующей конфигурации для слияния, параметры из файла
конфигурации будут иметь больший приоритет, чем существующие параметры
пространства имен</p>
<p><code>Export-DfsrClone</code> экспортирует клонированную базу данных
репликации DFS и параметры конфигурации тома<br />
<code>Get-DfsrCloneState</code> получает состояние операции клонирования
базы данных<br />
<code>Import-DfsrClone</code> импортирует клонированную базу данных
репликации DFS и параметры конфигурации тома</p>
<p><code>net use x: \\$srv1\public\*</code> примонтировать диск<br />
<code>Get-DfsrFileHash x:\* | Out-File C:\$srv1.txt</code> забрать hash
всех файлов диска в файл (файлы с одинаковыми хешами всегда являются
точными копиями друг друга)<br />
<code>net use x: /d</code> отмонтировать<br />
<code>net use x: \\$srv2\public\*</code><br />
<code>Get-DfsrFileHash x:\* | Out-File C:\$srv2.txt</code><br />
<code>net use x: /d</code><br />
<code>Compare-Object -ReferenceObject (Get-Content C:\$srv1.txt) -DifferenceObject (Get-Content C:\$srv2.txt) -IncludeEqual</code>
сравнить содержимое файлов</p>
<p><code>Get-DfsrBacklog -DestinationComputerName "fs-06" -SourceComputerName "fs-05" -GroupName "folder-rep" -FolderName "folder" -Verbose</code>
получает список ожидающих обновлений файлов между двумя партнерами
репликации DFS<br />
<code>Get-DfsrConnection</code> отображает группы репликации, участников
и статус<br />
<code>Get-DfsReplicatedFolder</code> отображает имя и полный путь к
папкам реликации в системе DFS<br />
<code>Get-DfsrState -ComputerName fs-06 -Verbose</code> состояние
репликации DFS для члена группы<br />
<code>Get-DfsReplicationGroup</code> отображает группы репликации и их
статус<br />
<code>Add-DfsrConnection</code> создает соединение между членами группы
репликации<br />
<code>Add-DfsrMember</code> добавляет компьютеры в группу
репликации<br />
<code>ConvertFrom-DfsrGuid</code> преобразует идентификаторы GUID в
понятные имена в заданной группы репликации<br />
<code>Get-DfsrConnectionSchedule</code> получает расписание соединений
между членами группы репликации<br />
<code>Get-DfsrGroupSchedule</code> извлекает расписание группы
репликации<br />
<code>Get-DfsrIdRecord</code> получает записи ID для реплицированных
файлов или папок из базы данных репликации DFS<br />
<code>Get-DfsrMember</code> получает компьютеры в группе
репликации<br />
<code>Get-DfsrMembership</code> получает параметры членства для членов
групп репликации<br />
<code>Get-DfsrPreservedFiles</code> получает список файлов и папок,
ранее сохраненных репликацией DFS<br />
<code>Get-DfsrServiceConfiguration</code> получает параметры службы
репликации DFS для членов группы<br />
<code>Grant-DfsrDelegation</code> предоставляет разрешения участникам
безопасности для группы репликации<br />
<code>Revoke-DfsrDelegation</code> отменяет разрешения участников
безопасности для группы репликации<br />
<code>New-DfsReplicationGroup</code> создает группу репликации<br />
<code>New-DfsReplicatedFolder</code> создает реплицированную папку в
группе репликации<br />
<code>Remove-DfsrConnection</code> удаляет соединение между членами
группы репликации<br />
<code>Remove-DfsReplicatedFolder</code> удаляет реплицированную папку из
группы репликации<br />
<code>Remove-DfsReplicationGroup</code> удаляет группу репликации<br />
<code>Remove-DfsrMember</code> удаляет компьютеры из группы
репликации<br />
<code>Restore-DfsrPreservedFiles</code> восстанавливает файлы и папки,
ранее сохраненные репликацией DFS<br />
<code>Set-DfsrConnection</code> изменяет параметры соединения между
членами группы репликации<br />
<code>Set-DfsrConnectionSchedule</code> изменяет параметры расписания
соединений между членами группы репликации<br />
<code>Set-DfsReplicatedFolder</code> изменяет настройки реплицированной
папки<br />
<code>Set-DfsReplicationGroup</code> изменяет группу репликации<br />
<code>Set-DfsrGroupSchedule</code> изменяет расписание группы
репликации<br />
<code>Set-DfsrMember</code> изменяет информацию о компьютере-участнике в
группе репликации<br />
<code>Set-DfsrMembership</code> настраивает параметры членства для
членов группы репликации<br />
<code>Set-DfsrServiceConfiguration</code> изменяет параметры службы
репликации DFS<br />
<code>Sync-DfsReplicationGroup</code> синхронизирует репликацию между
компьютерами независимо от расписания<br />
<code>Suspend-DfsReplicationGroup</code> приостанавливает репликацию
между компьютерами независимо от расписания<br />
<code>Update-DfsrConfigurationFromAD</code> инициирует обновление службы
репликации DFS<br />
<code>Write-DfsrHealthReport</code> создает отчет о работоспособности
репликации DFS<br />
<code>Write-DfsrPropagationReport</code> создает отчеты для тестовых
файлов распространения в группе репликации<br />
<code>Start-DfsrPropagationTest</code> создает тестовый файл
распространения в реплицированной папке</p>
<h1 id="storagereplica">StorageReplica</h1>
<p><code>Install-WindowsFeature Storage-Replica IncludeManagementTools -Restart</code><br />
<code>Get-Command -Module StorageReplica</code><br />
<code>Test-SRTopology</code> проверить соответствует ли сервер и канал
связи технологии Storage Replica<br />
<code>New-SRPartnership -SourceComputerName srv-01 -SourceRGName srv-01-rep-group-01 -SourceVolumeName D: -SourceLogVolumeName L: -DestinationComputerName srv-02 -DestinationRGName srv-02-rep-group-01 -DestinationVolumeName D: -DestinationLogVolumeName L: -LogSizeInBytes 1GB</code><br />
<code>Get-Counter -Counter "\Storage Replica Statistics(*)"</code><br />
<code>Get-WinEvent -ProviderName Microsoft-Windows-StorageReplica -max 10</code><br />
<code>Set-SRPartnership -ReplicationMode Asynchronous</code> переключить
режим репликации на асинхронный<br />
<code>Set-SRPartnership -NewSourceComputerName srv-02 -SourceRGName srv-02-rep-group-01 -DestinationComputerName srv-01 -DestinationRGName srv-01-rep-group-01</code>
изменить вручную направление репликации данных, переведя вторичную копию
в онлайн режим (при выходе из строя основного сервера)<br />
<code>Get-SRGroup</code> информация о состояние группы реплизации<br />
<code>Get-SRPartnerShip</code> информация о направлении репликации<br />
<code>(Get-SRGroup).Replicas | Select-Object numofbytesremaining</code>
проверить длину очереди копирования<br />
<code>Get-SRPartnership | Remove-SRPartnership</code> удалить реплизацию
на основном сервере<br />
<code>Get-SRGroup | Remove-SRGroup</code> удалить реплизацию на обоих
серверах</p>
<h1 id="ps2exe">PS2EXE</h1>
<p><code>Install-Module ps2exe -Repository PSGallery</code><br />
<code>Get-Module -ListAvailable</code> список всех модулей<br />
<code>-noConsole</code> использовать GUI, без окна консоли
powershell<br />
<code>-noOutput</code> выполнение в фоне<br />
<code>-noError</code> без вывода ошибок<br />
<code>-requireAdmin</code> при запуске запросить права
администратора<br />
<code>-credentialGUI</code> вывод диалогового окна для ввода учетных
данных<br />
<code>Invoke-ps2exe -inputFile "$home\Desktop\WinEvent-Viewer-1.1.ps1" -outputFile "$home\Desktop\WEV-1.1.exe" -iconFile "$home\Desktop\log_48px.ico" -title "WinEvent-Viewer" -noConsole -noOutput -noError</code></p>
<h1 id="nssm">NSSM</h1>
<p><code>$powershell_Path = (Get-Command powershell).Source</code><br />
<code>$NSSM_Path = (Get-Command "C:\WinPerf-Agent\NSSM-2.24.exe").Source</code><br />
<code>$Script_Path = "C:\WinPerf-Agent\WinPerf-Agent-1.1.ps1"</code><br />
<code>$Service_Name = "WinPerf-Agent"</code><br />
<code>&amp; $NSSM_Path install $Service_Name $powershell_Path -ExecutionPolicy Bypass -NoProfile -f $Script_Path</code>
создать Service<br />
<code>&amp; $NSSM_Path start $Service_Name</code> запустить<br />
<code>&amp; $NSSM_Path status $Service_Name</code> статус<br />
<code>$Service_Name | Restart-Service</code> перезапустить<br />
<code>$Service_Name | Get-Service</code> статус<br />
<code>$Service_Name | Stop-Service</code> остановить<br />
<code>&amp; $NSSM_Path set $Service_Name description "Check performance CPU and report email"</code>
изменить описание<br />
<code>&amp; $NSSM_Path remove $Service_Name</code> удалить</p>
<h1 id="jobs">Jobs</h1>
<p><code>Get-Job</code> получение списка задач<br />
<code>Start-Job</code> запуск процесса<br />
<code>Stop-Job</code> остановка процесса<br />
<code>Suspend-Job</code> приостановка работы процесса<br />
<code>Resume-Job</code> восстановление работы процесса<br />
<code>Wait-Job</code> ожидание вывода команды<br />
<code>Receive-Job</code> получение результатов выполненного
процесса<br />
<code>Remove-Job</code> удалить задачу</p>
<div class="sourceCode" id="cb33"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb33-1"><a href="#cb33-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Start-PingJob <span class="op">(</span><span class="va">$Network</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb33-2"><a href="#cb33-2" aria-hidden="true" tabindex="-1"></a><span class="va">$RNetwork</span> <span class="op">=</span> <span class="va">$Network</span> <span class="op">-replace</span> <span class="st">&quot;\.\d{1,3}$&quot;</span><span class="op">,</span><span class="st">&quot;.&quot;</span></span>
<span id="cb33-3"><a href="#cb33-3" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span>$<span class="dv">4</span> <span class="kw">in</span> <span class="dv">1</span><span class="op">..</span><span class="dv">254</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb33-4"><a href="#cb33-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ip</span> <span class="op">=</span> <span class="va">$RNetwork</span><span class="op">+</span>$<span class="dv">4</span></span>
<span id="cb33-5"><a href="#cb33-5" aria-hidden="true" tabindex="-1"></a><span class="co"># создаем задания, забираем 3-ю строку вывода и добавляем к выводу ip-адрес:</span></span>
<span id="cb33-6"><a href="#cb33-6" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="fu">Start-Job</span> <span class="op">{</span><span class="st">&quot;</span><span class="va">$using</span><span class="op">:</span><span class="va">ip</span><span class="st"> : &quot;</span><span class="op">+(</span>ping <span class="op">-</span>n <span class="dv">1</span> <span class="op">-</span>w <span class="dv">50</span> <span class="va">$using</span><span class="op">:</span><span class="va">ip</span><span class="op">)[</span><span class="dv">2</span><span class="op">]})</span> <span class="op">|</span> <span class="fu">Out-Null</span></span>
<span id="cb33-7"><a href="#cb33-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb33-8"><a href="#cb33-8" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span><span class="va">$True</span><span class="op">){</span></span>
<span id="cb33-9"><a href="#cb33-9" aria-hidden="true" tabindex="-1"></a><span class="va">$status_job</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Job</span><span class="op">).</span><span class="fu">State</span><span class="op">[</span>-1<span class="op">]</span> <span class="co"># забираем статус последнего задания</span></span>
<span id="cb33-10"><a href="#cb33-10" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$status_job</span> <span class="op">-like</span> <span class="st">&quot;Completed&quot;</span><span class="op">){</span> <span class="co"># проверяем на выполнение (задания выполняются по очереди сверху вниз)</span></span>
<span id="cb33-11"><a href="#cb33-11" aria-hidden="true" tabindex="-1"></a><span class="va">$ping_out</span> <span class="op">=</span> <span class="fu">Get-Job</span> <span class="op">|</span> <span class="fu">Receive-Job</span> <span class="co"># если выполнен, забираем вывод всех заданий</span></span>
<span id="cb33-12"><a href="#cb33-12" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Job</span> <span class="op">|</span> <span class="fu">Remove-Job</span> <span class="op">-</span>Force <span class="co"># удаляем задания</span></span>
<span id="cb33-13"><a href="#cb33-13" aria-hidden="true" tabindex="-1"></a><span class="va">$ping_out</span></span>
<span id="cb33-14"><a href="#cb33-14" aria-hidden="true" tabindex="-1"></a><span class="cf">break</span> <span class="co"># завершаем цикл</span></span>
<span id="cb33-15"><a href="#cb33-15" aria-hidden="true" tabindex="-1"></a><span class="op">}}</span></span>
<span id="cb33-16"><a href="#cb33-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Start-PingJob -Network 192.168.3.0</code><br />
<code>(Measure-Command {Start-PingJob -Network 192.168.3.0}).TotalSeconds</code>
60 Seconds</p>
<h3 id="threadjob">ThreadJob</h3>
<p><code>Install-Module -Name ThreadJob</code><br />
<code>Get-Module ThreadJob -list</code><br />
<code>Start-ThreadJob {ping ya.ru} | Out-Null</code> создать фоновую
задачу<br />
<code>Get-Job | Receive-Job -Keep</code> отобразить и не удалять
вывод<br />
<code>(Get-Job).HasMoreData</code> если False, то вывод команы
удален<br />
<code>(Get-Job)[-1].Output</code> отобразить вывод последней задачи</p>
<div class="sourceCode" id="cb34"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb34-1"><a href="#cb34-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Start-PingThread <span class="op">(</span><span class="va">$Network</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb34-2"><a href="#cb34-2" aria-hidden="true" tabindex="-1"></a><span class="va">$RNetwork</span> <span class="op">=</span> <span class="va">$Network</span> <span class="op">-replace</span> <span class="st">&quot;\.\d{1,3}$&quot;</span><span class="op">,</span><span class="st">&quot;.&quot;</span></span>
<span id="cb34-3"><a href="#cb34-3" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span>$<span class="dv">4</span> <span class="kw">in</span> <span class="dv">1</span><span class="op">..</span><span class="dv">254</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb34-4"><a href="#cb34-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ip</span> <span class="op">=</span> <span class="va">$RNetwork</span><span class="op">+</span>$<span class="dv">4</span></span>
<span id="cb34-5"><a href="#cb34-5" aria-hidden="true" tabindex="-1"></a><span class="co"># создаем задания, забираем 3-ю строку вывода и добавляем к выводу ip-адрес:</span></span>
<span id="cb34-6"><a href="#cb34-6" aria-hidden="true" tabindex="-1"></a><span class="op">(</span>Start-ThreadJob <span class="op">{</span><span class="st">&quot;</span><span class="va">$using</span><span class="op">:</span><span class="va">ip</span><span class="st"> : &quot;</span><span class="op">+(</span>ping <span class="op">-</span>n <span class="dv">1</span> <span class="op">-</span>w <span class="dv">50</span> <span class="va">$using</span><span class="op">:</span><span class="va">ip</span><span class="op">)[</span><span class="dv">2</span><span class="op">]})</span> <span class="op">|</span> <span class="fu">Out-Null</span></span>
<span id="cb34-7"><a href="#cb34-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb34-8"><a href="#cb34-8" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span><span class="va">$True</span><span class="op">){</span></span>
<span id="cb34-9"><a href="#cb34-9" aria-hidden="true" tabindex="-1"></a><span class="va">$status_job</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Job</span><span class="op">).</span><span class="fu">State</span><span class="op">[</span>-1<span class="op">]</span> <span class="co"># забираем статус последнего задания</span></span>
<span id="cb34-10"><a href="#cb34-10" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$status_job</span> <span class="op">-like</span> <span class="st">&quot;Completed&quot;</span><span class="op">){</span> <span class="co"># проверяем на выполнение (задания выполняются по очереди сверху вниз)</span></span>
<span id="cb34-11"><a href="#cb34-11" aria-hidden="true" tabindex="-1"></a><span class="va">$ping_out</span> <span class="op">=</span> <span class="fu">Get-Job</span> <span class="op">|</span> <span class="fu">Receive-Job</span> <span class="co"># если выполнен, забираем вывод всех заданий</span></span>
<span id="cb34-12"><a href="#cb34-12" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Job</span> <span class="op">|</span> <span class="fu">Remove-Job</span> <span class="op">-</span>Force <span class="co"># удаляем задания</span></span>
<span id="cb34-13"><a href="#cb34-13" aria-hidden="true" tabindex="-1"></a><span class="va">$ping_out</span></span>
<span id="cb34-14"><a href="#cb34-14" aria-hidden="true" tabindex="-1"></a><span class="cf">break</span> <span class="co"># завершаем цикл</span></span>
<span id="cb34-15"><a href="#cb34-15" aria-hidden="true" tabindex="-1"></a><span class="op">}}</span></span>
<span id="cb34-16"><a href="#cb34-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Start-PingThread -Network 192.168.3.0</code><br />
<code>(Measure-Command {Start-PingThread -Network 192.168.3.0}).TotalSeconds</code>
24 Seconds</p>
<h3 id="poshrsjob">PoshRSJob</h3>
<div class="sourceCode" id="cb35"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb35-1"><a href="#cb35-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Start-PingRSJob <span class="op">(</span><span class="va">$Network</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb35-2"><a href="#cb35-2" aria-hidden="true" tabindex="-1"></a><span class="va">$RNetwork</span> <span class="op">=</span> <span class="va">$Network</span> <span class="op">-replace</span> <span class="st">&quot;\.\d{1,3}$&quot;</span><span class="op">,</span><span class="st">&quot;.&quot;</span></span>
<span id="cb35-3"><a href="#cb35-3" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span>$<span class="dv">4</span> <span class="kw">in</span> <span class="dv">1</span><span class="op">..</span><span class="dv">254</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb35-4"><a href="#cb35-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ip</span> <span class="op">=</span> <span class="va">$RNetwork</span><span class="op">+</span>$<span class="dv">4</span></span>
<span id="cb35-5"><a href="#cb35-5" aria-hidden="true" tabindex="-1"></a><span class="op">(</span>Start-RSJob <span class="op">{</span><span class="st">&quot;</span><span class="va">$using</span><span class="op">:</span><span class="va">ip</span><span class="st"> : &quot;</span><span class="op">+(</span>ping <span class="op">-</span>n <span class="dv">1</span> <span class="op">-</span>w <span class="dv">50</span> <span class="va">$using</span><span class="op">:</span><span class="va">ip</span><span class="op">)[</span><span class="dv">2</span><span class="op">]})</span> <span class="op">|</span> <span class="fu">Out-Null</span></span>
<span id="cb35-6"><a href="#cb35-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb35-7"><a href="#cb35-7" aria-hidden="true" tabindex="-1"></a><span class="va">$ping_out</span> <span class="op">=</span> Get-RSJob <span class="op">|</span> Receive-RSJob</span>
<span id="cb35-8"><a href="#cb35-8" aria-hidden="true" tabindex="-1"></a><span class="va">$ping_out</span></span>
<span id="cb35-9"><a href="#cb35-9" aria-hidden="true" tabindex="-1"></a>Get-RSJob <span class="op">|</span> Remove-RSJob</span>
<span id="cb35-10"><a href="#cb35-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Start-PingRSJob -Network 192.168.3.0</code><br />
<code>(Measure-Command {Start-PingRSJob -Network 192.168.3.0}).TotalSeconds</code>
10 Seconds</p>
<h1 id="smtp">SMTP</h1>
<div class="sourceCode" id="cb36"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb36-1"><a href="#cb36-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Send-SMTP <span class="op">{</span></span>
<span id="cb36-2"><a href="#cb36-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span> <span class="op">(</span></span>
<span id="cb36-3"><a href="#cb36-3" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Parameter<span class="op">(</span>Mandatory <span class="op">=</span> <span class="va">$True</span><span class="op">)]</span><span class="va">$mess</span></span>
<span id="cb36-4"><a href="#cb36-4" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
<span id="cb36-5"><a href="#cb36-5" aria-hidden="true" tabindex="-1"></a><span class="va">$srv_smtp</span> <span class="op">=</span> <span class="st">&quot;smtp.yandex.ru&quot;</span> </span>
<span id="cb36-6"><a href="#cb36-6" aria-hidden="true" tabindex="-1"></a><span class="va">$port</span> <span class="op">=</span> <span class="st">&quot;587&quot;</span></span>
<span id="cb36-7"><a href="#cb36-7" aria-hidden="true" tabindex="-1"></a><span class="va">$from</span> <span class="op">=</span> <span class="st">&quot;login1@yandex.ru&quot;</span> </span>
<span id="cb36-8"><a href="#cb36-8" aria-hidden="true" tabindex="-1"></a><span class="va">$to</span> <span class="op">=</span> <span class="st">&quot;login2@yandex.ru&quot;</span> </span>
<span id="cb36-9"><a href="#cb36-9" aria-hidden="true" tabindex="-1"></a><span class="va">$user</span> <span class="op">=</span> <span class="st">&quot;login1&quot;</span></span>
<span id="cb36-10"><a href="#cb36-10" aria-hidden="true" tabindex="-1"></a><span class="va">$pass</span> <span class="op">=</span> <span class="st">&quot;password&quot;</span></span>
<span id="cb36-11"><a href="#cb36-11" aria-hidden="true" tabindex="-1"></a><span class="va">$subject</span> <span class="op">=</span> <span class="st">&quot;Service status on Host: </span><span class="va">$hostname</span><span class="st">&quot;</span></span>
<span id="cb36-12"><a href="#cb36-12" aria-hidden="true" tabindex="-1"></a><span class="va">$Message</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">Mail</span><span class="op">.</span><span class="fu">MailMessage</span></span>
<span id="cb36-13"><a href="#cb36-13" aria-hidden="true" tabindex="-1"></a><span class="va">$Message</span><span class="op">.</span><span class="fu">From</span> <span class="op">=</span> <span class="va">$from</span></span>
<span id="cb36-14"><a href="#cb36-14" aria-hidden="true" tabindex="-1"></a><span class="va">$Message</span><span class="op">.</span><span class="fu">To</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="va">$to</span><span class="op">)</span> </span>
<span id="cb36-15"><a href="#cb36-15" aria-hidden="true" tabindex="-1"></a><span class="va">$Message</span><span class="op">.</span><span class="fu">Subject</span> <span class="op">=</span> <span class="va">$subject</span> </span>
<span id="cb36-16"><a href="#cb36-16" aria-hidden="true" tabindex="-1"></a><span class="va">$Message</span><span class="op">.</span><span class="fu">IsBodyHTML</span> <span class="op">=</span> <span class="va">$true</span> </span>
<span id="cb36-17"><a href="#cb36-17" aria-hidden="true" tabindex="-1"></a><span class="va">$Message</span><span class="op">.</span><span class="fu">Body</span> <span class="op">=</span> <span class="st">&quot;&lt;h1&gt; </span><span class="va">$mess</span><span class="st"> &lt;/h1&gt;&quot;</span></span>
<span id="cb36-18"><a href="#cb36-18" aria-hidden="true" tabindex="-1"></a><span class="va">$smtp</span> <span class="op">=</span> <span class="fu">New-Object</span> Net<span class="op">.</span><span class="fu">Mail</span><span class="op">.</span><span class="fu">SmtpClient</span><span class="op">(</span><span class="va">$srv_smtp</span><span class="op">,</span> <span class="va">$port</span><span class="op">)</span></span>
<span id="cb36-19"><a href="#cb36-19" aria-hidden="true" tabindex="-1"></a><span class="va">$smtp</span><span class="op">.</span><span class="fu">EnableSSL</span> <span class="op">=</span> <span class="va">$true</span> </span>
<span id="cb36-20"><a href="#cb36-20" aria-hidden="true" tabindex="-1"></a><span class="va">$smtp</span><span class="op">.</span><span class="fu">Credentials</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">NetworkCredential</span><span class="op">(</span><span class="va">$user</span><span class="op">,</span> <span class="va">$pass</span><span class="op">);</span></span>
<span id="cb36-21"><a href="#cb36-21" aria-hidden="true" tabindex="-1"></a><span class="va">$smtp</span><span class="op">.</span><span class="fu">Send</span><span class="op">(</span><span class="va">$Message</span><span class="op">)</span> </span>
<span id="cb36-22"><a href="#cb36-22" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Send-SMTP $(Get-Service)</code></p>
<h1 id="hyper-v">Hyper-V</h1>
<p><code>Install-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart</code>
установить роль на Windows Server<br />
<code>Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V All</code>
установить роль на Windows Desktop<br />
<code>Get-Command -Module hyper-v</code><br />
<code>Get-VMHost</code></p>
<div class="sourceCode" id="cb37"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb37-1"><a href="#cb37-1" aria-hidden="true" tabindex="-1"></a>New-VMSwitch <span class="op">-</span>name NAT <span class="op">-</span>SwitchType Internal <span class="co"># создать виртуальный коммутатор и адаптер для него</span></span>
<span id="cb37-2"><a href="#cb37-2" aria-hidden="true" tabindex="-1"></a>Get-NetAdapter <span class="op">|</span> <span class="fu">where</span> InterfaceDescription <span class="op">-match</span> Hyper-V <span class="co"># список сетевых адаптеров</span></span>
<span id="cb37-3"><a href="#cb37-3" aria-hidden="true" tabindex="-1"></a>New-NetNat <span class="op">-</span>Name LocalNat <span class="op">-</span>InternalIPInterfaceAddressPrefix <span class="st">&quot;192.168.3.0/24&quot;</span> <span class="co"># задать сеть</span></span>
<span id="cb37-4"><a href="#cb37-4" aria-hidden="true" tabindex="-1"></a>Get-NetAdapter <span class="st">&quot;vEthernet (NAT)&quot;</span> <span class="op">|</span> New-NetIPAddress <span class="op">-</span>IPAddress <span class="dv">192.168</span><span class="op">.</span><span class="dv">3.200</span> <span class="op">-</span>AddressFamily IPv4 <span class="op">-</span>PrefixLength <span class="dv">24</span> <span class="co"># присвоить адрес, необходимо на ВМ указать шлюз 192.168.3.200, что бы находиться за NAT, или в настройка ВМ указать соответствующий адаптер</span></span>
<span id="cb37-5"><a href="#cb37-5" aria-hidden="true" tabindex="-1"></a>Add-NetNatStaticMapping <span class="op">-</span>NatName LocalNat <span class="op">-</span>Protocol TCP <span class="op">-</span>ExternalIPAddress <span class="dv">0.0</span><span class="op">.</span><span class="dv">0.0</span> <span class="op">-</span>ExternalPort <span class="dv">2222</span> <span class="op">-</span>InternalIPAddress <span class="dv">192.168</span><span class="op">.</span><span class="dv">3.103</span> <span class="op">-</span>InternalPort <span class="dv">2121</span> <span class="co"># проброс, вест трафик который приходит на хост Hyper-V TCP/2222, будет перенаправляться на соответствующий порт виртуальной машины за NAT.</span></span>
<span id="cb37-6"><a href="#cb37-6" aria-hidden="true" tabindex="-1"></a><span class="op">(</span>Get-NetAdapter <span class="op">|</span> <span class="fu">where</span> Name <span class="op">-match</span> NAT<span class="op">).</span><span class="fu">Status</span></span></code></pre></div>
<p><code>Get-NetNatStaticMapping</code> отобразить пробросы (NAT)<br />
<code>Get-NetNat</code> список сетей<br />
<code>Remove-NetNatStaticMapping -StaticMappingID 0</code> удалить
проброс<br />
<code>Remove-NetNat -Name LocalNat</code> удалить сеть</p>
<p><code>New-VMSwitch -Name Local -AllowManagementOS $True -NetAdapterName "Ethernet 4" -SwitchType External</code>
создать вшений (External) виртуальный коммутатор<br />
<code>$VMName = "hv-dc-01"</code></p>
<div class="sourceCode" id="cb38"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb38-1"><a href="#cb38-1" aria-hidden="true" tabindex="-1"></a><span class="va">$VM</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb38-2"><a href="#cb38-2" aria-hidden="true" tabindex="-1"></a>Name <span class="op">=</span> <span class="va">$VMName</span></span>
<span id="cb38-3"><a href="#cb38-3" aria-hidden="true" tabindex="-1"></a>MemoryStartupBytes <span class="op">=</span> 4Gb</span>
<span id="cb38-4"><a href="#cb38-4" aria-hidden="true" tabindex="-1"></a>Generation <span class="op">=</span> <span class="dv">2</span></span>
<span id="cb38-5"><a href="#cb38-5" aria-hidden="true" tabindex="-1"></a><span class="dt">NewVHDPath</span> <span class="op">=</span> <span class="st">&quot;D:\VM\</span><span class="va">$VMName</span><span class="st">\</span><span class="va">$VMName</span><span class="st">.vhdx&quot;</span></span>
<span id="cb38-6"><a href="#cb38-6" aria-hidden="true" tabindex="-1"></a>NewVHDSizeBytes <span class="op">=</span> 50Gb</span>
<span id="cb38-7"><a href="#cb38-7" aria-hidden="true" tabindex="-1"></a>BootDevice <span class="op">=</span> <span class="st">&quot;VHD&quot;</span></span>
<span id="cb38-8"><a href="#cb38-8" aria-hidden="true" tabindex="-1"></a>Path <span class="op">=</span> <span class="st">&quot;D:\VM\</span><span class="va">$VMName</span><span class="st">&quot;</span></span>
<span id="cb38-9"><a href="#cb38-9" aria-hidden="true" tabindex="-1"></a>SwitchName <span class="op">=</span> <span class="st">&quot;NAT&quot;</span></span>
<span id="cb38-10"><a href="#cb38-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb38-11"><a href="#cb38-11" aria-hidden="true" tabindex="-1"></a>New-VM @VM</span></code></pre></div>
<p><code>Set-VMDvdDrive -VMName $VMName -Path "C:\Users\Lifailon\Documents\WS-2016.iso"</code><br />
<code>New-VHD -Path "D:\VM\$VMName\disk_d.vhdx" -SizeBytes 10GB</code>
создать VHDX диск<br />
<code>Add-VMHardDiskDrive -VMName $VMName -Path "D:\VM\$VMName\disk_d.vhdx"</code>
примонтировать диск<br />
<code>Get-VM VMname $VMName | Set-VM AutomaticStartAction Start</code>
автозапуск<br />
<code>Get-VM -Name $VMName | Set-VMMemory -StartupBytes 8Gb</code><br />
<code>Set-VMProcessor $VMName -Count 2</code><br />
<code>Get-VM -Name $VMName | Checkpoint-VM -SnapshotName "Snapshot-1"</code><br />
<code>Restore-VMCheckpoint -Name Snapshot-1" -VMName $VMName -Confirm:$false</code><br />
<code>Get-VM | Select -ExpandProperty NetworkAdapters | Select VMName,IPAddresses,Status</code>
получить IP адрес всех ВМ<br />
<code>vmconnect.exe localhost $VMHost</code></p>
<p><code>Get-NetTCPConnection -State Established,Listen | Where-Object LocalPort -Match 2179</code>
найти порт слушателя
<code>Get-Process -Id (Get-NetTCPConnection -State Established,Listen | Where-Object LocalPort -Match 2179).OwningProcess</code>
найти процесс по ID (vmms/VMConnect)<br />
<code>New-NetFirewallRule -Name "Hyper-V" -DisplayName "Hyper-V" -Group "Hyper-V" -Direction Inbound -Protocol TCP -LocalPort 2179 -Action Allow -Profile Public</code><br />
<code>Get-LocalGroupMember -Group "Администраторы Hyper-V"</code> или
“Hyper-V Administrators”<br />
<code>Add-LocalGroupMember -Group "Администраторы Hyper-V" -Member "lifailon"</code><br />
<code>Get-VM * | select name,ID</code> добавить id в RDCMan для
подключения<br />
<code>Grant-VMConnectAccess -ComputerName plex-01 -VMName hv-devops-01 -UserName lifailon</code>
дать доступ на подключение не администратору<br />
<code>Grant-VMConnectAccess -ComputerName huawei-book -VMName hv-devops-01 -UserName lifailon</code><br />
<code>Get-VMConnectAccess</code><br />
<code>Revoke-VMConnectAccess -VMName hv-devops-01 -UserName lifailon</code></p>
<p>Error: <code>Unknown disconnection reason 3848</code> - добавить
ключи реестра на стороне клиента</p>
<div class="sourceCode" id="cb39"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb39-1"><a href="#cb39-1" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentialsDomain <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">&quot;Microsoft Virtual Console Service/*&quot;</span> <span class="op">-</span>Force</span>
<span id="cb39-2"><a href="#cb39-2" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowDefaultCredentials <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">&quot;Microsoft Virtual Console Service/*&quot;</span> <span class="op">-</span>Force</span>
<span id="cb39-3"><a href="#cb39-3" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentialsWhenNTLMOnlyDomain <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">&quot;Microsoft Virtual Console Service/*&quot;</span> <span class="op">-</span>Force</span>
<span id="cb39-4"><a href="#cb39-4" aria-hidden="true" tabindex="-1"></a>ItemProperty <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowDefaultCredentialsDomain <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">&quot;Microsoft Virtual Console Service/*&quot;</span> <span class="op">-</span>Force</span>
<span id="cb39-5"><a href="#cb39-5" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentials <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">&quot;Microsoft Virtual Console Service/*&quot;</span> <span class="op">-</span>Force</span>
<span id="cb39-6"><a href="#cb39-6" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentialsWhenNTLMOnly <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">&quot;Microsoft Virtual Console Service/*&quot;</span> <span class="op">-</span>Force</span>
<span id="cb39-7"><a href="#cb39-7" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowSavedCredentialsWhenNTLMOnly <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">&quot;Microsoft Virtual Console Service/*&quot;</span> <span class="op">-</span>Force</span>
<span id="cb39-8"><a href="#cb39-8" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowSavedCredentials <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">&quot;Microsoft Virtual Console Service/*&quot;</span> <span class="op">-</span>Force</span>
<span id="cb39-9"><a href="#cb39-9" aria-hidden="true" tabindex="-1"></a><span class="fu">New-ItemProperty</span> <span class="op">-</span>Path HKLM<span class="op">:</span>\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowSavedCredentialsDomain <span class="op">-</span>Name Hyper-V <span class="op">-</span>PropertyType String <span class="op">-</span>Value <span class="st">&quot;Microsoft Virtual Console Service/*&quot;</span> <span class="op">-</span>Force</span></code></pre></div>
<h1 id="vmwarepowercli">VMWare/PowerCLI</h1>
<p><code>Install-Module -Name VMware.PowerCLI # -AllowClobber</code>
установить модуль (PackageProvider: nuget)<br />
<code>Get-Module -ListAvailable VMware* | Select Name,Version</code><br />
<code>Import-Module VMware.VimAutomation.Core</code> импортировать в
сессию<br />
<code>Get-PSProvider | format-list Name,PSSnapIn,ModuleName</code>
список оснасток Windows PowerShell</p>
<p><code>Get-PowerCLIConfiguration</code> конфигурация подключения<br />
<code>Set-PowerCLIConfiguration -Scope AllUsers -InvalidCertificateAction ignore -confirm:$false</code>
eсли используется самоподписанный сертификат, изменить значение
параметра InvalidCertificateAction с Unset на Ignore/Warn<br />
<code>Set-PowerCLIConfiguration -Scope AllUsers -ParticipateInCeip $false</code>
отключить уведомление сбора данных через VMware Customer Experience
Improvement Program (CEIP)</p>
<p><code>Read-Host AsSecureString | ConvertFrom-SecureString | Out-File "$home\Documents\vcsa_password.txt"</code>
зашифровать пароль и сохранить в файл<br />
<code>$esxi = "vcsa.domain.local"</code><br />
<code>$user = "administrator@vsphere.local"</code><br />
<code>$pass = Get-Content "$home\Documents\vcsa_password.txt" | ConvertTo-SecureString</code>
прочитать пароль<br />
<code>$pass = "password"</code><br />
<code>$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user ,$pass</code><br />
<code>Connect-VIServer $esxi -User $Cred.Username -Password $Cred.GetNetworkCredential().password</code>
подключиться, используя PSCredential ($Cred)<br />
<code>Connect-VIServer $esxi -User $user -Password $pass</code>
подключиться, используя логин и пароль</p>
<p><code>Get-Command Module *vmware*</code><br />
<code>Get-Command Module *vmware* -name *get*iscsi*</code><br />
<code>Get-IScsiHbaTarget</code><br />
<code>Get-Datacenter</code><br />
<code>Get-Cluster</code><br />
<code>Get-VMHost</code><br />
<code>Get-VMHost | select Name,Model,ProcessorType,MaxEVCMode,NumCpu,CpuTotalMhz,CpuUsageMhz,MemoryTotalGB,MemoryUsageGB</code><br />
<code>Get-VMHostDisk | select VMHost,ScsiLun,TotalSectors</code></p>
<p><code>Get-Datastore</code><br />
<code>Get-Datastore TNAS-vmfs-4tb-01</code><br />
<code>Get-Datastore TNAS-vmfs-4tb-01 | get-vm</code><br />
<code>Get-Datastore -RelatedObject vm-01</code><br />
<code>(Get-Datastore TNAS-vmfs-4tb-01).ExtensionData.Info.GetType()</code><br />
<code>(Get-Datastore TNAS-vmfs-4tb-01).ExtensionData.Info.Vmfs.Extent</code></p>
<p><code>Get-Command Module *vmware* -name *disk*</code><br />
<code>Get-VM vm-01 | Get-Datastore</code><br />
<code>Get-VM vm-01 | Get-HardDisk</code><br />
<code>Get-VM | Get-HardDisk | select Parent,Name,CapacityGB,StorageFormat,FileName | ft</code><br />
<code>Copy-HardDisk</code><br />
<code>Get-VM | Get-Snapshot</code><br />
<code>Get-VM | where {$_.Powerstate -eq "PoweredOn"}</code><br />
<code>Get-VMHost esxi-05 | Get-VM | where {$_.Powerstate -eq "PoweredOff"} | Move-VM Destination (Get-VMHost esxi-06)</code></p>
<p><code>Get-VM | select Name,VMHost,PowerState,NumCpu,MemoryGB,</code><br />
<code>@{Name="UsedSpaceGB"; Expression={[int32]($_.UsedSpaceGB)}},@{Name="ProvisionedSpaceGB"; Expression={[int32]($_.ProvisionedSpaceGB)}},</code><br />
<code>CreateDate,CpuHotAddEnabled,MemoryHotAddEnabled,CpuHotRemoveEnabled,Notes</code></p>
<p><code>Get-VMGuest vm-01 | Update-Tools</code><br />
<code>Get-VMGuest vm-01 | select OSFullName,IPAddress,HostName,State,Disks,Nics,ToolsVersion</code><br />
<code>Get-VMGuest * | select -ExpandProperty IPAddress</code><br />
<code>Restart-VMGuest -vm vm-01 -Confirm:$False</code><br />
<code>Start-VM -vm vm-01 -Confirm:$False</code><br />
<code>Shutdown-VMGuest -vm vm-01 -Confirm:$false</code></p>
<p><code>New-VM Name vm-01 -VMHost esxi-06 ResourcePool Production DiskGB 60 DiskStorageFormat Thin Datastore TNAS-vmfs-4tb-01</code><br />
<code>Get-VM vm-01 | Copy-VMGuestFile -Source "\\$srv\Install\Soft\Btest.exe" -Destination "C:\Install\" -LocalToGuest -GuestUser USER -GuestPassword PASS -force</code></p>
<p><code>Get-VM -name vm-01 | Export-VApp -Destination C:\Install -Format OVF</code>
Export template (.ovf, .vmdk, .mf)<br />
<code>Get-VM -name vm-01 | Export-VApp -Destination C:\Install -Format OVA</code></p>
<p><code>Get-VMHostNetworkAdapter | select VMHost,Name,Mac,IP,@{Label="Port Group"; Expression={$_.ExtensionData.Portgroup}} | ft</code><br />
<code>Get-VM | Get-NetworkAdapter | select Parent,Name,Id,Type,MacAddress,ConnectionState,WakeOnLanEnabled | ft</code></p>
<p><code>Get-Command Module *vmware* -name *event*</code><br />
<code>Get-VIEvent -MaxSamples 1000 | where {($_.FullFormattedMessage -match "power")} | select username,CreatedTime,FullFormattedMessage</code><br />
<code>Get-logtype | select Key,SourceEntityId,Filename,Creator,Info</code><br />
<code>(Get-Log vpxd:vpxd.log).Entries | select -Last 50</code></p>
<p><code>Get-Command Module *vmware* -name *syslog*</code><br />
<code>Set-VMHostSysLogServer -VMHost esxi-05 -SysLogServer "tcp://192.168.3.100" -SysLogServerPort 3515</code><br />
<code>Get-VMHostSysLogServer -VMHost esxi-05</code></p>
<h1 id="exchangeemshell">Exchange/EMShell</h1>
<p><code>$srv_cas = "exchange-cas"</code><br />
<code>$session_exchange = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://$srv_cas/PowerShell/</code>
-Credential $Cred -Authentication Kerberos<br />
<code>Get-PSSession</code><br />
<code>Import-PSSession $session_exchange -DisableNameChecking</code>
импортировать в текущую сессию</p>
<p><code>Get-ExchangeServer | select name,serverrole,admindisplayversion,Edition,OriginatingServer,WhenCreated,WhenChanged,DataPath | ft</code>
список всех серверов</p>
<p><code>Get-ImapSettings</code> настройки IMAP<br />
<code>Get-ExchangeCertificate</code> список сертификатов<br />
<code>Get-ExchangeCertificate -Thumbprint "5CEC8544D4743BC279E5FEA1679F79F5BD0C2B3A" | Enable-ExchangeCertificate -Services IMAP, POP, IIS, SMTP</code><br />
<code>iisreset</code><br />
<code>Get-ClientAccessService | fl identity, *uri*</code> настройки
службы автообнаружения в Exchange 2016<br />
<code>Get-ClientAccessService -Identity $srv | Set-ClientAccessService -AutoDiscoverServiceInternalUri https://mail.domain.ru/Autodiscover/Autodiscover.xml</code>
изменить на внешний адрес<br />
<code>Get-OutlookAnywhere</code> OA позволяет клиентам Outlook
подключаться к своим почтовым ящикам за пределами локальной сети (без
использования VPN)<br />
<code>Get-WebServicesVirtualDirectory</code><br />
<code>Get-OwaVirtualDirectory</code><br />
<code>Get-ActiveSyncVirtualDirectory</code><br />
<code>Get-OabVirtualDirectory</code> виртуальная директория автономной
адресной книги<br />
<code>Get-OabVirtualDirectory -Server $srv | Set-OabVirtualDirectory -InternalUrl "https://mail.domain.ru/OAB" -ExternalUrl "https://mail.domain.ru/OAB"</code></p>
<h3 id="roles">Roles</h3>
<p>MS (Mailbox) - сервер с БД почтовых ящиков и общих папок, отвечает
только за их размещение и не выполняет маршрутизацию никаких
сообщений.<br />
CAS (Client Access Server) - обработка клиентских подключений к почтовым
ящикам, которые создаются клиентами Outlook Web Access (HTTP для Outlook
Web App), Outlook Anywhere, ActiveSync (для мобильных устройств),
интернет протоколы POP3 и IMAP4, MAPI для клиентов Microsoft
Outlook.<br />
Hub Transort - ответвечает за маршрутизацию сообщений интернета и
инфраструктурой Exchange, а также между серверами Exchange. Сообщения
всегда маршрутизируются с помощью роли транспортного
сервера-концентратора, даже если почтовые ящики источника и назначения
находятся в одной базе данных почтовых ящиков.<br />
Relay - роль пограничного транспортного сервера (шлюз SMTP в периметре
сети).</p>
<p>SCP (Service Connection Point) - запись прописывается в AD, при
создание сервера CAS. Outlook запрашивает SCP, выбирает те, которые
находятся в одном сайте с ним и по параметру WhenCreated по дате
создания, выбирая самый старый.<br />
Autodiscover. Outlook выбирает в качестве сервера Client Access тот,
который прописан в атрибуте RPCClientAccessServer базы данных
пользователя. Сведения о базе данных и сервере mailbox, на котором она
лежит, берутся из AD.</p>
<h3 id="messagetrackinglog">MessageTrackingLog</h3>
<p><code>Get-MessageTrackingLog -ResultSize Unlimited | select Timestamp,Sender,Recipients,RecipientCount,MessageSubject,Source,EventID,ClientHostname,ServerHostname,ConnectorId, @{Name="MessageSize"; Expression={[string]([int]($_.TotalBytes / 1024))+" KB"}},@{Name="MessageLatency"; Expression={$_.MessageLatency -replace "\.\d+$"}}</code><br />
<code>Get-MessageTrackingLog -Start (Get-Date).AddHours(-24) -ResultSize Unlimited | where {[string]$_.recipients -like "*@yandex.ru"}</code>
вывести сообщения за последние 24 часа, где получателем был указанный
домен<br />
-Start “04/01/2023 09:00:00” -End “04/01/2023 18:00:00” - поиск по
указанному промежутку времени<br />
-MessageSubject “Тест” - поиск по теме письма<br />
-Recipients “support4@domain.ru” - поиск по получателю<br />
-Sender - поиск по отправителю<br />
-EventID поиск по коду события сервера (RECEIVE, SEND, FAIL, DSN,
DELIVER, BADMAIL, RESOLVE, EXPAND, REDIRECT, TRANSFER, SUBMIT,
POISONMESSAGE, DEFER)<br />
-Server поиск на определенном транспортном сервере<br />
-messageID трекинг письма по его ID</p>
<h3 id="mailbox">Mailbox</h3>
<p><code>Get-Mailbox -Database "it2"</code> список почтовых серверов в
базе данных<br />
<code>Get-Mailbox -resultsize unlimited | ? Emailaddresses -like "support4" | format-list name,emailaddresses,database,servername</code>
какую БД, сервер и smtp-адреса использует почтовый ящик<br />
<code>Get-Mailbox -Database $db_name -Archive</code> отобразить архивные
почтовые ящики</p>
<p><code>Get-MailboxFolderStatistics -Identity "support4" -FolderScope All | select Name,ItemsInFolder,FolderSize</code>
отобразить кол-во писем и размер в каждой папке<br />
<code>Get-MailboxStatistics "support4" | select DisplayName,LastLoggedOnUserAccount,LastLogonTime,LastLogoffTime,ItemCount,TotalItemSize,DeletedItemCount,TotalDeletedItemSize,Database,ServerName</code>
общее кол-во писем, их размер, время последнего входа и выхода, имя
сервера и БД<br />
<code>Get-Mailbox -Server s2 | Get-MailboxStatistics | where {$_.Lastlogontime -lt (get-date).AddDays(-30)} | Sort Lastlogontime -desc | ft displayname,Lastlogontime,totalitemsize</code>
ящики, которые не использовались 30 и более дней</p>
<p><code>Enable-Mailbox -Identity support9 -Database test_base</code>
создать почтовый ящик для существующего пользователя в AD<br />
<code>New-Mailbox -Name $login -UserPrincipalName "$login@$domain" -Database $select_db -OrganizationalUnit $path -Password (ConvertTo-SecureString -String "$password" -AsPlainText -Force)</code>
создать новый почтовый ящик без привязки к пользователю AD<br />
<code>Get-MailboxDatabase -Database $db_name | Remove-MailboxDatabase</code>
удалить БД</p>
<p><code>Set-MailBox "support4" -PrimarySmtpAddress support24@domain.ru -EmailAddressPolicyEnabled $false</code>
добавить и изменить основной SMTP-адрес электронной почты для
пользователя<br />
<code>Set-Mailbox -Identity "support4" -DeliverToMailboxAndForward $true -ForwardingSMTPAddress "username@outlook.com"</code>
включить переадресацию почты (электронная почта попадает в почтовый ящик
пользователя support4 и одновременно пересылается по адресу
username@outlook.com)</p>
<h3 id="moverequest">MoveRequest</h3>
<p><code>Get-Mailbox -Database $db_in | New-MoveRequest -TargetDatabase $db_out</code>
переместить все почтовые ящики из одной БД в другую<br />
<code>New-MoveRequest -Identity $db_in -TargetDatabase $db_out</code>
переместить один почтовый ящик<br />
<code>Get-MoveRequest | Suspend-MoveRequest</code> остановить запросы
перемещения<br />
<code>Get-MoveRequest | Remove-MoveRequest</code> удалить запросы на
перемещение<br />
<code>Get-MoveRequest | Get-MoveRequestStatistics</code> статус
перемещения</p>
<p>Status:<br />
Cleanup - нужно подождать<br />
Queued - в очереди<br />
InProgress - в процессе<br />
Percent Complete - процент выполнения<br />
CompletionInProgress - завершение процесса<br />
Completed - завершено</p>
<p><code>Remove-MoveRequest -Identity $db_name</code> завершить процесс
перемещения (убрать статус перемещения с почтового ящика и очистить
список перемещений)<br />
<code>Get-MailboxDatabase | Select Name, MailboxRetention</code> после
перемещения ящиков, размер базы не изменится, полное удаление из базы
произойдет, как пройдет количество дней, выставленное в параметре
MailboxRetention<br />
<code>Set-MailboxDatabase -MailboxRetention '0.00:00:00' -Identity $db_name</code>
изменить значение</p>
<h3 id="archive">Archive</h3>
<p><code>Enable-Mailbox -Identity $name -Archive</code> включить архив
для пользователя<br />
<code>Get-Mailbox $name | New-MoveReques ArchiveOnly ArchiveTargetDatabase DBArch</code>
переместить архивный почтовый ящик в другую БД<br />
<code>Get-Mailbox $name | fl Name,Database,ArchiveDatabase</code> место
расположения БД пользователя и БД его архива<br />
<code>Disable-Mailbox -Identity $name -Archive</code> отключить
архив<br />
<code>Connect-Mailbox -Identity "8734c04e-981e-4ccf-a547-1c1ac7ebf3e2" -Archive -User $name -Database it2</code>
подключение архива пользователя к указанному почтовому ящику<br />
<code>Get-Mailbox $name | Set-Mailbox -ArchiveQuota 20GB -ArchiveWarningQuota 19GB</code>
настроить квоты хранения архива</p>
<h3 id="quota">Quota</h3>
<p><code>Get-Mailbox -Identity $mailbox | fl IssueWarningQuota, ProhibitSendQuota, ProhibitSendReceiveQuota, UseDatabaseQuotaDefaults</code>
отобразить квоты почтового ящика<br />
IssueWarningQuota — квота, при достижении которой Exchange отправит
уведомление<br />
ProhibitSendQuota — при достижении будет запрещена отправка<br />
ProhibitSendReceiveQuota — при достижении будет запрещена отправка и
получение<br />
UseDatabaseQuotaDefaults — используется ли квота БД или false -
индвидиуальные<br />
<code>Set-Mailbox -Identity $mailbox -UseDatabaseQuotaDefaults $false -IssueWarningQuota "3 GB" -ProhibitSendQuota "4 GB" -ProhibitSendReceiveQuota "5 GB"</code>
задать квоту для пользователя</p>
<p><code>Get-MailboxDatabase $db_name | fl Name, *Quota</code>
отобразить квоты наложенные на БД<br />
<code>Set-MailboxDatabase $db -ProhibitSendReceiveQuota "5 GB" -ProhibitSendQuota "4 GB" -IssueWarningQuota "3 GB"</code>
настроить квоты на БД</p>
<h3 id="database">Database</h3>
<p><code>Get-MailboxDatabase -Status | select ServerName,Name,DatabaseSize</code>
список и размер всех БД на всех MX-серверах<br />
<code>New-MailboxDatabase -Name it_2022 -EdbFilePath E:\Bases\it_2022\it_2022.edb -LogFolderPath G:\Logs\it_2022 -OfflineAddressBook "Default Offline Address List" -server exch-mx-01</code>
создать БД<br />
<code>Restart-Service MSExchangeIS</code><br />
<code>Get-Service | Where {$_ -match "exchange"} | Restart-Service</code><br />
<code>Get-MailboxDatabase -Server exch-01</code> список баз данных на
MX-сервере<br />
<code>New-MoveRequest -Identity "support4" -TargetDatabase it_2022</code>
переместить почтовый ящик в новую БД<br />
<code>Move-Databasepath $db_name EdbFilepath "F:\DB\$db_name\$db_name.edb" LogFolderpath "E:\DB\$db_name\logs\"</code>
переместить БД и транзакционные логи на другой диск<br />
<code>Set-MailboxDatabase -CircularLoggingEnabled $true -Identity $db_name</code>
включить циклическое ведение журнала (Circular Logging), где
последовательно пишутся 4 файла логов по 5 МБ, после чего первый
лог-файл перезаписывается<br />
<code>Set-MailboxDatabase -CircularLoggingEnabled $false -Identity $db_name</code>
отключить циклическое ведение журнала<br />
<code>Get-MailboxDatabase -Server "exch-mx-01" -Status | select EdbFilePath,LogFolderPath,LogFilePrefix</code>
путь к БД, логам, имя текущего актуального лог-файла</p>
<h3 id="mailboxrepairrequest">MailboxRepairRequest</h3>
<p><code>New-MailboxRepairRequest -Database it2 -CorruptionType ProvisionedFolder, SearchFolder, AggregateCounts, Folderview</code>
запустить последовательный тест (в конкретный момент времени не доступен
один почтовый ящик) и исправление ошибок на прикладном уровне<br />
<code>Get-MailboxRepairRequest -Database it2</code> прогресс
выполнения<br />
Позволяет исправить:<br />
ProvisionedFolder нарушения логической структуры папок<br />
SearchFolder ошибки в папках поиска<br />
AggregateCounts проверка и исправление информации о количестве
элементов в папках и их размере<br />
FolderView неверное содержимое, отображаемое представлениями папок</p>
<h3 id="eseutil">eseutil</h3>
<p>При отправке/получении любого письма Exchange сначала вносит
информацию в транзакционный лог, и только потом сохраняет элемент
непосредственно в базу данных. Размер одного лог файла - 1 Мб. Есть три
способа урезания логов: DAG, Backup на базе Volume Shadow Copy, Circular
Logging.</p>
<p>Ручное удаление журналов транзакций:<br />
<code>cd E:\MS_Exchange_2010\MailBox\Reg_v1_MailBoxes\</code> перейти в
каталог с логами<br />
<code>ls E*.chk</code> узнать имя файла, в котором находится информация
из контрольной точки фиксации журналов<br />
<code>eseutil /mk .\E18.chk</code> узнать последний файл журнала,
действия из которого были занесены в БД Exchange<br />
<code>Checkpoint: (0x561299,8,16)</code> 561299 имя файла, который был
последним зафиксирован (его информация уже в базе данных)<br />
Находим в проводнике файл E0500561299.txt, можно удалять все файлы
журналов, которые старше найденного файла</p>
<p>Восстановление БД (если две копии БД с ошибкой):<br />
<code>Get-MailboxDatabaseCopyStatus -Identity db_name\* | Format-List Name,Status,ContentIndexState</code><br />
Status : FailedAndSuspended<br />
ContentIndexState : Failed<br />
Status : Dismounted<br />
ContentIndexState : Failed</p>
<p><code>Get-MailboxDatabase -Server exch-mx-01 -Status | fl Name,EdbFilePath,LogFolderPath</code>
проверить расположение базы и транзакционных логов<br />
LogFolderPath - директория логов<br />
E18 - имя транкзакционного лога (из него читаются остальные логи)<br />
<code>dismount-Database db_name</code> отмантировать БД<br />
<code>eseutil /mh D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code>
проверить базу<br />
State: Dirty Shutdown - несогласованное состояние, означает, что часть
транзакций не перенесена в базу, например, после того, как была
осуществлена аварийная перезагрузка сервера.<br />
<code>eseutil /ml E:\MS_Exchange_2010\MailBox\db_name\E18</code>
проверка целостности транзакционных логи, если есть логи транзакций и
они не испорчены, то можно восстановить из них, из файла E18 считываются
все логи, должен быть статус - ОК</p>
<p>Soft Recovery (мягкое восстановление) - необходимо перевести базу в
состояние корректного отключения (Clear shutdown) путем записи
недостающих файлов журналов транзакций в БД.<br />
<code>eseutil /R E18 /l E:\MS_Exchange_2010\MailBox\db_name\ /d D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code><br />
<code>eseutil /R E18 /a /i /l E:\MS_Exchange_2010\MailBox\db_name\ /d D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code>
если с логами что-то не так, можно попробовать восстановить базу
игнорируя ошибку в логах<br />
<code>eseutil /mk D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code>
cостоянии файла контрольных точек<br />
<code>eseutil /g D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code>
проверка целостности БД<br />
<code>eseutil /k D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code>
проверка контрольных сумм базы (CRC)</p>
<p>Hard Recovery - если логи содержат ошибки и база не
восстанавливается, то восстанавливаем базу без логов.<br />
<code>eseutil /p D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code><br />
/p - удалит поврежденные страницы, эта информация будет удалена из БД и
восстановит целостность<br />
<code>esetuil /d D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb</code>
выполнить дефрагментацию (если был потерян большой объем данных, то
может сильно снизиться производительность)<br />
После выполнения команд необходимо вручную удалить все файлы с
расширением log в папке MDBDATA, перед попыткой смонтировать базу
данных.<br />
<code>isinteg -s "db_name.edb" -test alltests</code> проверьте
целостность базы данных<br />
<code>isinteg -s "server_name" -fix -test -alltests</code> если проверка
будет провалена. Выполнять команду до тех пор, пока у всех ошибок не
станет статус 0 или статус не перестанет меняться, иногда необходимо 3
прохода для достижения результата.<br />
<code>eseutil /mh D:\MS_Exchange_2010\Mailbox\db_name\db_name.edb | Select-String -Pattern "State:","Log Required:"</code>
проверить статус<br />
State: Clear shutdown - успешный статус<br />
<code>Log Required</code> требуются ли файлы журналов, необходимые базе,
чтобы перейти в согласованное состояние. Если база размонтирована
корректно, то это значение будет равняться 0.<br />
<code>mount-Database -force db_name</code> примонтировать БД<br />
<code>Get-MailboxDatabase Status db_name | fl Mounted</code> статус
БД<br />
<code>New-MailboxRepairRequest -Database db_name -CorruptionType SearchFolder,AggregateCounts,ProvisionedFolder,FolderView</code>
восстановление логической целостности данных<br />
После этого восстановить Index.<br />
Если индексы не восстанавливаются, но БД монтируется, то перенести
почтовые ящики в новую БД.</p>
<p>Восстановление БД из Backup:</p>
<p>1-й вариант: 1. Отмантировать текущую БД и удалить или переименовать
директорию с файлами текущей БД. 3. Восстановить в ту же директорию из
Backup базу с логами. 4. Запустить мягкое восстановление БД (Soft
Recovery). 5. Примониторвать.</p>
<p>2-й вариант: 1. Отмантировать и удалить текущую БД. 2. Восстановить
БД с логами из Backup в любое место. 3. Запустить мягкое восстановление
БД (Soft Recovery). 4. Создать новую БД. 5. Создать Recovery Database и
смонтировать в нее восстановленную из бэкапа БД, скопировать из неё
почтовые ящики в новую БД и переключить на них пользователей. 6. Если
использовать Dial Tone Recovery, то так же перенести из временной БД
промежуточные данные почтовых ящиков.</p>
<p>3-й вариант: 1. Восстановить целостность Soft Repair или Hard
Recovery. 2. Создать новую БД. Указывать в свойствах: «база может быть
перезаписана при восстановлении». 3. Если база была только что оздана и
еще не была подмонтирована, то эта папка будет пуста, туда перемещаем
базу из Backup, которая была обработана ESEUTIL вместе со всеми файлами.
Указать имя .edb такое же, которое было при создании новой базы. 4.
Монтируем базу. 5. Перенацеливаем ящики со старой (Mailbox_DB_02),
неисправной базы, на новую базу (Mailbox_DB_02_02):
<code>Get-Mailbox -Database Mailbox_DB_02 | where {$_.ObjectClass -NotMatch '(SystemAttendantMailbox|ExOleDbSystemMailbox)'} | Set-Mailbox -Database Mailbox_DB_02_02</code>
6. Восстановление логической целостности данных:
<code>New-MailboxRepairRequest -Database "Mailbox_DB_02_02" -CorruptionType ProvisionedFolder, SearchFolder, AggregateCounts, Folderview</code></p>
<h3 id="dial-tone-recovery">Dial Tone Recovery</h3>
<p><code>Get-Mailbox -Database "MailboxDB" | Set-Mailbox -Database "TempDB"</code>
перенацелить ящики с одной БД (нерабочей) на другую (пустую)<br />
<code>Get-Mailbox -Database TempDB</code> отобразить почтовые ящики в БД
TempDB<br />
<code>Restart-Service MSExchangeIS</code> перезапустить службу Mailbox
Information Store (банка данных), иначе пользователи будут по-прежнему
пытаться подключиться к старой БД<br />
<code>iisreset</code><br />
<code>Get-Mailbox -Database "TempDB" | Set-Mailbox -Database "MailboxDB"</code>
после восстановления старой БД, нужно переключить пользователей с
временной БД обратно<br />
После этого сделать слияние с временной БД с помощью Recovery.</p>
<h3 id="recovery-database-rdb">Recovery database (RDB)</h3>
<p><code>New-MailboxDatabase Recovery Name RecoveryDB Server $exch_mx EdbFilePath "D:\TempDB\TempDB.edb" -LogFolderPath "D:\TempDB"</code>
для переноса новых писем из временной БД в основную необходим только сам
файл TempDB.edb со статусом Clean Shutdown, из нее необходимо создать
служебную БД (ключ -Recovery)<br />
<code>Mount-Database "D:\TempDB\TempDB.edb"</code> примонтировать
БД<br />
<code>Get-MailboxStatistics -Database RecoveryDB</code><br />
<code>New-MailboxRestoreRequest SourceDatabase RecoveryDB SourceStoreMailbox support TargetMailbox support</code>
скопировать данные почтового ящика с DisplayName: support из RecoveryDB
в почтовый ящик с псевдонимом support существующей базы. По умолчанию
ищет в почтовой базе совпадающие LegacyExchangeDN либо проверяет
совпадение адреса X500, если нужно восстановить данные в другой ящик,
нужно указывать ключ -AllowLegacyDNMisMatch<br />
<code>New-MailboxRestoreRequest SourceDatabase RecoveryDB SourceStoreMailbox support TargetMailbox support TargetRootFolder "Restore"</code>
скопировать письма в отдельную папку в ящике назначения (создается
автоматически), возможно восстановить содержимое конкретной папки
-IncludeFolders “#Inbox#”<br />
<code>Get-MailboxRestoreRequest | Get-MailboxRestoreRequestStatistics</code>
статус запроса восстановления<br />
<code>Get-MailboxRestoreRequestStatistics -Identity support</code><br />
<code>Get-MailboxRestoreRequest -Status Completed | Remove-MailboxRestoreRequest</code>
удалить все успешные запросы</p>
<h3 id="transport">Transport</h3>
<p><code>Get-TransportServer $srv_cas | select MaxConcurrentMailboxDeliveries,MaxConcurrentMailboxSubmissions,MaxConnectionRatePerMinute,MaxOutboundConnections,MaxPerDomainOutboundConnections,PickupDirectoryMaxMessagesPerMinute</code>
настройки пропускной способности транспортного сервера<br />
MaxConcurrentMailboxDeliveries — максимальное количество одновременных
потоков, которое может открыть сервер для отправки писем.<br />
MaxConcurrentMailboxSubmissions — максимальное количество одновременных
потоков, которое может открыть сервер для получения писем.<br />
MaxConnectionRatePerMinute — максимальное возможная скорость открытия
входящих соединений в минуту.<br />
MaxOutboundConnections — максимальное возможное количество соединений,
которое может открыть Exchange для отправки.<br />
MaxPerDomainOutboundConnections — максимальное возможное количество
исходящих соединений, которое может открыть Exchange для одного
удаленного домена.<br />
PickupDirectoryMaxMessagesPerMinute — скорость внутренней обработки
сообщений в минуту (распределение писем по папкам).<br />
<code>Set-TransportServer exchange-cas -MaxConcurrentMailboxDeliveries 21 -MaxConcurrentMailboxSubmissions 21 -MaxConnectionRatePerMinute 1201 -MaxOutboundConnections 1001 -MaxPerDomainOutboundConnections 21 -PickupDirectoryMaxMessagesPerMinute 101</code>
изменить значения</p>
<p><code>Get-TransportConfig | select MaxSendSize, MaxReceiveSize</code>
ограничение размера сообщения на уровне траспорта (наименьший приоритет,
после коннектора и почтового ящика).<br />
<code>New-TransportRule -Name AttachmentLimit -AttachmentSizeOver 15MB -RejectMessageReasonText "Sorry, messages with attachments over 15 MB are not accepted"</code>
создать транспортное правило для проверки размера вложения</p>
<h3 id="connector">Connector</h3>
<p><code>Get-ReceiveConnector | select Name,MaxMessageSize,RemoteIPRanges,WhenChanged</code>
ограничения размера сообщения на уровне коннектора (приоритет ниже, чем
у почтового ящика)<br />
<code>Set-ReceiveConnector ((Get-ReceiveConnector).Identity)[-1] -MaxMessageSize 30Mb</code>
изменить размер у последнего коннектора в списке (приоритет выше, чем у
траспорта)<br />
<code>Get-Mailbox "support4" | select MaxSendSize, MaxReceiveSize</code>
наивысший приоритет<br />
<code>Set-Mailbox "support4" -MaxSendSize 30MB -MaxReceiveSize 30MB</code>
изменить размер</p>
<p><code>Set-SendConnector -Identity "ConnectorName" -Port 26</code>
изменить порт коннектора отправки<br />
<code>Get-SendConnector "proxmox" | select port</code></p>
<p><code>Get-ReceiveConnector | select Name,MaxRecipientsPerMessage</code>
по умолчанию Exchange принимает ограниченное количество адресатов в
одном письме (200)<br />
<code>Set-ReceiveConnector ((Get-ReceiveConnector).Identity)[-1] -MaxRecipientsPerMessage 50</code>
изменить значение<br />
<code>Set-ReceiveConnector ((Get-ReceiveConnector).Identity)[-1] -MessageRateLimit 1000</code>
задать лимит обработки сообщений в минуту для коннектора</p>
<p><code>Get-OfflineAddressbook | Update-OfflineAddressbook</code>
обновить OAB<br />
<code>Get-ClientAccessServer | Update-FileDistributionService</code></p>
<h3 id="pst">PST</h3>
<p><code>New-MailboxExportRequest -Mailbox $name -filepath "\\$srv\pst\$name.PST" # -ContentFilter {(Received -lt "01/01/2021")} -Priority Highest/Lower # -IsArchive</code>
выполнить экспорт из архива пользователя<br />
<code>New-MailboxExportRequest -Mailbox $name -IncludeFolders "#Inbox#" -FilePath "\\$srv\pst\$name.PST"</code>
только папку входящие<br />
<code>New-MailboxImportRequest -Mailbox $name "\\$srv\pst\$name.PST"</code>
импорт из PST<br />
<code>Get-MailboxExportRequest</code> статус запросов<br />
<code>Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest</code>
удалить успешно завершенные запросы<br />
<code>Remove-MailboxExportRequest -RequestQueue MBXDB01 -RequestGuid 25e0eaf2-6cc2-4353-b83e-5cb7b72d441f</code>
отменить экспорт</p>
<h3 id="distributiongroup">DistributionGroup</h3>
<p><code>Get-DistributionGroup</code> список групп рассылки<br />
<code>Get-DistributionGroupMember "!_Офис"</code> список пользователей в
группе<br />
<code>Add-DistributionGroupMember -Identity "!_Офис" -Member "$name@$domain"</code>
добавить в группу рассылки<br />
<code>Remove-DistributionGroupMember -Identity "!_Офис" -Member "$name@$domain"</code><br />
<code>New-DistributionGroup -Name "!_Тест" -Members "$name@$domain"</code>
создать группу<br />
<code>Set-DistributionGroup -Identity "support4" -HiddenFromAddressListsEnabled $true (или Set-Mailbox)</code>
скрыть из списка адресов Exchange</p>
<h3 id="search">Search</h3>
<p><code>Search-Mailbox -Identity "support4" -SearchQuery 'Тема:"Mikrotik DOWN"'</code>
поиск писем по теме<br />
<code>Search-Mailbox -Identity "support4" -SearchQuery 'Subject:"Mikrotik DOWN"'</code><br />
<code>Search-Mailbox -Identity "support4" -SearchQuery 'attachment -like:"*.rar"'</code><br />
<code>Search-Mailbox -Identity "support4" -SearchQuery "отправлено: &lt; 01/01/2020" -DeleteContent -Force</code>
удаление писем по дате</p>
<p>Формат даты в зависимости от региональных настроек сервера:<br />
<code>20/07/2018</code><br />
<code>07/20/2018</code><br />
<code>20-Jul-2018</code><br />
<code>20/July/2018</code></p>
<h3 id="auditlog">AuditLog</h3>
<p><code>Get-AdminAuditLogConfig</code> настройки аудита<br />
<code>Set-Mailbox -Identity "support4" -AuditOwner HardDelete</code>
добавить логирование HardDelete писем<br />
<code>Set-mailbox -identity "support4" -AuditlogAgelimit 120</code>
указать время хранения<br />
<code>Get-mailbox -identity "support4" | Format-list Audit*</code>
данные аудита<br />
<code>Search-MailboxAuditLog -Identity "support4" -LogonTypes Delegate -ShowDetails -Start "2022-02-22 18:00" -End "2022-03-22 18:00"</code>
просмотр логов<br />
<code>Search-AdminAuditLog -StartDate "02/20/2022" | ft CmdLetName,Caller,RunDate,ObjectModified -Autosize</code>
поиск событий истории выполненых команд в журнале аудита Exchange</p>
<h3 id="test">Test</h3>
<p><code>Test-ServiceHealth</code> проверить доступность ролей сервера:
почтовых ящиков, клиентского доступа, единой системы обмена сообщениями,
траспортного сервера<br />
<code>$mx_srv_list | %{Test-MapiConnectivity -Server $_}</code> проверка
подключения MX-серверов к БД<br />
<code>Test-MAPIConnectivity -Database $db</code> проверка возможности
логина в базу<br />
<code>Test-MAPIConnectivity Identity $user@$domain</code> проверка
возможности логина в почтовый ящик<br />
<code>Test-ComputerSecureChannel</code> проверка работы службы AD<br />
<code>Test-MailFlow</code> результат тестового потока почты</p>
<h3 id="queue">Queue</h3>
<p><code>Get-TransportServer | %{Get-Queue -Server $_.Name}</code>
отобразить очереди на всех транспортных серверах<br />
<code>Get-Queue -Identity EXCHANGE-CAS\155530 | Format-List</code>
подробная информация об очереди<br />
<code>Get-Queue -Identity EXCHANGE-CAS\155530 | Get-Message -ResultSize Unlimited | Select FromAddress,Recipients</code>
отобразить список отправителей (FromAddress) и список получателей в
очереди (Recipients)<br />
<code>Get-Message -Queue EXCHANGE-CAS\155530</code> отобразить
индентификатор сообщений в конкретной очереди (серверписьма)<br />
<code>Resume-Message EXCHANGE-CAS\155530\444010</code> повторить
отправку письма из очереди<br />
<code>Retry-Queue -Filter {Status -eq "Retry"}</code> принудительно
повторить отправку всех сообщений c статусом “Повторить”<br />
<code>Get-Queue -Identity EXCHANGE-CAS\155530 | Get-Message -ResultSize unlimited | Remove-Message -WithNDR $False</code>
очистить очередь<br />
<code>Get-transportserver EXCHANGE-CAS | Select MessageExpirationTimeout</code>
отобразить время жизни сообщений в очереди (по умолчанию, 2 дня)</p>
<p>Error Exchange 452 4.3.1 Insufficient system resources - окончание
свободного места на диске, на котором находятся очереди службы Exchange
Hub Transport, за мониторинг отвечает компонент доступных ресурсов Back
Pressure, который в том числе отслеживает свободное место на диске<br />
Порог Medium (90%) — перестать принимать по SMTP почту от внешних
отправителей (почта от MAPI клиентов при этом обрабатывается)<br />
Порог High (99%) — обработка потока почты полностью прекращается<br />
Решение: очистить, например логи IIS (C:3SVC1), увеличить размер диска,
отключить мониторинг Back Pressure (плохой вариант) или перенести
транспортные очередь на другой диск достаточного объёма.</p>
<p><code>Get-Service | ? name -like "MSExchangeTransport" | Stop-Service</code>
остановить служу очереди<br />
<code>Rename-Item "C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\data\Queue" "C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\data\Queue_old"</code>
очистить базу очереди<br />
<code>C:\Program Files\Microsoft\Exchange Server\V15\Bin\EdgeTransport.exe.config</code>
конфигурационный файл, который содержит путь к бд с очередью (блок
<appSettings> ключи <add key="QueueDatabasePath" value="$new_path" /> и
QueueDatabaseLoggingPath)<br />
Для переноса БД, необходимо переместить существующие файлы базы данных
Mail.que и Trn.chk (контрольные точки для отслеживания записи в логах)
из исходного местоположения в новое. Переместите существующие файлы
журнала транзакций Trn.log, Trntmp.log, Trn nnnn.log , Trnres00001.jrs,
Trnres00002.jrs и Temp.edb из старого расположения в новое. tmp.edb —
временный файл для проверки схемы самой базы, перености не нужно.<br />
После запуска службы транспорта удалить старую базу данных очереди и
файлы журнала транзакций из старого расположения.</p>
<h3 id="defrag">Defrag</h3>
<p><code>Get-MailboxDatabase -Status | ft Name, DatabaseSize, AvailableNewMailboxSpace</code><br />
DatabaseSize - текущий размер базы<br />
AvailableNewMailboxSpace - объём пустых страниц, пространство, которое
можно освободить при дефрагментации<br />
(DatabaseSize — AvailableNewMailboxSpace) x 1,1 - необходимо
дополнительно иметь свободного места не менее 110% от текущего размера
базы (без учета пустых страниц)<br />
<code>cd $path</code><br />
<code>Dismount-Database "$path\$db_name"</code> отмонтировать БД<br />
<code>eseutil /d "$path\$db_name.edb"</code><br />
<code>Mount-Database "$path\$db"</code> примонтировать БД</p>
<h3 id="dag-database-availability-group">DAG (Database Availability
Group)</h3>
<p><code>Install-WindowsFeature -Name Failover-Clustering -ComputerName EXCH-MX-01</code>
основывается на технологии Windows Server Failover Cluster<br />
<code>New-DatabaseAvailabilityGroup -Name dag-01 -WitnessServer fs-05 -WitnessDirectory C:\witness_exchange1</code>
создать группу с указанием файлового свидетеля для кворума<br />
Quorum - это процесс голосования, в котором для принятия решения нужно
иметь большинство голосов, что бы сделать текущую копию базы данных
активной.<br />
WitnessDirectory — используется для хранения данных файлового
ресурса-свидетеля.<br />
<code>Set-DatabaseAvailabilityGroup dag-01 DatabaseAvailabilityGroupIPAdress $ip</code>
изменить ip-адрес группы<br />
<code>Get-DatabaseAvailabilityGroup</code> список всех групп<br />
<code>Get-DatabaseAvailabilityGroup -Identity dag-01</code><br />
<code>Add-DatabaseAvailabilityGroupServer -Identity dag-01 -MailboxServer EXCH-MX-01</code>
добавить первый сервер (все БД на серверах в DAG должны храниться по
одинаковому пути)<br />
<code>Add-MailboxDatabaseCopy -Identity db_name -MailboxServer EXCH-MX-04</code>
добавить копию БД<br />
<code>Get-MailboxDatabaseCopyStatus -Identity db_name\* | select Name,Status,LastInspectedLogTime</code>
статус и время последнего копирования журнала транзакий</p>
<p>Status:<br />
Mounted - рабочая база<br />
Suspended - приостановлено копирование<br />
Healthy - рабочая пассивная копия<br />
ServiceDown - недоступна (выключен сервер)<br />
Dismounted - отмонтирована<br />
FailedAndSuspended - ошибка и приостановка копирования<br />
Resynchronizing - процесс синхронизация, где будет постепенно
уменьшаться длина очереди<br />
CopyQueue Length - длина репликационной очереди копирования (0 - значит
все изменения из активной базы реплицированы в пассивную копию)</p>
<p><code>Resume-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04</code>
возобновить (Resume) или запустить копирование бд на EXCH-MX-04 (из
статуса Suspended в Healthy)<br />
<code>Suspend-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04</code>
остановить копирование (в статус Suspended)<br />
<code>Update-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04 -DeleteExistingFiles</code>
обновить копию БД (сделать Full Backup)<br />
<code>Set-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04 -ActivationPreference 1</code>
изменить приоритет для активации копий БД (какую использовать, 1 самое
высокое значение)<br />
<code>Move-ActiveMailboxDatabase db_name -ActivateOnServer EXCH-MX-04 -MountDialOverride:None -Confirm:$false</code>
включить копию БД в DAG (переключиться на активную копию)<br />
<code>Remove-MailboxDatabaseCopy -Identity db_name\EXCH-MX-04 -Confirm:$False</code>
удалить копии пассивной базы в DAG-группе (у БД должно быть отключено
ведение циклического журнала)<br />
<code>Remove-DatabaseAvailabilityGroupServer -Identity dag-01 -MailboxServer EXCH-MX-04 -ConfigurationOnly</code>
удалить MX сервер из группы DAG<br />
<code>Import-Module FailoverClusters</code><br />
<code>Get-ClusterNode EXCH-MX-04 | Remove-ClusterNode -Force</code>
удалить отказавший узел из Windows Failover Cluster</p>
<p><code>Get-DatabaseAvailabilityGroup | Get-DatabaseAvailabilityGroupHealth</code>
мониторинг</p>
<h3 id="index-1">Index</h3>
<p><code>Get-MailboxDatabaseCopyStatus * | select name,status,ContentIndexState,ContentIndexErrorMessage,ActiveDatabaseCopy,LatestCopyBackupTime,CopyQueueLength</code>
узнать состояние работы индксов БД и текст ошибки, на каком сервере
активная копия БД, дата последней копии и текущая очередь<br />
<code>Get-MailboxDatabaseCopyStatus -Identity $db_name\* | Format-List Name,ContentIndexState</code>
отобразить список всех копий конкретной БД на всех серверах, и статус их
индексов, если у второго сервера статус Healthy, можно восстановить из
него<br />
<code>Get-MailboxDatabaseCopyStatus -Identity $db_name\EXCH-MX-04 | Update-MailboxDatabaseCopy -SourceServer EXCH-MX-01 -CatalogOnly</code>
восстановить БД из копии<br />
<code>cd %PROGRAMFILES%\Microsoft\Exchange Server\V14\Scripts</code> или
v15 для Exchange 2016<br />
<code>.\ResetSearchIndex.ps1 $db_name</code> скрипт восстановления
индекса</p>
<p><code>Get-MailboxDatabaseCopyStatus * | where {$_.ContentIndexState -eq "Failed" -or $_.ContentIndexState -eq "FailedAndSuspended"}</code>
отобразить у какой БД произошел сбой работы (FailedAndSuspended) или
индекса (ContentIndexState)</p>
<h1 id="truenas">TrueNAS</h1>
<p><code>import-Module TrueNas</code><br />
<code>(Get-Module TrueNas).ExportedCommands</code><br />
<code>Connect-TrueNasServer -Server tnas-01 -SkipCertificateCheck</code><br />
<code>Get-TrueNasCertificate</code> настройки сертификата<br />
<code>Get-TrueNasSetting</code> настройки языка, time zone, syslog level
и server, https port<br />
<code>Get-TrueNasUser</code> список пользователей<br />
<code>Get-TrueNasSystemVersion</code> характеристики (Physical Memory,
Model, Cores) и Uptime<br />
<code>Get-TrueNasSystemAlert</code> snmp для оповещений<br />
<code>Get-TrueNasSystemNTP</code> список используемых NTP серверов<br />
<code>Get-TrueNasDisk</code> список разделов физического диска<br />
<code>Get-TrueNasInterface</code> сетевые интерфейсы<br />
<code>Get-TrueNasGlobalConfig</code> сетевые настройки<br />
<code>Get-TrueNasDnsServer</code> настроенные DNS-сервера<br />
<code>Get-TrueNasIscsiTarget</code> отобразить ID группы инициаторов
использующих таргет, используемый portal, authentification и
authen-method<br />
<code>Get-TrueNasIscsiInitiator</code> отобразить группы
инициаторов<br />
<code>Get-TrueNasIscsiPortal</code> слушатель (Listen) и порт<br />
<code>Get-TrueNasIscsiExtent</code> список ISCSi Target (статус работы,
путь)<br />
<code>Get-TrueNasPool</code> список pool (Id, Path, Status,
Healthy)<br />
<code>Get-TrueNasVolume -Type FILESYSTEM</code> список pool файловых
систем<br />
<code>Get-TrueNasVolume -Type VOLUME</code> список разделов в pool и их
размер<br />
<code>Get-TrueNasService | ft</code> список служб и их статус<br />
<code>Start-TrueNasService ssh</code> запустить службу<br />
<code>Stop-TrueNasService ssh</code> остановить службу</p>
<h1 id="veeam">Veeam</h1>
<p><code>Set-ExecutionPolicy AllSigned</code> or Set-ExecutionPolicy
Bypass -Scope Process<br />
<code>Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))</code><br />
<code>choco install veeam-backup-and-replication-console</code><br />
<code>Get-Module Veeam.Backup.PowerShell</code><br />
<code>Get-Command -Module Veeam.Backup.PowerShell</code> or
Get-VBRCommand<br />
<code>Connect-VBRServer -Server $srv -Credential $cred</code> or -User
and -Password<code>- Port 9392</code> default<br />
<code>Get-VBRJob</code><br />
<code>Get-VBRCommand *get*backup*</code><br />
<code>Get-VBRComputerBackupJob</code><br />
<code>Get-VBRBackup</code><br />
<code>Get-VBRBackupRepository</code><br />
<code>Get-VBRBackupSession</code><br />
<code>Get-VBRBackupServerCertificate</code><br />
<code>Get-VBRRestorePoint</code><br />
<code>Get-VBRViProxy</code></p>
<h1 id="rest-api">REST API</h1>
<p><code>$url = "https://habr.com/ru/rss/users/Lifailon/publications/articles/?fl=ru"</code>
RSS лента публикаций на Habr<br />
<code>Invoke-RestMethod $url</code><br />
<code>$iwr = Invoke-WebRequest -Uri $url</code><br />
<code>$iwr | Get-Member</code><br />
<code>$iwr.Content</code><br />
<code>$iwr.StatusCode -eq 200</code><br />
<code>$iwr.Headers</code><br />
<code>$iwr.ParsedHtml | Select lastModified</code><br />
<code>$iwr.Links | fl title,innerText,href</code><br />
<code>$iwr.Images.src</code></p>
<h3 id="methods">Methods</h3>
<p><strong>GET</strong> - Read<br />
<strong>POST</strong> - Create<br />
<strong>PATCH</strong> - Partial update/modify<br />
<strong>PUT</strong> - Update/replace<br />
<strong>DELETE</strong> - Remove</p>
<h3 id="download-image">Download Image</h3>
<div class="sourceCode" id="cb40"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb40-1"><a href="#cb40-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Download-Image <span class="op">{</span></span>
<span id="cb40-2"><a href="#cb40-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span> <span class="op">(</span></span>
<span id="cb40-3"><a href="#cb40-3" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span>Parameter<span class="op">(</span>Mandatory <span class="op">=</span> <span class="va">$True</span><span class="op">)]</span><span class="va">$url</span></span>
<span id="cb40-4"><a href="#cb40-4" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
<span id="cb40-5"><a href="#cb40-5" aria-hidden="true" tabindex="-1"></a> <span class="va">$folder</span> <span class="op">=</span> <span class="va">$url</span> <span class="op">-replace</span> <span class="st">&quot;http.+://&quot;</span> <span class="op">-replace</span> <span class="st">&quot;/&quot;</span><span class="op">,</span><span class="st">&quot;-&quot;</span> <span class="op">-replace</span> <span class="st">&quot;-$&quot;</span></span>
<span id="cb40-6"><a href="#cb40-6" aria-hidden="true" tabindex="-1"></a> <span class="va">$path</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Pictures\</span><span class="va">$folder</span><span class="st">&quot;</span></span>
<span id="cb40-7"><a href="#cb40-7" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="fu">Test-Path</span> <span class="va">$path</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb40-8"><a href="#cb40-8" aria-hidden="true" tabindex="-1"></a> <span class="fu">Remove-Item</span> <span class="va">$path</span> <span class="op">-</span>Recurse <span class="op">-</span>Force</span>
<span id="cb40-9"><a href="#cb40-9" aria-hidden="true" tabindex="-1"></a> <span class="fu">New-Item</span> <span class="op">-</span>ItemType Directory <span class="va">$path</span> <span class="op">&gt;</span> <span class="va">$null</span></span>
<span id="cb40-10"><a href="#cb40-10" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span> <span class="cf">else</span> <span class="op">{</span></span>
<span id="cb40-11"><a href="#cb40-11" aria-hidden="true" tabindex="-1"></a> <span class="fu">New-Item</span> <span class="op">-</span>ItemType Directory <span class="va">$path</span> <span class="op">&gt;</span> <span class="va">$null</span></span>
<span id="cb40-12"><a href="#cb40-12" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb40-13"><a href="#cb40-13" aria-hidden="true" tabindex="-1"></a> <span class="va">$irm</span> <span class="op">=</span> <span class="fu">Invoke-WebRequest</span> <span class="op">-</span>Uri <span class="va">$url</span></span>
<span id="cb40-14"><a href="#cb40-14" aria-hidden="true" tabindex="-1"></a> <span class="cf">foreach</span> <span class="op">(</span><span class="va">$img</span> <span class="kw">in</span> <span class="va">$irm</span><span class="op">.</span><span class="fu">Images</span><span class="op">.</span><span class="fu">src</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb40-15"><a href="#cb40-15" aria-hidden="true" tabindex="-1"></a> <span class="va">$name</span> <span class="op">=</span> <span class="va">$img</span> <span class="op">-replace</span> <span class="st">&quot;.+/&quot;</span></span>
<span id="cb40-16"><a href="#cb40-16" aria-hidden="true" tabindex="-1"></a> <span class="fu">Start-Job</span> <span class="op">{</span></span>
<span id="cb40-17"><a href="#cb40-17" aria-hidden="true" tabindex="-1"></a> <span class="fu">Invoke-WebRequest</span> <span class="va">$using</span><span class="op">:</span><span class="va">img</span> <span class="op">-</span>OutFile <span class="st">&quot;</span><span class="va">$using</span><span class="op">:</span><span class="va">path</span><span class="st">\</span><span class="va">$using</span><span class="op">:</span><span class="va">name</span><span class="st">&quot;</span></span>
<span id="cb40-18"><a href="#cb40-18" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span> <span class="op">&gt;</span> <span class="va">$null</span></span>
<span id="cb40-19"><a href="#cb40-19" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb40-20"><a href="#cb40-20" aria-hidden="true" tabindex="-1"></a> <span class="cf">while</span> <span class="op">(</span><span class="va">$True</span><span class="op">){</span></span>
<span id="cb40-21"><a href="#cb40-21" aria-hidden="true" tabindex="-1"></a> <span class="va">$status_job</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Job</span><span class="op">).</span><span class="fu">State</span><span class="op">[</span>-1<span class="op">]</span></span>
<span id="cb40-22"><a href="#cb40-22" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="va">$status_job</span> <span class="op">-like</span> <span class="st">&quot;Completed&quot;</span><span class="op">){</span></span>
<span id="cb40-23"><a href="#cb40-23" aria-hidden="true" tabindex="-1"></a> <span class="fu">Get-Job</span> <span class="op">|</span> <span class="fu">Remove-Job</span> <span class="op">-</span>Force</span>
<span id="cb40-24"><a href="#cb40-24" aria-hidden="true" tabindex="-1"></a> <span class="cf">break</span></span>
<span id="cb40-25"><a href="#cb40-25" aria-hidden="true" tabindex="-1"></a> <span class="op">}}</span></span>
<span id="cb40-26"><a href="#cb40-26" aria-hidden="true" tabindex="-1"></a> <span class="va">$count_all</span> <span class="op">=</span> <span class="va">$irm</span><span class="op">.</span><span class="fu">Images</span><span class="op">.</span><span class="fu">src</span><span class="op">.</span><span class="fu">Count</span></span>
<span id="cb40-27"><a href="#cb40-27" aria-hidden="true" tabindex="-1"></a> <span class="va">$count_down</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Item</span> <span class="va">$path</span>\<span class="op">*).</span><span class="fu">count</span></span>
<span id="cb40-28"><a href="#cb40-28" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;Downloaded </span><span class="va">$count_down</span><span class="st"> of </span><span class="va">$count_all</span><span class="st"> files to </span><span class="va">$path</span><span class="st">&quot;</span></span>
<span id="cb40-29"><a href="#cb40-29" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Download-Image -url https://losst.pro/</code></p>
<h3 id="token">Token</h3>
<div class="sourceCode" id="cb41"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb41-1"><a href="#cb41-1" aria-hidden="true" tabindex="-1"></a>https<span class="op">://</span>veeam-11<span class="op">:</span><span class="dv">9419</span><span class="op">/</span>swagger<span class="op">/</span>ui<span class="op">/</span>index<span class="op">.</span><span class="fu">html</span></span>
<span id="cb41-2"><a href="#cb41-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Header</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb41-3"><a href="#cb41-3" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;x-api-version&quot;</span> <span class="op">=</span> <span class="st">&quot;1.0-rev2&quot;</span></span>
<span id="cb41-4"><a href="#cb41-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb41-5"><a href="#cb41-5" aria-hidden="true" tabindex="-1"></a><span class="va">$Body</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb41-6"><a href="#cb41-6" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;grant_type&quot;</span> <span class="op">=</span> <span class="st">&quot;password&quot;</span></span>
<span id="cb41-7"><a href="#cb41-7" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;username&quot;</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$login</span><span class="st">&quot;</span></span>
<span id="cb41-8"><a href="#cb41-8" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;password&quot;</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$password</span><span class="st">&quot;</span></span>
<span id="cb41-9"><a href="#cb41-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb41-10"><a href="#cb41-10" aria-hidden="true" tabindex="-1"></a><span class="va">$vpost</span> <span class="op">=</span> <span class="fu">iwr</span> <span class="st">&quot;https://veeam-11:9419/api/oauth2/token&quot;</span> <span class="op">-</span>Method POST <span class="op">-</span>Headers <span class="va">$Header</span> <span class="op">-</span>Body <span class="va">$Body</span> <span class="op">-</span>SkipCertificateCheck</span>
<span id="cb41-11"><a href="#cb41-11" aria-hidden="true" tabindex="-1"></a><span class="va">$vtoken</span> <span class="op">=</span> <span class="op">((</span><span class="va">$vpost</span><span class="op">.</span><span class="fu">Content</span><span class="op">)</span> <span class="op">-split</span> <span class="st">&#39;&quot;&#39;</span><span class="op">)[</span><span class="dv">3</span><span class="op">]</span></span></code></pre></div>
<h3 id="get">GET</h3>
<div class="sourceCode" id="cb42"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb42-1"><a href="#cb42-1" aria-hidden="true" tabindex="-1"></a><span class="va">$token</span> <span class="op">=</span> <span class="va">$vtoken</span> <span class="op">|</span> <span class="fu">ConvertTo-SecureString</span> <span class="op">-</span>AsPlainText Force</span>
<span id="cb42-2"><a href="#cb42-2" aria-hidden="true" tabindex="-1"></a><span class="va">$vjob</span> <span class="op">=</span> <span class="fu">iwr</span> <span class="st">&quot;https://veeam-11:9419/api/v1/jobs&quot;</span> <span class="op">-</span>Method GET <span class="op">-</span>Headers <span class="va">$Header</span> <span class="op">-</span>Authentication Bearer <span class="op">-</span>Token <span class="va">$token</span> <span class="op">-</span>SkipCertificateCheck</span>
<span id="cb42-3"><a href="#cb42-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb42-4"><a href="#cb42-4" aria-hidden="true" tabindex="-1"></a><span class="va">$Header</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb42-5"><a href="#cb42-5" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;x-api-version&quot;</span> <span class="op">=</span> <span class="st">&quot;1.0-rev1&quot;</span></span>
<span id="cb42-6"><a href="#cb42-6" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;Authorization&quot;</span> <span class="op">=</span> <span class="st">&quot;Bearer </span><span class="va">$vtoken</span><span class="st">&quot;</span></span>
<span id="cb42-7"><a href="#cb42-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb42-8"><a href="#cb42-8" aria-hidden="true" tabindex="-1"></a><span class="va">$vjob</span> <span class="op">=</span> <span class="fu">iwr</span> <span class="st">&quot;https://veeam-11:9419/api/v1/jobs&quot;</span> <span class="op">-</span>Method GET <span class="op">-</span>Headers <span class="va">$Header</span> <span class="op">-</span>SkipCertificateCheck</span>
<span id="cb42-9"><a href="#cb42-9" aria-hidden="true" tabindex="-1"></a><span class="va">$vjob</span> <span class="op">=</span> <span class="va">$vjob</span><span class="op">.</span><span class="fu">Content</span> <span class="op">|</span> <span class="fu">ConvertFrom-Json</span></span>
<span id="cb42-10"><a href="#cb42-10" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb42-11"><a href="#cb42-11" aria-hidden="true" tabindex="-1"></a><span class="va">$vjob</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">&quot;https://veeam-11:9419/api/v1/jobs&quot;</span> <span class="op">-</span>Method GET <span class="op">-</span>Headers <span class="va">$Header</span> <span class="op">-</span>SkipCertificateCheck</span>
<span id="cb42-12"><a href="#cb42-12" aria-hidden="true" tabindex="-1"></a><span class="va">$vjob</span><span class="op">.</span><span class="fu">data</span><span class="op">.</span><span class="fu">virtualMachines</span><span class="op">.</span><span class="fu">includes</span><span class="op">.</span><span class="fu">inventoryObject</span></span></code></pre></div>
<h1 id="pode">Pode</h1>
<div class="sourceCode" id="cb43"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb43-1"><a href="#cb43-1" aria-hidden="true" tabindex="-1"></a>Start-PodeServer <span class="op">{</span></span>
<span id="cb43-2"><a href="#cb43-2" aria-hidden="true" tabindex="-1"></a> Add-PodeEndpoint <span class="op">-</span>Address localhost <span class="op">-</span>Port <span class="st">&quot;8080&quot;</span> <span class="op">-</span>Protocol <span class="st">&quot;HTTP&quot;</span></span>
<span id="cb43-3"><a href="#cb43-3" aria-hidden="true" tabindex="-1"></a> <span class="co">### Get info endpoints</span></span>
<span id="cb43-4"><a href="#cb43-4" aria-hidden="true" tabindex="-1"></a> Add-PodeRoute <span class="op">-</span>Path <span class="st">&quot;/&quot;</span> <span class="op">-</span>Method <span class="st">&quot;GET&quot;</span> <span class="op">-</span>ScriptBlock <span class="op">{</span></span>
<span id="cb43-5"><a href="#cb43-5" aria-hidden="true" tabindex="-1"></a> Write-PodeJsonResponse <span class="op">-</span>Value @<span class="op">{</span></span>
<span id="cb43-6"><a href="#cb43-6" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;service&quot;</span><span class="op">=</span><span class="st">&quot;/api/service&quot;</span><span class="op">;</span></span>
<span id="cb43-7"><a href="#cb43-7" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;process&quot;</span><span class="op">=</span><span class="st">&quot;/api/process&quot;</span></span>
<span id="cb43-8"><a href="#cb43-8" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb43-9"><a href="#cb43-9" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb43-10"><a href="#cb43-10" aria-hidden="true" tabindex="-1"></a> <span class="co">### GET</span></span>
<span id="cb43-11"><a href="#cb43-11" aria-hidden="true" tabindex="-1"></a> Add-PodeRoute <span class="op">-</span>Path <span class="st">&quot;/api/service&quot;</span> <span class="op">-</span>Method <span class="st">&quot;GET&quot;</span> <span class="op">-</span>ScriptBlock <span class="op">{</span></span>
<span id="cb43-12"><a href="#cb43-12" aria-hidden="true" tabindex="-1"></a> Write-PodeJsonResponse <span class="op">-</span>Value <span class="op">$(</span></span>
<span id="cb43-13"><a href="#cb43-13" aria-hidden="true" tabindex="-1"></a> <span class="fu">Get-Service</span> <span class="op">|</span> <span class="fu">Select-Object</span> Name<span class="op">,</span>@<span class="op">{</span></span>
<span id="cb43-14"><a href="#cb43-14" aria-hidden="true" tabindex="-1"></a> Name<span class="op">=</span><span class="st">&quot;Status&quot;</span><span class="op">;</span> Expression<span class="op">={[</span><span class="dt">string</span><span class="op">]</span><span class="va">$_</span><span class="op">.</span><span class="fu">Status</span><span class="op">}</span></span>
<span id="cb43-15"><a href="#cb43-15" aria-hidden="true" tabindex="-1"></a> <span class="op">},</span>@<span class="op">{</span></span>
<span id="cb43-16"><a href="#cb43-16" aria-hidden="true" tabindex="-1"></a> Name<span class="op">=</span><span class="st">&quot;StartType&quot;</span><span class="op">;</span> Expression<span class="op">={[</span><span class="dt">string</span><span class="op">]</span><span class="va">$_</span><span class="op">.</span><span class="fu">StartType</span><span class="op">}</span></span>
<span id="cb43-17"><a href="#cb43-17" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span></span>
<span id="cb43-18"><a href="#cb43-18" aria-hidden="true" tabindex="-1"></a> <span class="op">)</span></span>
<span id="cb43-19"><a href="#cb43-19" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb43-20"><a href="#cb43-20" aria-hidden="true" tabindex="-1"></a> Add-PodeRoute <span class="op">-</span>Path <span class="st">&quot;/api/process&quot;</span> <span class="op">-</span>Method <span class="st">&quot;GET&quot;</span> <span class="op">-</span>ScriptBlock <span class="op">{</span></span>
<span id="cb43-21"><a href="#cb43-21" aria-hidden="true" tabindex="-1"></a> Write-PodeJsonResponse <span class="op">-</span>Value <span class="op">$(</span></span>
<span id="cb43-22"><a href="#cb43-22" aria-hidden="true" tabindex="-1"></a> <span class="fu">Get-Process</span> <span class="op">|</span> <span class="fu">Sort-Object</span> <span class="op">-</span>Descending CPU <span class="op">|</span> <span class="fu">Select-Object</span> <span class="op">-</span>First <span class="dv">15</span> ProcessName<span class="op">,</span></span>
<span id="cb43-23"><a href="#cb43-23" aria-hidden="true" tabindex="-1"></a> @<span class="op">{</span>Name<span class="op">=</span><span class="st">&quot;ProcessorTime&quot;</span><span class="op">;</span> Expression<span class="op">={</span><span class="va">$_</span><span class="op">.</span><span class="fu">TotalProcessorTime</span> <span class="op">-replace</span> <span class="st">&quot;\.\d+$&quot;</span><span class="op">}},</span></span>
<span id="cb43-24"><a href="#cb43-24" aria-hidden="true" tabindex="-1"></a> @<span class="op">{</span>Name<span class="op">=</span><span class="st">&quot;Memory&quot;</span><span class="op">;</span> Expression<span class="op">={[</span><span class="dt">string</span><span class="op">]([</span><span class="dt">int</span><span class="op">](</span><span class="va">$_</span><span class="op">.</span><span class="fu">WS</span> <span class="op">/</span> <span class="dv">1024</span><span class="dt">kb</span><span class="op">))+</span><span class="st">&quot;MB&quot;</span><span class="op">}},</span></span>
<span id="cb43-25"><a href="#cb43-25" aria-hidden="true" tabindex="-1"></a> @<span class="op">{</span>Label<span class="op">=</span><span class="st">&quot;RunTime&quot;</span><span class="op">;</span> Expression<span class="op">={((</span><span class="fu">Get-Date</span><span class="op">)</span> <span class="op">-</span> <span class="va">$_</span><span class="op">.</span><span class="fu">StartTime</span><span class="op">)</span> <span class="op">-replace</span> <span class="st">&quot;\.\d+$&quot;</span><span class="op">}}</span></span>
<span id="cb43-26"><a href="#cb43-26" aria-hidden="true" tabindex="-1"></a> <span class="op">)</span></span>
<span id="cb43-27"><a href="#cb43-27" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb43-28"><a href="#cb43-28" aria-hidden="true" tabindex="-1"></a> Add-PodeRoute <span class="op">-</span>Path <span class="st">&quot;/api/process-html&quot;</span> <span class="op">-</span>Method <span class="st">&quot;GET&quot;</span> <span class="op">-</span>ScriptBlock <span class="op">{</span></span>
<span id="cb43-29"><a href="#cb43-29" aria-hidden="true" tabindex="-1"></a> Write-PodeHtmlResponse <span class="op">-</span>Value <span class="op">(</span></span>
<span id="cb43-30"><a href="#cb43-30" aria-hidden="true" tabindex="-1"></a> <span class="fu">Get-Process</span> <span class="op">|</span> <span class="fu">Sort-Object</span> <span class="op">-</span>Descending CPU <span class="op">|</span> <span class="fu">Select-Object</span> <span class="op">-</span>First <span class="dv">15</span> ProcessName<span class="op">,</span></span>
<span id="cb43-31"><a href="#cb43-31" aria-hidden="true" tabindex="-1"></a> @<span class="op">{</span>Name<span class="op">=</span><span class="st">&quot;ProcessorTime&quot;</span><span class="op">;</span> Expression<span class="op">={</span><span class="va">$_</span><span class="op">.</span><span class="fu">TotalProcessorTime</span> <span class="op">-replace</span> <span class="st">&quot;\.\d+$&quot;</span><span class="op">}},</span></span>
<span id="cb43-32"><a href="#cb43-32" aria-hidden="true" tabindex="-1"></a> @<span class="op">{</span>Name<span class="op">=</span><span class="st">&quot;Memory&quot;</span><span class="op">;</span> Expression<span class="op">={[</span><span class="dt">string</span><span class="op">]([</span><span class="dt">int</span><span class="op">](</span><span class="va">$_</span><span class="op">.</span><span class="fu">WS</span> <span class="op">/</span> <span class="dv">1024</span><span class="dt">kb</span><span class="op">))+</span><span class="st">&quot;MB&quot;</span><span class="op">}},</span></span>
<span id="cb43-33"><a href="#cb43-33" aria-hidden="true" tabindex="-1"></a> @<span class="op">{</span>Label<span class="op">=</span><span class="st">&quot;RunTime&quot;</span><span class="op">;</span> Expression<span class="op">={((</span><span class="fu">Get-Date</span><span class="op">)</span> <span class="op">-</span> <span class="va">$_</span><span class="op">.</span><span class="fu">StartTime</span><span class="op">)</span> <span class="op">-replace</span> <span class="st">&quot;\.\d+$&quot;</span><span class="op">}}</span> <span class="co"># Auto ConvertTo-Html</span></span>
<span id="cb43-34"><a href="#cb43-34" aria-hidden="true" tabindex="-1"></a> <span class="op">)</span></span>
<span id="cb43-35"><a href="#cb43-35" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb43-36"><a href="#cb43-36" aria-hidden="true" tabindex="-1"></a> <span class="co">### POST</span></span>
<span id="cb43-37"><a href="#cb43-37" aria-hidden="true" tabindex="-1"></a> Add-PodeRoute <span class="op">-</span>Path <span class="st">&quot;/api/service&quot;</span> <span class="op">-</span>Method <span class="st">&quot;POST&quot;</span> <span class="op">-</span>ScriptBlock <span class="op">{</span></span>
<span id="cb43-38"><a href="#cb43-38" aria-hidden="true" tabindex="-1"></a> <span class="co"># https://pode.readthedocs.io/en/latest/Tutorials/WebEvent/</span></span>
<span id="cb43-39"><a href="#cb43-39" aria-hidden="true" tabindex="-1"></a> <span class="co"># $WebEvent | Out-Default</span></span>
<span id="cb43-40"><a href="#cb43-40" aria-hidden="true" tabindex="-1"></a> <span class="va">$Value</span> <span class="op">=</span> <span class="va">$WebEvent</span><span class="op">.</span><span class="fu">Data</span><span class="op">[</span><span class="st">&quot;ServiceName&quot;</span><span class="op">]</span></span>
<span id="cb43-41"><a href="#cb43-41" aria-hidden="true" tabindex="-1"></a> <span class="va">$Status</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Service</span> <span class="op">-</span>Name <span class="va">$Value</span><span class="op">).</span><span class="fu">Status</span></span>
<span id="cb43-42"><a href="#cb43-42" aria-hidden="true" tabindex="-1"></a> Write-PodeJsonResponse <span class="op">-</span>Value @<span class="op">{</span></span>
<span id="cb43-43"><a href="#cb43-43" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;Name&quot;</span><span class="op">=</span><span class="st">&quot;</span><span class="va">$Value</span><span class="st">&quot;</span><span class="op">;</span></span>
<span id="cb43-44"><a href="#cb43-44" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;Status&quot;</span><span class="op">=</span><span class="st">&quot;</span><span class="va">$Status</span><span class="st">&quot;</span><span class="op">;</span></span>
<span id="cb43-45"><a href="#cb43-45" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb43-46"><a href="#cb43-46" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb43-47"><a href="#cb43-47" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>irm http://localhost:8080/api/service -Method Get</code><br />
<code>irm http://localhost:8080/api/process -Method Get</code><br />
<code>http://localhost:8080/api/process-html</code> использовать
браузер<br />
<code>irm http://localhost:8080/api/service -Method Post -Body @{"ServiceName" = "AnyDesk"}</code></p>
<h1 id="selenium">Selenium</h1>
<p><code>Invoke-Expression(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/Lifailon/Deploy-Selenium/rsa/Deploy-Selenium-Drivers.ps1")</code>
установка всех драйверов и Chromium соответствующий версии для
драйвера</p>
<pre><code>$path = &quot;$home\Documents\Selenium\&quot;
$log = &quot;$path\ChromeDriver.log&quot;
$ChromeDriver = &quot;$path\ChromeDriver.exe&quot;
$WebDriver = &quot;$path\WebDriver.dll&quot;
$SupportDriver = &quot;$path\WebDriver.Support.dll&quot;
$Chromium = (Get-ChildItem $path -Recurse | Where-Object Name -like chrome.exe).FullName
Add-Type -Path $WebDriver
Add-Type -Path $SupportDriver
try {
$ChromeOptions = New-Object OpenQA.Selenium.Chrome.ChromeOptions # создаем объект с настройками запуска браузера
$ChromeOptions.BinaryLocation = $Chromium # передаем путь до исполняемого файла, который отвечает за запуск браузера
$ChromeOptions.AddArgument(&quot;start-maximized&quot;) # добавляем аргумент, который позволяет запустить браузер на весь экран
#$ChromeOptions.AddArgument(&quot;start-minimized&quot;) # запускаем браузер в окне
#$ChromeOptions.AddArgument(&quot;window-size=400,800&quot;) # запускаем браузер с заданными размерам окна в пикселях
$ChromeOptions.AcceptInsecureCertificates = $True # игнорировать предупреждение на сайтах с не валидным сертификатом
#$ChromeOptions.AddArgument(&quot;headless&quot;) # скрывать окно браузера при запуске
$ChromeDriverService = [OpenQA.Selenium.Chrome.ChromeDriverService]::CreateDefaultService($ChromeDriver) # создаем объект настроек службы драйвера
$ChromeDriverService.HideCommandPromptWindow = $True # отключаем весь вывод логирования драйвера в консоль (этот вывод нельзя перенаправить)
$ChromeDriverService.LogPath = $log # указать путь до файла с журналом
$ChromeDriverService.EnableAppendLog = $True # не перезаписывать журнал при каждом новом запуске
#$ChromeDriverService.EnableVerboseLogging = $True # кроме INFO и ошибок, записывать DEBUG сообщения
$Selenium = New-Object OpenQA.Selenium.Chrome.ChromeDriver($ChromeDriverService, $ChromeOptions) # инициализируем запуск с указанными настройками
$Selenium.Navigate().GoToUrl(&quot;https://google.com&quot;) # переходим по указанной ссылке в браузере
#$Selenium.Manage().Window.Minimize() # свернуть окно браузера после запуска и перехода по нужному url (что бы считать страницу корректно)
# Ищем поле для ввода текста:
$Search = $Selenium.FindElements([OpenQA.Selenium.By]::Id(&#39;APjFqb&#39;))
$Search = $Selenium.FindElements([OpenQA.Selenium.By]::XPath(&#39;//*[@id=&quot;APjFqb&quot;]&#39;))
$Search = $Selenium.FindElements([OpenQA.Selenium.By]::Name(&#39;q&#39;))
$Search = $Selenium.FindElements([OpenQA.Selenium.By]::XPath(&#39;//*[@name=&quot;q&quot;]&#39;))
$Search = $Selenium.FindElements([OpenQA.Selenium.By]::ClassName(&#39;gLFyf&#39;))
$Search = $Selenium.FindElements([OpenQA.Selenium.By]::CssSelector(&#39;[jsname=&quot;yZiJbe&quot;]&#39;))
$Search = $Selenium.FindElements([OpenQA.Selenium.By]::TagName(&#39;textarea&#39;)) | Where-Object ComputedAccessibleRole -eq combobox
$Search.SendKeys(&quot;calculator online&quot;) # передаем текст выбранному элементу
$Search.SendKeys([OpenQA.Selenium.Keys]::Enter) # нажимаем Enter для вызова функции поиска
Start-Sleep 1
$div = $Selenium.FindElements([OpenQA.Selenium.By]::TagName(&quot;div&quot;))
$2 = $div | Where-Object {($_.ComputedAccessibleRole -eq &quot;button&quot;) -and ($_.ComputedAccessibleLabel -eq &quot;2&quot;)}
$2.Click()
$2.Click()
$plus = $div | Where-Object {($_.ComputedAccessibleRole -eq &quot;button&quot;) -and ($_.Text -eq &quot;+&quot;)}
$plus.Click()
$3 = $Selenium.FindElement([OpenQA.Selenium.By]::CssSelector(&#39;[jsname=&quot;KN1kY&quot;]&#39;))
$3.Click()
$3.Click()
$sum = $Selenium.FindElement([OpenQA.Selenium.By]::CssSelector(&#39;[jsname=&quot;Pt8tGc&quot;]&#39;))
$sum.Click()
$result = $Selenium.FindElement([OpenQA.Selenium.By]::CssSelector(&#39;[jsname=&quot;VssY5c&quot;]&#39;)).Text
Write-Host &quot;Result: $result&quot; -ForegroundColor Green
}
finally {
$Selenium.Close()
$Selenium.Quit()
}</code></pre>
<h3 id="selenium-modules">Selenium modules</h3>
<div class="sourceCode" id="cb45"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb45-1"><a href="#cb45-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> https<span class="op">://</span>raw<span class="op">.</span><span class="fu">githubusercontent</span><span class="op">.</span><span class="fu">com</span><span class="op">/</span>Lifailon<span class="op">/</span>Selenium-Modules<span class="op">/</span>rsa<span class="op">/</span>Modules<span class="op">/</span>Get-GPT<span class="op">/</span>Get-GPT<span class="op">.</span><span class="fu">psm1</span> <span class="op">|</span> <span class="fu">Out-File</span> <span class="op">-</span>FilePath <span class="st">&quot;</span><span class="op">$(</span><span class="fu">New-Item</span> <span class="op">-</span>Path <span class="st">&quot;</span><span class="op">$($(</span><span class="va">$Env</span><span class="op">:</span><span class="va">PSModulePath</span> <span class="op">-split</span> <span class="st">&quot;;&quot;</span><span class="op">)[</span><span class="dv">0</span><span class="op">])</span><span class="st">\Get-GPT&quot;</span> <span class="op">-</span>ItemType Directory <span class="op">-</span>Force<span class="op">)</span><span class="st">\Get-GPT.psm1&quot;</span> <span class="op">-</span>Force</span></code></pre></div>
<p><code>Get-GPT "Исполняй роль калькулятора. Посчитай сумму чисел: 22+33"</code></p>
<div class="sourceCode" id="cb46"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb46-1"><a href="#cb46-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> https<span class="op">://</span>raw<span class="op">.</span><span class="fu">githubusercontent</span><span class="op">.</span><span class="fu">com</span><span class="op">/</span>Lifailon<span class="op">/</span>Selenium-Modules<span class="op">/</span>rsa<span class="op">/</span>Modules<span class="op">/</span>Get-Translation<span class="op">/</span>Get-Translation<span class="op">.</span><span class="fu">psm1</span> <span class="op">|</span> <span class="fu">Out-File</span> <span class="op">-</span>FilePath <span class="st">&quot;</span><span class="op">$(</span><span class="fu">New-Item</span> <span class="op">-</span>Path <span class="st">&quot;</span><span class="op">$($(</span><span class="va">$Env</span><span class="op">:</span><span class="va">PSModulePath</span> <span class="op">-split</span> <span class="st">&quot;;&quot;</span><span class="op">)[</span><span class="dv">0</span><span class="op">])</span><span class="st">\Get-Translation&quot;</span> <span class="op">-</span>ItemType Directory <span class="op">-</span>Force<span class="op">)</span><span class="st">\Get-Translation.psm1&quot;</span> <span class="op">-</span>Force</span></code></pre></div>
<p><code>Get-Translation -Provider DeepL -Text "I translating the text"</code><br />
<code>Get-Translation -Provider DeepL -Text "Я перевожу текст"</code><br />
<code>Get-Translation -Provider Google -Text "I translating the text"</code><br />
<code>Get-Translation -Provider Google -Text "Я перевожу текст" -Language en</code></p>
<div class="sourceCode" id="cb47"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb47-1"><a href="#cb47-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> https<span class="op">://</span>raw<span class="op">.</span><span class="fu">githubusercontent</span><span class="op">.</span><span class="fu">com</span><span class="op">/</span>Lifailon<span class="op">/</span>Selenium-Modules<span class="op">/</span>rsa<span class="op">/</span>Modules<span class="op">/</span>Get-SpeedTest<span class="op">/</span>Get-SpeedTest<span class="op">.</span><span class="fu">psm1</span> <span class="op">|</span> <span class="fu">Out-File</span> <span class="op">-</span>FilePath <span class="st">&quot;</span><span class="op">$(</span><span class="fu">New-Item</span> <span class="op">-</span>Path <span class="st">&quot;</span><span class="op">$($(</span><span class="va">$Env</span><span class="op">:</span><span class="va">PSModulePath</span> <span class="op">-split</span> <span class="st">&quot;;&quot;</span><span class="op">)[</span><span class="dv">0</span><span class="op">])</span><span class="st">\Get-SpeedTest&quot;</span> <span class="op">-</span>ItemType Directory <span class="op">-</span>Force<span class="op">)</span><span class="st">\Get-SpeedTest.psm1&quot;</span> <span class="op">-</span>Force</span></code></pre></div>
<p><code>Get-SpeedTest -Provider Libre</code><br />
<code>Get-SpeedTest -Provider Open</code><br />
<code>Get-SpeedTest -Provider Ookla</code></p>
<h1 id="ie">IE</h1>
<p><code>$ie.document.IHTMLDocument3_getElementsByTagName("input") | select name</code>
получить имена всех Input Box<br />
<code>$ie.document.IHTMLDocument3_getElementsByTagName("button") | select innerText</code>
получить имена всех Button<br />
<code>$ie.Document.documentElement.innerHTML</code> прочитать сырой Web
Content (&lt;input name=“login” tabindex=“100” class=“input__control
input__input” id=“uniq32005644019429136” spellcheck=“false”
placeholder=“Логин”)<br />
<code>$All_Elements = $ie.document.IHTMLDocument3_getElementsByTagName("*")</code>
забрать все элементы<br />
<code>$Go_Button = $All_Elements | ? innerText -like "go"</code> поиск
элемента по имени<br />
<code>$Go_Button | select ie9_tagName</code> получить TagName (SPAN) для
быстрого дальнейшего поиска<br />
<code>$SPAN_Elements = $ie.document.IHTMLDocument3_getElementsByTagName("SPAN")</code></p>
<div class="sourceCode" id="cb48"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb48-1"><a href="#cb48-1" aria-hidden="true" tabindex="-1"></a><span class="va">$ie</span> <span class="op">=</span> <span class="fu">New-Object</span> <span class="op">-</span>ComObject InternetExplorer<span class="op">.</span><span class="fu">Application</span></span>
<span id="cb48-2"><a href="#cb48-2" aria-hidden="true" tabindex="-1"></a><span class="va">$ie</span><span class="op">.</span><span class="fu">navigate</span><span class="op">(</span><span class="st">&quot;https://yandex.ru&quot;</span><span class="op">)</span></span>
<span id="cb48-3"><a href="#cb48-3" aria-hidden="true" tabindex="-1"></a><span class="va">$ie</span><span class="op">.</span><span class="fu">visible</span> <span class="op">=</span> <span class="va">$true</span></span>
<span id="cb48-4"><a href="#cb48-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ie</span><span class="op">.</span><span class="fu">document</span><span class="op">.</span><span class="fu">IHTMLDocument3_getElementByID</span><span class="op">(</span><span class="st">&quot;login&quot;</span><span class="op">).</span><span class="fu">value</span> <span class="op">=</span> <span class="st">&quot;Login&quot;</span></span>
<span id="cb48-5"><a href="#cb48-5" aria-hidden="true" tabindex="-1"></a><span class="va">$ie</span><span class="op">.</span><span class="fu">document</span><span class="op">.</span><span class="fu">IHTMLDocument3_getElementByID</span><span class="op">(</span><span class="st">&quot;passwd&quot;</span><span class="op">).</span><span class="fu">value</span> <span class="op">=</span> <span class="st">&quot;Password&quot;</span></span>
<span id="cb48-6"><a href="#cb48-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Button_Auth</span> <span class="op">=</span> <span class="op">(</span><span class="va">$ie</span><span class="op">.</span><span class="fu">document</span><span class="op">.</span><span class="fu">IHTMLDocument3_getElementsByTagName</span><span class="op">(</span><span class="st">&quot;button&quot;</span><span class="op">))</span> <span class="op">|</span> <span class="op">?</span> innerText <span class="op">-match</span> <span class="st">&quot;Войти&quot;</span></span>
<span id="cb48-7"><a href="#cb48-7" aria-hidden="true" tabindex="-1"></a><span class="va">$Button_Auth</span><span class="op">.</span><span class="fu">Click</span><span class="op">()</span></span>
<span id="cb48-8"><a href="#cb48-8" aria-hidden="true" tabindex="-1"></a><span class="va">$Result</span> <span class="op">=</span> <span class="va">$ie</span><span class="op">.</span><span class="fu">Document</span><span class="op">.</span><span class="fu">documentElement</span><span class="op">.</span><span class="fu">innerHTML</span></span>
<span id="cb48-9"><a href="#cb48-9" aria-hidden="true" tabindex="-1"></a><span class="va">$ie</span><span class="op">.</span><span class="fu">Quit</span><span class="op">()</span></span></code></pre></div>
<h1 id="com">COM</h1>
<p><code>$wshell = New-Object -ComObject Wscript.Shell</code><br />
<code>$wshell | Get-Member</code><br />
<code>$link = $wshell.CreateShortcut("$Home\Desktop\Yandex.lnk")</code>
создать ярлык<br />
<code>$link | Get-Member</code><br />
<code>$link.TargetPath = "https://yandex.ru"</code> куда ссылается
(метод TargetPath объекта <span class="math inline">$link где хранится
объект CreateShortcut) \
`$</span>link.Save()` сохранить</p>
<p><code>Set-WinUserLanguageList -LanguageList en-us,ru -Force</code>
изменить языковую раскладку клавиатуры</p>
<h3 id="wscript.shell.sendkeys">Wscript.Shell.SendKeys</h3>
<p><code>(New-Object -ComObject Wscript.shell).SendKeys([char]173)</code>
включить/выключить звук<br />
<code>$wshell.Exec("notepad.exe")</code> запустить приложение<br />
<code>$wshell.AppActivate("Блокнот")</code> развернуть запущенное
приложение</p>
<p><code>$wshell.SendKeys("Login")</code> текст<br />
<code>$wshell.SendKeys("{A 5}")</code> напечатать букву 5 раз
подряд<br />
<code>$wshell.SendKeys("%{TAB}")</code> ALT+TAB<br />
<code>$wshell.SendKeys("^")</code> CTRL<br />
<code>$wshell.SendKeys("%")</code> ALT<br />
<code>$wshell.SendKeys("+")</code> SHIFT<br />
<code>$wshell.SendKeys("{DOWN}")</code> вниз<br />
<code>$wshell.SendKeys("{UP}")</code> вверх<br />
<code>$wshell.SendKeys("{LEFT}")</code> влево<br />
<code>$wshell.SendKeys("{RIGHT}")</code> вправо<br />
<code>$wshell.SendKeys("{PGUP}")</code> PAGE UP<br />
<code>$wshell.SendKeys("{PGDN}")</code> PAGE DOWN<br />
<code>$wshell.SendKeys("{BACKSPACE}")</code> BACKSPACE/BKSP/BS<br />
<code>$wshell.SendKeys("{DEL}")</code> DEL/DELETE<br />
<code>$wshell.SendKeys("{INS}")</code> INS/INSERT<br />
<code>$wshell.SendKeys("{PRTSC}")</code> PRINT SCREEN<br />
<code>$wshell.SendKeys("{ENTER}")</code><br />
<code>$wshell.SendKeys("{ESC}")</code><br />
<code>$wshell.SendKeys("{TAB}")</code><br />
<code>$wshell.SendKeys("{END}")</code><br />
<code>$wshell.SendKeys("{HOME}")</code><br />
<code>$wshell.SendKeys("{BREAK}")</code><br />
<code>$wshell.SendKeys("{SCROLLLOCK}")</code><br />
<code>$wshell.SendKeys("{CAPSLOCK}")</code><br />
<code>$wshell.SendKeys("{NUMLOCK}")</code><br />
<code>$wshell.SendKeys("{F1}")</code><br />
<code>$wshell.SendKeys("{F12}")</code><br />
<code>$wshell.SendKeys("{+}{^}{%}{~}{(}{)}{[}{]}{{}{}}")</code></p>
<div class="sourceCode" id="cb49"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb49-1"><a href="#cb49-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-AltTab <span class="op">{</span></span>
<span id="cb49-2"><a href="#cb49-2" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="fu">New-Object</span> <span class="op">-</span>ComObject wscript<span class="op">.</span><span class="fu">shell</span><span class="op">).</span><span class="fu">SendKeys</span><span class="op">(</span><span class="st">&quot;%{Tab}&quot;</span><span class="op">)</span></span>
<span id="cb49-3"><a href="#cb49-3" aria-hidden="true" tabindex="-1"></a><span class="fu">Start-Sleep</span> <span class="op">$(</span><span class="fu">Get-Random</span> <span class="op">-</span>Minimum <span class="dv">30</span> <span class="op">-</span>Maximum <span class="dv">180</span><span class="op">)</span></span>
<span id="cb49-4"><a href="#cb49-4" aria-hidden="true" tabindex="-1"></a>Get-AltTab</span>
<span id="cb49-5"><a href="#cb49-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb49-6"><a href="#cb49-6" aria-hidden="true" tabindex="-1"></a>Get-AltTab</span></code></pre></div>
<h3 id="wscript.shell.popup">Wscript.Shell.Popup</h3>
<p><code>$wshell = New-Object -ComObject Wscript.Shell</code><br />
<code>$output = $wshell.Popup("Выберите действие?",0,"Заголовок",4)</code><br />
<code>if ($output -eq 6) {"yes"} elseif ($output -eq 7) {"no"} else {"no good"}</code></p>
<pre><code>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 Нет</code></pre>
<h3 id="wscript.network">WScript.Network</h3>
<p><code>$wshell = New-Object -ComObject WScript.Network</code><br />
<code>$wshell | Get-Member</code><br />
<code>$wshell.UserName</code><br />
<code>$wshell.ComputerName</code><br />
<code>$wshell.UserDomain</code></p>
<h3 id="shell.application">Shell.Application</h3>
<p><code>$wshell = New-Object -ComObject Shell.Application</code><br />
<code>$wshell | Get-Member</code><br />
<code>$wshell.Explore("C:\")</code><br />
<code>$wshell.Windows() | Get-Member</code> получить доступ к открытым в
проводнике или браузере Internet Explorer окон</p>
<p><code>$shell = New-Object -Com Shell.Application</code><br />
<code>$RecycleBin = $shell.Namespace(10)</code><br />
<code>$RecycleBin.Items()</code></p>
<h3 id="outlook">Outlook</h3>
<p><code>$Outlook = New-Object -ComObject Outlook.Application</code><br />
<code>$Outlook | Get-Member</code><br />
<code>$Outlook.Version</code></p>
<div class="sourceCode" id="cb51"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb51-1"><a href="#cb51-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Outlook</span> <span class="op">=</span> <span class="fu">New-Object</span> <span class="op">-</span>ComObject Outlook<span class="op">.</span><span class="fu">Application</span></span>
<span id="cb51-2"><a href="#cb51-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Namespace</span> <span class="op">=</span> <span class="va">$Outlook</span><span class="op">.</span><span class="fu">GetNamespace</span><span class="op">(</span><span class="st">&quot;MAPI&quot;</span><span class="op">)</span></span>
<span id="cb51-3"><a href="#cb51-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Folder</span> <span class="op">=</span> <span class="va">$namespace</span><span class="op">.</span><span class="fu">GetDefaultFolder</span><span class="op">(</span><span class="dv">4</span><span class="op">)</span><span class="ch">` </span>исходящие</span>
<span id="cb51-4"><a href="#cb51-4" aria-hidden="true" tabindex="-1"></a><span class="va">$Folder</span> <span class="op">=</span> <span class="va">$namespace</span><span class="op">.</span><span class="fu">GetDefaultFolder</span><span class="op">(</span><span class="dv">6</span><span class="op">)</span><span class="ch">` </span>входящие</span>
<span id="cb51-5"><a href="#cb51-5" aria-hidden="true" tabindex="-1"></a><span class="va">$Explorer</span> <span class="op">=</span> <span class="va">$Folder</span><span class="op">.</span><span class="fu">GetExplorer</span><span class="op">()</span></span>
<span id="cb51-6"><a href="#cb51-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Explorer</span><span class="op">.</span><span class="fu">Display</span><span class="op">()</span> </span>
<span id="cb51-7"><a href="#cb51-7" aria-hidden="true" tabindex="-1"></a><span class="va">$Outlook</span><span class="op">.</span><span class="fu">Quit</span><span class="op">()</span></span></code></pre></div>
<h3 id="microsoft.update">Microsoft.Update</h3>
<p><code>(New-Object -com 'Microsoft.Update.AutoUpdate').Settings</code><br />
<code>(New-Object -com 'Microsoft.Update.AutoUpdate').Results</code><br />
<code>(New-Timespan -Start ((New-Object -com 'Microsoft.Update.AutoUpdate').Results|Select -ExpandProperty LastInstallationSuccessDate) -End (Get-Date)).hours</code>
кол-во часов, прошедших с последней даты установки обновления
безопасности в Windows.</p>
<h1 id="dotnet">dotNET</h1>
<p><code>[System.Diagnostics.EventLog] | select Assembly,Module</code><br />
<code>$EventLog = [System.Diagnostics.EventLog]::new("Application")</code><br />
<code>$EventLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application,192.168.3.100</code><br />
<code>$EventLog | Get-Member -MemberType Method</code><br />
<code>$EventLog.MaximumKilobytes</code> максимальный размер
журнала<br />
<code>$EventLog.Entries</code> просмотреть журнал<br />
<code>$EventLog.Clear()</code> очистить журнал</p>
<p><code>Join-Path C: Install Test</code><br />
<code>[System.IO.Path]::Combine("C:", "Install", "Test")</code></p>
<h3 id="match">Match</h3>
<p><code>[System.Math] | Get-Member -Static -MemberType Methods</code><br />
<code>[System.Math]::Max(2,7)</code><br />
<code>[System.Math]::Min(2,7)</code><br />
<code>[System.Math]::Floor(3.9)</code><br />
<code>[System.Math]::Truncate(3.9)</code></p>
<h3 id="generatepassword">GeneratePassword</h3>
<p><code>Add-Type -AssemblyName System.Web</code><br />
<code>[System.Web.Security.Membership]::GeneratePassword(10,2)</code></p>
<h3 id="soundplayer">SoundPlayer</h3>
<div class="sourceCode" id="cb52"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb52-1"><a href="#cb52-1" aria-hidden="true" tabindex="-1"></a><span class="va">$CriticalSound</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Media</span><span class="op">.</span><span class="fu">SoundPlayer</span></span>
<span id="cb52-2"><a href="#cb52-2" aria-hidden="true" tabindex="-1"></a><span class="va">$CriticalSound</span><span class="op">.</span><span class="fu">SoundLocation</span> <span class="op">=</span> <span class="st">&quot;C:\WINDOWS\Media\Windows Critical Stop.wav&quot;</span></span>
<span id="cb52-3"><a href="#cb52-3" aria-hidden="true" tabindex="-1"></a><span class="va">$CriticalSound</span><span class="op">.</span><span class="fu">Play</span><span class="op">()</span></span>
<span id="cb52-4"><a href="#cb52-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb52-5"><a href="#cb52-5" aria-hidden="true" tabindex="-1"></a><span class="va">$GoodSound</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Media</span><span class="op">.</span><span class="fu">SoundPlayer</span></span>
<span id="cb52-6"><a href="#cb52-6" aria-hidden="true" tabindex="-1"></a><span class="va">$GoodSound</span><span class="op">.</span><span class="fu">SoundLocation</span> <span class="op">=</span> <span class="st">&quot;C:\WINDOWS\Media\tada.wav&quot;</span></span>
<span id="cb52-7"><a href="#cb52-7" aria-hidden="true" tabindex="-1"></a><span class="va">$GoodSound</span><span class="op">.</span><span class="fu">Play</span><span class="op">()</span></span></code></pre></div>
<h3 id="static-class">Static Class</h3>
<p><code>[System.Environment] | Get-Member -Static</code><br />
<code>[System.Environment]::OSVersion</code><br />
<code>[System.Environment]::Version</code><br />
<code>[System.Environment]::MachineName</code><br />
<code>[System.Environment]::UserName</code></p>
<p><code>[System.Diagnostics.Process] | Get-Member -Static</code><br />
<code>[System.Diagnostics.Process]::Start('notepad.exe')</code></p>
<h3 id="clicker">[Clicker]</h3>
<div class="sourceCode" id="cb53"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb53-1"><a href="#cb53-1" aria-hidden="true" tabindex="-1"></a><span class="va">$cSource</span> <span class="op">=</span> <span class="vs">@&#39;</span></span>
<span id="cb53-2"><a href="#cb53-2" aria-hidden="true" tabindex="-1"></a><span class="vs">using System;</span></span>
<span id="cb53-3"><a href="#cb53-3" aria-hidden="true" tabindex="-1"></a><span class="vs">using System.Drawing;</span></span>
<span id="cb53-4"><a href="#cb53-4" aria-hidden="true" tabindex="-1"></a><span class="vs">using System.Runtime.InteropServices;</span></span>
<span id="cb53-5"><a href="#cb53-5" aria-hidden="true" tabindex="-1"></a><span class="vs">using System.Windows.Forms;</span></span>
<span id="cb53-6"><a href="#cb53-6" aria-hidden="true" tabindex="-1"></a><span class="vs">public class Clicker</span></span>
<span id="cb53-7"><a href="#cb53-7" aria-hidden="true" tabindex="-1"></a><span class="vs">{</span></span>
<span id="cb53-8"><a href="#cb53-8" aria-hidden="true" tabindex="-1"></a><span class="vs">//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx</span></span>
<span id="cb53-9"><a href="#cb53-9" aria-hidden="true" tabindex="-1"></a><span class="vs">[StructLayout(LayoutKind.Sequential)]</span></span>
<span id="cb53-10"><a href="#cb53-10" aria-hidden="true" tabindex="-1"></a><span class="vs">struct INPUT</span></span>
<span id="cb53-11"><a href="#cb53-11" aria-hidden="true" tabindex="-1"></a><span class="vs">{ </span></span>
<span id="cb53-12"><a href="#cb53-12" aria-hidden="true" tabindex="-1"></a><span class="vs"> public int type; // 0 = INPUT_MOUSE,</span></span>
<span id="cb53-13"><a href="#cb53-13" aria-hidden="true" tabindex="-1"></a><span class="vs"> // 1 = INPUT_KEYBOARD</span></span>
<span id="cb53-14"><a href="#cb53-14" aria-hidden="true" tabindex="-1"></a><span class="vs"> // 2 = INPUT_HARDWARE</span></span>
<span id="cb53-15"><a href="#cb53-15" aria-hidden="true" tabindex="-1"></a><span class="vs"> public MOUSEINPUT mi;</span></span>
<span id="cb53-16"><a href="#cb53-16" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb53-17"><a href="#cb53-17" aria-hidden="true" tabindex="-1"></a><span class="vs">//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646273(v=vs.85).aspx</span></span>
<span id="cb53-18"><a href="#cb53-18" aria-hidden="true" tabindex="-1"></a><span class="vs">[StructLayout(LayoutKind.Sequential)]</span></span>
<span id="cb53-19"><a href="#cb53-19" aria-hidden="true" tabindex="-1"></a><span class="vs">struct MOUSEINPUT</span></span>
<span id="cb53-20"><a href="#cb53-20" aria-hidden="true" tabindex="-1"></a><span class="vs">{</span></span>
<span id="cb53-21"><a href="#cb53-21" aria-hidden="true" tabindex="-1"></a><span class="vs"> public int dx ;</span></span>
<span id="cb53-22"><a href="#cb53-22" aria-hidden="true" tabindex="-1"></a><span class="vs"> public int dy ;</span></span>
<span id="cb53-23"><a href="#cb53-23" aria-hidden="true" tabindex="-1"></a><span class="vs"> public int mouseData ;</span></span>
<span id="cb53-24"><a href="#cb53-24" aria-hidden="true" tabindex="-1"></a><span class="vs"> public int dwFlags;</span></span>
<span id="cb53-25"><a href="#cb53-25" aria-hidden="true" tabindex="-1"></a><span class="vs"> public int time;</span></span>
<span id="cb53-26"><a href="#cb53-26" aria-hidden="true" tabindex="-1"></a><span class="vs"> public IntPtr dwExtraInfo;</span></span>
<span id="cb53-27"><a href="#cb53-27" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb53-28"><a href="#cb53-28" aria-hidden="true" tabindex="-1"></a><span class="vs">//This covers most use cases although complex mice may have additional buttons</span></span>
<span id="cb53-29"><a href="#cb53-29" aria-hidden="true" tabindex="-1"></a><span class="vs">//There are additional constants you can use for those cases, see the msdn page</span></span>
<span id="cb53-30"><a href="#cb53-30" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_MOVED = 0x0001 ;</span></span>
<span id="cb53-31"><a href="#cb53-31" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_LEFTDOWN = 0x0002 ;</span></span>
<span id="cb53-32"><a href="#cb53-32" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_LEFTUP = 0x0004 ;</span></span>
<span id="cb53-33"><a href="#cb53-33" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_RIGHTDOWN = 0x0008 ;</span></span>
<span id="cb53-34"><a href="#cb53-34" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_RIGHTUP = 0x0010 ;</span></span>
<span id="cb53-35"><a href="#cb53-35" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_MIDDLEDOWN = 0x0020 ;</span></span>
<span id="cb53-36"><a href="#cb53-36" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_MIDDLEUP = 0x0040 ;</span></span>
<span id="cb53-37"><a href="#cb53-37" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_WHEEL = 0x0080 ;</span></span>
<span id="cb53-38"><a href="#cb53-38" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_XDOWN = 0x0100 ;</span></span>
<span id="cb53-39"><a href="#cb53-39" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_XUP = 0x0200 ;</span></span>
<span id="cb53-40"><a href="#cb53-40" aria-hidden="true" tabindex="-1"></a><span class="vs">const int MOUSEEVENTF_ABSOLUTE = 0x8000 ;</span></span>
<span id="cb53-41"><a href="#cb53-41" aria-hidden="true" tabindex="-1"></a><span class="vs">const int screen_length = 0x10000 ;</span></span>
<span id="cb53-42"><a href="#cb53-42" aria-hidden="true" tabindex="-1"></a><span class="vs">//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx</span></span>
<span id="cb53-43"><a href="#cb53-43" aria-hidden="true" tabindex="-1"></a><span class="vs">[System.Runtime.InteropServices.DllImport(&quot;user32.dll&quot;)]</span></span>
<span id="cb53-44"><a href="#cb53-44" aria-hidden="true" tabindex="-1"></a><span class="vs">extern static uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);</span></span>
<span id="cb53-45"><a href="#cb53-45" aria-hidden="true" tabindex="-1"></a><span class="vs">public static void LeftClickAtPoint(int x, int y)</span></span>
<span id="cb53-46"><a href="#cb53-46" aria-hidden="true" tabindex="-1"></a><span class="vs">{</span></span>
<span id="cb53-47"><a href="#cb53-47" aria-hidden="true" tabindex="-1"></a><span class="vs"> //Move the mouse</span></span>
<span id="cb53-48"><a href="#cb53-48" aria-hidden="true" tabindex="-1"></a><span class="vs"> INPUT[] input = new INPUT[3];</span></span>
<span id="cb53-49"><a href="#cb53-49" aria-hidden="true" tabindex="-1"></a><span class="vs"> input[0].mi.dx = x*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width);</span></span>
<span id="cb53-50"><a href="#cb53-50" aria-hidden="true" tabindex="-1"></a><span class="vs"> input[0].mi.dy = y*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height);</span></span>
<span id="cb53-51"><a href="#cb53-51" aria-hidden="true" tabindex="-1"></a><span class="vs"> input[0].mi.dwFlags = MOUSEEVENTF_MOVED | MOUSEEVENTF_ABSOLUTE;</span></span>
<span id="cb53-52"><a href="#cb53-52" aria-hidden="true" tabindex="-1"></a><span class="vs"> //Left mouse button down</span></span>
<span id="cb53-53"><a href="#cb53-53" aria-hidden="true" tabindex="-1"></a><span class="vs"> input[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;</span></span>
<span id="cb53-54"><a href="#cb53-54" aria-hidden="true" tabindex="-1"></a><span class="vs"> //Left mouse button up</span></span>
<span id="cb53-55"><a href="#cb53-55" aria-hidden="true" tabindex="-1"></a><span class="vs"> input[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;</span></span>
<span id="cb53-56"><a href="#cb53-56" aria-hidden="true" tabindex="-1"></a><span class="vs"> SendInput(3, input, Marshal.SizeOf(input[0]));</span></span>
<span id="cb53-57"><a href="#cb53-57" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb53-58"><a href="#cb53-58" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb53-59"><a href="#cb53-59" aria-hidden="true" tabindex="-1"></a><span class="vs">&#39;@</span></span></code></pre></div>
<p><code>Add-Type -TypeDefinition $cSource -ReferencedAssemblies System.Windows.Forms,System.Drawing</code><br />
<code>[Clicker]::LeftClickAtPoint(1900,1070)</code></p>
<h3 id="audio">[Audio]</h3>
<div class="sourceCode" id="cb54"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb54-1"><a href="#cb54-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Add-Type</span> <span class="op">-</span>Language CsharpVersion3 <span class="op">-</span>TypeDefinition <span class="vs">@&quot;</span></span>
<span id="cb54-2"><a href="#cb54-2" aria-hidden="true" tabindex="-1"></a><span class="vs">using System.Runtime.InteropServices;</span></span>
<span id="cb54-3"><a href="#cb54-3" aria-hidden="true" tabindex="-1"></a><span class="vs">[Guid(&quot;5CDF2C82-841E-4546-9722-0CF74078229A&quot;), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]</span></span>
<span id="cb54-4"><a href="#cb54-4" aria-hidden="true" tabindex="-1"></a><span class="vs">interface IAudioEndpointVolume {</span></span>
<span id="cb54-5"><a href="#cb54-5" aria-hidden="true" tabindex="-1"></a><span class="vs">// f(), g(), ... are unused COM method slots. Define these if you care</span></span>
<span id="cb54-6"><a href="#cb54-6" aria-hidden="true" tabindex="-1"></a><span class="vs">int f(); int g(); int h(); int i();</span></span>
<span id="cb54-7"><a href="#cb54-7" aria-hidden="true" tabindex="-1"></a><span class="vs">int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext);</span></span>
<span id="cb54-8"><a href="#cb54-8" aria-hidden="true" tabindex="-1"></a><span class="vs">int j();</span></span>
<span id="cb54-9"><a href="#cb54-9" aria-hidden="true" tabindex="-1"></a><span class="vs">int GetMasterVolumeLevelScalar(out float pfLevel);</span></span>
<span id="cb54-10"><a href="#cb54-10" aria-hidden="true" tabindex="-1"></a><span class="vs">int k(); int l(); int m(); int n();</span></span>
<span id="cb54-11"><a href="#cb54-11" aria-hidden="true" tabindex="-1"></a><span class="vs">int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext);</span></span>
<span id="cb54-12"><a href="#cb54-12" aria-hidden="true" tabindex="-1"></a><span class="vs">int GetMute(out bool pbMute);</span></span>
<span id="cb54-13"><a href="#cb54-13" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb54-14"><a href="#cb54-14" aria-hidden="true" tabindex="-1"></a><span class="vs">[Guid(&quot;D666063F-1587-4E43-81F1-B948E807363F&quot;), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]</span></span>
<span id="cb54-15"><a href="#cb54-15" aria-hidden="true" tabindex="-1"></a><span class="vs">interface IMMDevice {</span></span>
<span id="cb54-16"><a href="#cb54-16" aria-hidden="true" tabindex="-1"></a><span class="vs">int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev);</span></span>
<span id="cb54-17"><a href="#cb54-17" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb54-18"><a href="#cb54-18" aria-hidden="true" tabindex="-1"></a><span class="vs">[Guid(&quot;A95664D2-9614-4F35-A746-DE8DB63617E6&quot;), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]</span></span>
<span id="cb54-19"><a href="#cb54-19" aria-hidden="true" tabindex="-1"></a><span class="vs">interface IMMDeviceEnumerator {</span></span>
<span id="cb54-20"><a href="#cb54-20" aria-hidden="true" tabindex="-1"></a><span class="vs">int f(); // Unused</span></span>
<span id="cb54-21"><a href="#cb54-21" aria-hidden="true" tabindex="-1"></a><span class="vs">int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint);</span></span>
<span id="cb54-22"><a href="#cb54-22" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb54-23"><a href="#cb54-23" aria-hidden="true" tabindex="-1"></a><span class="vs">[ComImport, Guid(&quot;BCDE0395-E52F-467C-8E3D-C4579291692E&quot;)] class MMDeviceEnumeratorComObject { }</span></span>
<span id="cb54-24"><a href="#cb54-24" aria-hidden="true" tabindex="-1"></a><span class="vs">public class Audio {</span></span>
<span id="cb54-25"><a href="#cb54-25" aria-hidden="true" tabindex="-1"></a><span class="vs">static IAudioEndpointVolume Vol() {</span></span>
<span id="cb54-26"><a href="#cb54-26" aria-hidden="true" tabindex="-1"></a><span class="vs">var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;</span></span>
<span id="cb54-27"><a href="#cb54-27" aria-hidden="true" tabindex="-1"></a><span class="vs">IMMDevice dev = null;</span></span>
<span id="cb54-28"><a href="#cb54-28" aria-hidden="true" tabindex="-1"></a><span class="vs">Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev));</span></span>
<span id="cb54-29"><a href="#cb54-29" aria-hidden="true" tabindex="-1"></a><span class="vs">IAudioEndpointVolume epv = null;</span></span>
<span id="cb54-30"><a href="#cb54-30" aria-hidden="true" tabindex="-1"></a><span class="vs">var epvid = typeof(IAudioEndpointVolume).GUID;</span></span>
<span id="cb54-31"><a href="#cb54-31" aria-hidden="true" tabindex="-1"></a><span class="vs">Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv));</span></span>
<span id="cb54-32"><a href="#cb54-32" aria-hidden="true" tabindex="-1"></a><span class="vs">return epv;</span></span>
<span id="cb54-33"><a href="#cb54-33" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb54-34"><a href="#cb54-34" aria-hidden="true" tabindex="-1"></a><span class="vs">public static float Volume {</span></span>
<span id="cb54-35"><a href="#cb54-35" aria-hidden="true" tabindex="-1"></a><span class="vs">get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;}</span></span>
<span id="cb54-36"><a href="#cb54-36" aria-hidden="true" tabindex="-1"></a><span class="vs">set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));}</span></span>
<span id="cb54-37"><a href="#cb54-37" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb54-38"><a href="#cb54-38" aria-hidden="true" tabindex="-1"></a><span class="vs">public static bool Mute {</span></span>
<span id="cb54-39"><a href="#cb54-39" aria-hidden="true" tabindex="-1"></a><span class="vs">get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; }</span></span>
<span id="cb54-40"><a href="#cb54-40" aria-hidden="true" tabindex="-1"></a><span class="vs">set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); }</span></span>
<span id="cb54-41"><a href="#cb54-41" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb54-42"><a href="#cb54-42" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb54-43"><a href="#cb54-43" aria-hidden="true" tabindex="-1"></a><span class="vs">&quot;@</span></span></code></pre></div>
<p><code>[Audio]::Volume = 0.50</code><br />
<code>[Audio]::Mute = $true</code></p>
<h3 id="netsessionenum">NetSessionEnum</h3>
<p>Function:
https://learn.microsoft.com/ru-ru/windows/win32/api/lmshare/nf-lmshare-netsessionenum?redirectedfrom=MSDN<br />
Source: https://fuzzysecurity.com/tutorials/24.html</p>
<div class="sourceCode" id="cb55"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb55-1"><a href="#cb55-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Invoke-NetSessionEnum <span class="op">{</span></span>
<span id="cb55-2"><a href="#cb55-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span> <span class="op">(</span></span>
<span id="cb55-3"><a href="#cb55-3" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Parameter<span class="op">(</span>Mandatory <span class="op">=</span> <span class="va">$True</span><span class="op">)][</span><span class="dt">string</span><span class="op">]</span><span class="va">$HostName</span></span>
<span id="cb55-4"><a href="#cb55-4" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
<span id="cb55-5"><a href="#cb55-5" aria-hidden="true" tabindex="-1"></a><span class="fu">Add-Type</span> <span class="op">-</span>TypeDefinition <span class="vs">@&quot;</span></span>
<span id="cb55-6"><a href="#cb55-6" aria-hidden="true" tabindex="-1"></a><span class="vs">using System;</span></span>
<span id="cb55-7"><a href="#cb55-7" aria-hidden="true" tabindex="-1"></a><span class="vs">using System.Diagnostics;</span></span>
<span id="cb55-8"><a href="#cb55-8" aria-hidden="true" tabindex="-1"></a><span class="vs">using System.Runtime.InteropServices;</span></span>
<span id="cb55-9"><a href="#cb55-9" aria-hidden="true" tabindex="-1"></a><span class="vs">[StructLayout(LayoutKind.Sequential)]</span></span>
<span id="cb55-10"><a href="#cb55-10" aria-hidden="true" tabindex="-1"></a><span class="vs">public struct SESSION_INFO_10</span></span>
<span id="cb55-11"><a href="#cb55-11" aria-hidden="true" tabindex="-1"></a><span class="vs">{</span></span>
<span id="cb55-12"><a href="#cb55-12" aria-hidden="true" tabindex="-1"></a><span class="vs"> [MarshalAs(UnmanagedType.LPWStr)]public string OriginatingHost;</span></span>
<span id="cb55-13"><a href="#cb55-13" aria-hidden="true" tabindex="-1"></a><span class="vs"> [MarshalAs(UnmanagedType.LPWStr)]public string DomainUser;</span></span>
<span id="cb55-14"><a href="#cb55-14" aria-hidden="true" tabindex="-1"></a><span class="vs"> public uint SessionTime;</span></span>
<span id="cb55-15"><a href="#cb55-15" aria-hidden="true" tabindex="-1"></a><span class="vs"> public uint IdleTime;</span></span>
<span id="cb55-16"><a href="#cb55-16" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb55-17"><a href="#cb55-17" aria-hidden="true" tabindex="-1"></a><span class="vs">public static class Netapi32</span></span>
<span id="cb55-18"><a href="#cb55-18" aria-hidden="true" tabindex="-1"></a><span class="vs">{</span></span>
<span id="cb55-19"><a href="#cb55-19" aria-hidden="true" tabindex="-1"></a><span class="vs">[DllImport(&quot;Netapi32.dll&quot;, SetLastError=true)]</span></span>
<span id="cb55-20"><a href="#cb55-20" aria-hidden="true" tabindex="-1"></a><span class="vs"> public static extern int NetSessionEnum(</span></span>
<span id="cb55-21"><a href="#cb55-21" aria-hidden="true" tabindex="-1"></a><span class="vs"> [In,MarshalAs(UnmanagedType.LPWStr)] string ServerName,</span></span>
<span id="cb55-22"><a href="#cb55-22" aria-hidden="true" tabindex="-1"></a><span class="vs"> [In,MarshalAs(UnmanagedType.LPWStr)] string UncClientName,</span></span>
<span id="cb55-23"><a href="#cb55-23" aria-hidden="true" tabindex="-1"></a><span class="vs"> [In,MarshalAs(UnmanagedType.LPWStr)] string UserName,</span></span>
<span id="cb55-24"><a href="#cb55-24" aria-hidden="true" tabindex="-1"></a><span class="vs"> Int32 Level,</span></span>
<span id="cb55-25"><a href="#cb55-25" aria-hidden="true" tabindex="-1"></a><span class="vs"> out IntPtr bufptr,</span></span>
<span id="cb55-26"><a href="#cb55-26" aria-hidden="true" tabindex="-1"></a><span class="vs"> int prefmaxlen,</span></span>
<span id="cb55-27"><a href="#cb55-27" aria-hidden="true" tabindex="-1"></a><span class="vs"> ref Int32 entriesread,</span></span>
<span id="cb55-28"><a href="#cb55-28" aria-hidden="true" tabindex="-1"></a><span class="vs"> ref Int32 totalentries,</span></span>
<span id="cb55-29"><a href="#cb55-29" aria-hidden="true" tabindex="-1"></a><span class="vs"> ref Int32 resume_handle);</span></span>
<span id="cb55-30"><a href="#cb55-30" aria-hidden="true" tabindex="-1"></a><span class="vs"> </span></span>
<span id="cb55-31"><a href="#cb55-31" aria-hidden="true" tabindex="-1"></a><span class="vs">[DllImport(&quot;Netapi32.dll&quot;, SetLastError=true)]</span></span>
<span id="cb55-32"><a href="#cb55-32" aria-hidden="true" tabindex="-1"></a><span class="vs"> public static extern int NetApiBufferFree(</span></span>
<span id="cb55-33"><a href="#cb55-33" aria-hidden="true" tabindex="-1"></a><span class="vs"> IntPtr Buffer);</span></span>
<span id="cb55-34"><a href="#cb55-34" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb55-35"><a href="#cb55-35" aria-hidden="true" tabindex="-1"></a><span class="vs">&quot;@</span></span>
<span id="cb55-36"><a href="#cb55-36" aria-hidden="true" tabindex="-1"></a><span class="co"># Create SessionInfo10 Struct</span></span>
<span id="cb55-37"><a href="#cb55-37" aria-hidden="true" tabindex="-1"></a><span class="va">$SessionInfo10</span> <span class="op">=</span> <span class="fu">New-Object</span> SESSION_INFO_10</span>
<span id="cb55-38"><a href="#cb55-38" aria-hidden="true" tabindex="-1"></a><span class="va">$SessionInfo10StructSize</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Runtime</span><span class="op">.</span><span class="fu">InteropServices</span><span class="op">.</span><span class="fu">Marshal</span><span class="op">]::</span>SizeOf<span class="op">(</span><span class="va">$SessionInfo10</span><span class="op">)</span><span class="ch">` </span>Grab size to loop bufptr</span>
<span id="cb55-39"><a href="#cb55-39" aria-hidden="true" tabindex="-1"></a><span class="va">$SessionInfo10</span> <span class="op">=</span> <span class="va">$SessionInfo10</span><span class="op">.</span><span class="fu">GetType</span><span class="op">()</span><span class="ch">` </span>Hacky<span class="op">,</span> but we need this <span class="op">;))</span></span>
<span id="cb55-40"><a href="#cb55-40" aria-hidden="true" tabindex="-1"></a><span class="co"># NetSessionEnum params</span></span>
<span id="cb55-41"><a href="#cb55-41" aria-hidden="true" tabindex="-1"></a><span class="va">$OutBuffPtr</span> <span class="op">=</span> <span class="op">[</span>IntPtr<span class="op">]::</span>Zero<span class="ch">` </span>Struct output buffer</span>
<span id="cb55-42"><a href="#cb55-42" aria-hidden="true" tabindex="-1"></a><span class="va">$EntriesRead</span> <span class="op">=</span> <span class="va">$TotalEntries</span> <span class="op">=</span> <span class="va">$ResumeHandle</span> <span class="op">=</span> <span class="dv">0</span><span class="ch">` </span>Counters <span class="op">&amp;</span> ResumeHandle</span>
<span id="cb55-43"><a href="#cb55-43" aria-hidden="true" tabindex="-1"></a><span class="va">$CallResult</span> <span class="op">=</span> <span class="op">[</span>Netapi32<span class="op">]::</span>NetSessionEnum<span class="op">(</span><span class="va">$HostName</span><span class="op">,</span> <span class="st">&quot;&quot;</span><span class="op">,</span> <span class="st">&quot;&quot;</span><span class="op">,</span> <span class="dv">10</span><span class="op">,</span> <span class="op">[</span>ref<span class="op">]</span><span class="va">$OutBuffPtr</span><span class="op">,</span> <span class="op">-</span><span class="dv">1</span><span class="op">,</span> <span class="op">[</span>ref<span class="op">]</span><span class="va">$EntriesRead</span><span class="op">,</span> <span class="op">[</span>ref<span class="op">]</span><span class="va">$TotalEntries</span><span class="op">,</span> <span class="op">[</span>ref<span class="op">]</span><span class="va">$ResumeHandle</span><span class="op">)</span></span>
<span id="cb55-44"><a href="#cb55-44" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$CallResult</span> <span class="op">-ne</span> <span class="dv">0</span><span class="op">){</span></span>
<span id="cb55-45"><a href="#cb55-45" aria-hidden="true" tabindex="-1"></a><span class="fu">echo</span> <span class="st">&quot;Mmm something went wrong!</span><span class="ch">`n</span><span class="st">Error Code: </span><span class="va">$CallResult</span><span class="st">&quot;</span></span>
<span id="cb55-46"><a href="#cb55-46" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb55-47"><a href="#cb55-47" aria-hidden="true" tabindex="-1"></a><span class="cf">else</span> <span class="op">{</span></span>
<span id="cb55-48"><a href="#cb55-48" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">([</span>System<span class="op">.</span><span class="fu">IntPtr</span><span class="op">]::</span>Size <span class="op">-eq</span> <span class="dv">4</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb55-49"><a href="#cb55-49" aria-hidden="true" tabindex="-1"></a><span class="fu">echo</span> <span class="st">&quot;</span><span class="ch">`n</span><span class="st">Netapi32::NetSessionEnum Buffer Offset --&gt; 0x</span><span class="op">$(</span><span class="st">&quot;{0:X8}&quot;</span> <span class="op">-</span>f <span class="va">$OutBuffPtr</span><span class="op">.</span><span class="fu">ToInt32</span><span class="op">()</span><span class="st">)&quot;</span></span>
<span id="cb55-50"><a href="#cb55-50" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb55-51"><a href="#cb55-51" aria-hidden="true" tabindex="-1"></a><span class="cf">else</span> <span class="op">{</span></span>
<span id="cb55-52"><a href="#cb55-52" aria-hidden="true" tabindex="-1"></a><span class="fu">echo</span> <span class="st">&quot;</span><span class="ch">`n</span><span class="st">Netapi32::NetSessionEnum Buffer Offset --&gt; 0x</span><span class="op">$(</span><span class="st">&quot;{0:X16}&quot;</span> <span class="op">-</span>f <span class="va">$OutBuffPtr</span><span class="op">.</span><span class="fu">ToInt64</span><span class="op">()</span><span class="st">)&quot;</span></span>
<span id="cb55-53"><a href="#cb55-53" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb55-54"><a href="#cb55-54" aria-hidden="true" tabindex="-1"></a><span class="fu">echo</span> <span class="st">&quot;Result-set contains </span><span class="va">$EntriesRead</span><span class="st"> session(s)!&quot;</span></span>
<span id="cb55-55"><a href="#cb55-55" aria-hidden="true" tabindex="-1"></a><span class="co"># Change buffer offset to int</span></span>
<span id="cb55-56"><a href="#cb55-56" aria-hidden="true" tabindex="-1"></a><span class="va">$BufferOffset</span> <span class="op">=</span> <span class="va">$OutBuffPtr</span><span class="op">.</span><span class="fu">ToInt64</span><span class="op">()</span></span>
<span id="cb55-57"><a href="#cb55-57" aria-hidden="true" tabindex="-1"></a><span class="co"># Loop buffer entries and cast pointers as SessionInfo10</span></span>
<span id="cb55-58"><a href="#cb55-58" aria-hidden="true" tabindex="-1"></a><span class="cf">for</span> <span class="op">(</span><span class="va">$Count</span> <span class="op">=</span> <span class="dv">0</span><span class="op">;</span> <span class="op">(</span><span class="va">$Count</span> <span class="op">-lt</span> <span class="va">$EntriesRead</span><span class="op">);</span> <span class="va">$Count</span><span class="op">++){</span></span>
<span id="cb55-59"><a href="#cb55-59" aria-hidden="true" tabindex="-1"></a><span class="va">$NewIntPtr</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Intptr</span> <span class="op">-</span>ArgumentList <span class="va">$BufferOffset</span></span>
<span id="cb55-60"><a href="#cb55-60" aria-hidden="true" tabindex="-1"></a><span class="va">$Info</span> <span class="op">=</span> <span class="op">[</span>system<span class="op">.</span><span class="fu">runtime</span><span class="op">.</span><span class="fu">interopservices</span><span class="op">.</span><span class="fu">marshal</span><span class="op">]::</span>PtrToStructure<span class="op">(</span><span class="va">$NewIntPtr</span><span class="op">,[</span>type<span class="op">]</span><span class="va">$SessionInfo10</span><span class="op">)</span></span>
<span id="cb55-61"><a href="#cb55-61" aria-hidden="true" tabindex="-1"></a><span class="va">$Info</span></span>
<span id="cb55-62"><a href="#cb55-62" aria-hidden="true" tabindex="-1"></a><span class="va">$BufferOffset</span> <span class="op">=</span> <span class="va">$BufferOffset</span> <span class="op">+</span> <span class="va">$SessionInfo10StructSize</span></span>
<span id="cb55-63"><a href="#cb55-63" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb55-64"><a href="#cb55-64" aria-hidden="true" tabindex="-1"></a><span class="fu">echo</span> <span class="st">&quot;</span><span class="ch">`n</span><span class="st">Calling NetApiBufferFree, no memleaks here!&quot;</span></span>
<span id="cb55-65"><a href="#cb55-65" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Netapi32<span class="op">]::</span>NetApiBufferFree<span class="op">(</span><span class="va">$OutBuffPtr</span><span class="op">)</span> <span class="op">|</span><span class="fu">Out-Null</span></span>
<span id="cb55-66"><a href="#cb55-66" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb55-67"><a href="#cb55-67" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Invoke-NetSessionEnum localhost</code></p>
<h3 id="copyfile">CopyFile</h3>
<p>Function:
https://learn.microsoft.com/ru-ru/windows/win32/api/winbase/nf-winbase-copyfile<br />
Source:
https://devblogs.microsoft.com/scripting/use-powershell-to-interact-with-the-windows-api-part-1/</p>
<div class="sourceCode" id="cb56"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb56-1"><a href="#cb56-1" aria-hidden="true" tabindex="-1"></a><span class="va">$MethodDefinition</span> <span class="op">=</span> <span class="vs">@&quot;</span></span>
<span id="cb56-2"><a href="#cb56-2" aria-hidden="true" tabindex="-1"></a><span class="vs">[DllImport(&quot;kernel32.dll&quot;, CharSet = CharSet.Unicode)]</span></span>
<span id="cb56-3"><a href="#cb56-3" aria-hidden="true" tabindex="-1"></a><span class="vs">public static extern bool CopyFile(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);</span></span>
<span id="cb56-4"><a href="#cb56-4" aria-hidden="true" tabindex="-1"></a><span class="vs">&quot;@</span></span>
<span id="cb56-5"><a href="#cb56-5" aria-hidden="true" tabindex="-1"></a><span class="va">$Kernel32</span> <span class="op">=</span> <span class="fu">Add-Type</span> <span class="op">-</span>MemberDefinition <span class="va">$MethodDefinition</span> <span class="op">-</span>Name <span class="st">&quot;Kernel32&quot;</span> <span class="op">-</span>Namespace <span class="st">&quot;Win32&quot;</span> <span class="op">-</span>PassThru</span>
<span id="cb56-6"><a href="#cb56-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Kernel32</span><span class="op">::</span>CopyFile<span class="op">(</span><span class="st">&quot;</span><span class="op">$(</span><span class="va">$Env</span><span class="op">:</span><span class="va">SystemRoot</span><span class="op">)</span><span class="st">\System32\calc.exe&quot;</span><span class="op">,</span> <span class="st">&quot;</span><span class="op">$(</span><span class="va">$Env</span><span class="op">:</span><span class="va">USERPROFILE</span><span class="op">)</span><span class="st">\Desktop\calc.exe&quot;</span><span class="op">,</span> <span class="va">$False</span><span class="op">)</span> </span></code></pre></div>
<h3 id="showwindowasync">ShowWindowAsync</h3>
<p>Function:
https://learn.microsoft.com/ru-ru/windows/win32/api/winuser/nf-winuser-showwindowasync</p>
<div class="sourceCode" id="cb57"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb57-1"><a href="#cb57-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Signature</span> <span class="op">=</span> <span class="vs">@&quot;</span></span>
<span id="cb57-2"><a href="#cb57-2" aria-hidden="true" tabindex="-1"></a><span class="vs">[DllImport(&quot;user32.dll&quot;)]public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);</span></span>
<span id="cb57-3"><a href="#cb57-3" aria-hidden="true" tabindex="-1"></a><span class="vs">&quot;@</span></span>
<span id="cb57-4"><a href="#cb57-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ShowWindowAsync</span> <span class="op">=</span> <span class="fu">Add-Type</span> <span class="op">-</span>MemberDefinition <span class="va">$Signature</span> <span class="op">-</span>Name <span class="st">&quot;Win32ShowWindowAsync&quot;</span> <span class="op">-</span>Namespace Win32Functions <span class="op">-</span>PassThru</span>
<span id="cb57-5"><a href="#cb57-5" aria-hidden="true" tabindex="-1"></a><span class="va">$ShowWindowAsync</span> <span class="op">|</span> <span class="fu">Get-Member</span> <span class="op">-</span>Static</span>
<span id="cb57-6"><a href="#cb57-6" aria-hidden="true" tabindex="-1"></a><span class="va">$ShowWindowAsync</span><span class="op">::</span>ShowWindowAsync<span class="op">((</span><span class="fu">Get-Process</span> <span class="op">-</span>Id <span class="va">$pid</span><span class="op">).</span><span class="fu">MainWindowHandle</span><span class="op">,</span> <span class="dv">2</span><span class="op">)</span></span>
<span id="cb57-7"><a href="#cb57-7" aria-hidden="true" tabindex="-1"></a><span class="va">$ShowWindowAsync</span><span class="op">::</span>ShowWindowAsync<span class="op">((</span><span class="fu">Get-Process</span> <span class="op">-</span>Id <span class="va">$Pid</span><span class="op">).</span><span class="fu">MainWindowHandle</span><span class="op">,</span> <span class="dv">3</span><span class="op">)</span></span>
<span id="cb57-8"><a href="#cb57-8" aria-hidden="true" tabindex="-1"></a><span class="va">$ShowWindowAsync</span><span class="op">::</span>ShowWindowAsync<span class="op">((</span><span class="fu">Get-Process</span> <span class="op">-</span>Id <span class="va">$Pid</span><span class="op">).</span><span class="fu">MainWindowHandle</span><span class="op">,</span> <span class="dv">4</span><span class="op">)</span></span></code></pre></div>
<h3 id="getasynckeystate">GetAsyncKeyState</h3>
<p>Function:
https://learn.microsoft.com/ru-ru/windows/win32/api/winuser/nf-winuser-getasynckeystate</p>
<p><code>Add-Type -AssemblyName System.Windows.Forms</code><br />
<code>[int][System.Windows.Forms.Keys]::F1</code> определить номер [Int]
клавиши по ее названию<br />
<code>65..90 | % {"{0} = {1}" -f $_, [System.Windows.Forms.Keys]$_}</code>
порядковый номер букв (A..Z)</p>
<div class="sourceCode" id="cb58"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb58-1"><a href="#cb58-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-ControlKey <span class="op">{</span></span>
<span id="cb58-2"><a href="#cb58-2" aria-hidden="true" tabindex="-1"></a><span class="va">$key</span> <span class="op">=</span> <span class="dv">112</span></span>
<span id="cb58-3"><a href="#cb58-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Signature</span> <span class="op">=</span> <span class="vs">@&#39;</span></span>
<span id="cb58-4"><a href="#cb58-4" aria-hidden="true" tabindex="-1"></a><span class="vs">[DllImport(&quot;user32.dll&quot;, CharSet=CharSet.Auto, ExactSpelling=true)] </span></span>
<span id="cb58-5"><a href="#cb58-5" aria-hidden="true" tabindex="-1"></a><span class="vs">public static extern short GetAsyncKeyState(int virtualKeyCode); </span></span>
<span id="cb58-6"><a href="#cb58-6" aria-hidden="true" tabindex="-1"></a><span class="vs">&#39;@</span></span>
<span id="cb58-7"><a href="#cb58-7" aria-hidden="true" tabindex="-1"></a><span class="fu">Add-Type</span> <span class="op">-</span>MemberDefinition <span class="va">$Signature</span> <span class="op">-</span>Name Keyboard <span class="op">-</span>Namespace PsOneApi</span>
<span id="cb58-8"><a href="#cb58-8" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">bool</span><span class="op">]([</span>PsOneApi<span class="op">.</span><span class="fu">Keyboard</span><span class="op">]::</span>GetAsyncKeyState<span class="op">(</span><span class="va">$key</span><span class="op">)</span> <span class="op">-eq</span> <span class="op">-</span><span class="dv">32767</span><span class="op">)</span></span>
<span id="cb58-9"><a href="#cb58-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb58-10"><a href="#cb58-10" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb58-11"><a href="#cb58-11" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Warning</span> <span class="st">&#39;Press F1 to exit&#39;</span></span>
<span id="cb58-12"><a href="#cb58-12" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span><span class="va">$true</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb58-13"><a href="#cb58-13" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Host</span> <span class="st">&#39;.&#39;</span> <span class="op">-</span>NoNewline</span>
<span id="cb58-14"><a href="#cb58-14" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span>Get-ControlKey<span class="op">)</span> <span class="op">{</span></span>
<span id="cb58-15"><a href="#cb58-15" aria-hidden="true" tabindex="-1"></a><span class="cf">break</span></span>
<span id="cb58-16"><a href="#cb58-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb58-17"><a href="#cb58-17" aria-hidden="true" tabindex="-1"></a><span class="fu">Start-Sleep</span> <span class="op">-</span>Seconds <span class="dv">0.5</span></span>
<span id="cb58-18"><a href="#cb58-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<h1 id="console-api">Console API</h1>
<p>Source:
https://powershell.one/tricks/input-devices/detect-key-press</p>
<p><code>[Console] | Get-Member -Static</code><br />
<code>[Console]::BackgroundColor = "Blue"</code><br />
<code>[Console]::OutputEncoding</code> используемая кодировка в текущей
сессии<br />
<code>[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")</code>
изменить кодировку для отображения кириллицы<br />
<code>[Console]::outputEncoding = [System.Text.Encoding]::GetEncoding("cp866")</code>
для ISE<br />
<code>[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("windows-1251")</code>
для ps2exe<br />
<code>Get-Service | Out-File $home\Desktop\Service.txt -Encoding oem</code>
&gt;<br />
<code>Get-Service | Out-File $home\Desktop\Service.txt -Append</code>
&gt;&gt;</p>
<div class="sourceCode" id="cb59"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb59-1"><a href="#cb59-1" aria-hidden="true" tabindex="-1"></a><span class="cf">do</span> <span class="op">{</span></span>
<span id="cb59-2"><a href="#cb59-2" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">([</span>Console<span class="op">]::</span>KeyAvailable<span class="op">)</span> <span class="op">{</span></span>
<span id="cb59-3"><a href="#cb59-3" aria-hidden="true" tabindex="-1"></a><span class="va">$keyInfo</span> <span class="op">=</span> <span class="op">[</span>Console<span class="op">]::</span>ReadKey<span class="op">(</span><span class="va">$true</span><span class="op">)</span></span>
<span id="cb59-4"><a href="#cb59-4" aria-hidden="true" tabindex="-1"></a><span class="cf">break</span></span>
<span id="cb59-5"><a href="#cb59-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb59-6"><a href="#cb59-6" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Host</span> <span class="st">&quot;.&quot;</span> <span class="op">-</span>NoNewline</span>
<span id="cb59-7"><a href="#cb59-7" aria-hidden="true" tabindex="-1"></a><span class="fu">sleep</span> <span class="dv">1</span></span>
<span id="cb59-8"><a href="#cb59-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">while</span> <span class="op">(</span><span class="va">$true</span><span class="op">)</span></span>
<span id="cb59-9"><a href="#cb59-9" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Host</span></span>
<span id="cb59-10"><a href="#cb59-10" aria-hidden="true" tabindex="-1"></a><span class="va">$keyInfo</span></span>
<span id="cb59-11"><a href="#cb59-11" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb59-12"><a href="#cb59-12" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-KeyPress <span class="op">{</span></span>
<span id="cb59-13"><a href="#cb59-13" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span> <span class="op">(</span></span>
<span id="cb59-14"><a href="#cb59-14" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Parameter<span class="op">(</span>Mandatory<span class="op">)][</span>ConsoleKey<span class="op">]</span><span class="va">$Key</span><span class="op">,</span></span>
<span id="cb59-15"><a href="#cb59-15" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>System<span class="op">.</span><span class="fu">ConsoleModifiers</span><span class="op">]</span><span class="va">$ModifierKey</span> <span class="op">=</span> <span class="dv">0</span></span>
<span id="cb59-16"><a href="#cb59-16" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
<span id="cb59-17"><a href="#cb59-17" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">([</span>Console<span class="op">]::</span>KeyAvailable<span class="op">)</span> <span class="op">{</span></span>
<span id="cb59-18"><a href="#cb59-18" aria-hidden="true" tabindex="-1"></a><span class="va">$pressedKey</span> <span class="op">=</span> <span class="op">[</span>Console<span class="op">]::</span>ReadKey<span class="op">(</span><span class="va">$true</span><span class="op">)</span></span>
<span id="cb59-19"><a href="#cb59-19" aria-hidden="true" tabindex="-1"></a><span class="va">$isPressedKey</span> <span class="op">=</span> <span class="va">$key</span> <span class="op">-eq</span> <span class="va">$pressedKey</span><span class="op">.</span><span class="fu">Key</span></span>
<span id="cb59-20"><a href="#cb59-20" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$isPressedKey</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb59-21"><a href="#cb59-21" aria-hidden="true" tabindex="-1"></a><span class="va">$pressedKey</span><span class="op">.</span><span class="fu">Modifiers</span> <span class="op">-eq</span> <span class="va">$ModifierKey</span></span>
<span id="cb59-22"><a href="#cb59-22" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">else</span> <span class="op">{</span></span>
<span id="cb59-23"><a href="#cb59-23" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Console<span class="op">]::</span>Beep<span class="op">(</span><span class="dv">1800</span><span class="op">,</span> <span class="dv">200</span><span class="op">)</span></span>
<span id="cb59-24"><a href="#cb59-24" aria-hidden="true" tabindex="-1"></a><span class="va">$false</span></span>
<span id="cb59-25"><a href="#cb59-25" aria-hidden="true" tabindex="-1"></a><span class="op">}}}</span></span>
<span id="cb59-26"><a href="#cb59-26" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb59-27"><a href="#cb59-27" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Warning</span> <span class="st">&#39;Press Ctrl+Shift+Q to exit&#39;</span></span>
<span id="cb59-28"><a href="#cb59-28" aria-hidden="true" tabindex="-1"></a><span class="cf">do</span> <span class="op">{</span></span>
<span id="cb59-29"><a href="#cb59-29" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Host</span> <span class="st">&quot;.&quot;</span> <span class="op">-</span>NoNewline</span>
<span id="cb59-30"><a href="#cb59-30" aria-hidden="true" tabindex="-1"></a><span class="va">$pressed</span> <span class="op">=</span> Get-KeyPress <span class="op">-</span>Key Q <span class="op">-</span>ModifierKey <span class="st">&#39;Control,Shift&#39;</span></span>
<span id="cb59-31"><a href="#cb59-31" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$pressed</span><span class="op">)</span> <span class="op">{</span><span class="cf">break</span><span class="op">}</span></span>
<span id="cb59-32"><a href="#cb59-32" aria-hidden="true" tabindex="-1"></a><span class="fu">sleep</span> <span class="dv">1</span></span>
<span id="cb59-33"><a href="#cb59-33" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">while</span> <span class="op">(</span><span class="va">$true</span><span class="op">)</span></span></code></pre></div>
<h1 id="drawing">Drawing</h1>
<p>API:
https://learn.microsoft.com/en-us/dotnet/api/system.drawing?view=net-7.0&amp;redirectedfrom=MSDN</p>
<div class="sourceCode" id="cb60"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb60-1"><a href="#cb60-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Add-Type</span> <span class="op">-</span>AssemblyName System<span class="op">.</span><span class="fu">Drawing</span></span>
<span id="cb60-2"><a href="#cb60-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Width</span> <span class="op">=</span> <span class="dv">800</span></span>
<span id="cb60-3"><a href="#cb60-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Height</span> <span class="op">=</span> <span class="dv">400</span></span>
<span id="cb60-4"><a href="#cb60-4" aria-hidden="true" tabindex="-1"></a><span class="va">$image</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Bitmap</span><span class="op">(</span><span class="va">$Width</span><span class="op">,</span><span class="va">$Height</span><span class="op">)</span></span>
<span id="cb60-5"><a href="#cb60-5" aria-hidden="true" tabindex="-1"></a><span class="va">$graphic</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Graphics</span><span class="op">]::</span>FromImage<span class="op">(</span><span class="va">$image</span><span class="op">)</span></span>
<span id="cb60-6"><a href="#cb60-6" aria-hidden="true" tabindex="-1"></a><span class="va">$background_color</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Brushes</span><span class="op">]::</span>Blue <span class="co"># задать цвет фона (синий)</span></span>
<span id="cb60-7"><a href="#cb60-7" aria-hidden="true" tabindex="-1"></a><span class="va">$graphic</span><span class="op">.</span><span class="fu">FillRectangle</span><span class="op">(</span><span class="va">$background_color</span><span class="op">,</span> <span class="dv">0</span><span class="op">,</span> <span class="dv">0</span><span class="op">,</span> <span class="va">$image</span><span class="op">.</span><span class="fu">Width</span><span class="op">,</span> <span class="va">$image</span><span class="op">.</span><span class="fu">Height</span><span class="op">)</span></span>
<span id="cb60-8"><a href="#cb60-8" aria-hidden="true" tabindex="-1"></a><span class="va">$text_color</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Brushes</span><span class="op">]::</span>White <span class="co"># задать цвет текста (белый)</span></span>
<span id="cb60-9"><a href="#cb60-9" aria-hidden="true" tabindex="-1"></a><span class="va">$font</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Font</span><span class="op">(</span><span class="st">&quot;Arial&quot;</span><span class="op">,</span> <span class="dv">20</span><span class="op">,</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">FontStyle</span><span class="op">]::</span>Bold<span class="op">)</span> <span class="co"># задать шрифт</span></span>
<span id="cb60-10"><a href="#cb60-10" aria-hidden="true" tabindex="-1"></a><span class="va">$text</span> <span class="op">=</span> <span class="st">&quot;PowerShell&quot;</span> <span class="co"># указать текст</span></span>
<span id="cb60-11"><a href="#cb60-11" aria-hidden="true" tabindex="-1"></a><span class="va">$text_position</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">RectangleF</span><span class="op">(</span><span class="dv">320</span><span class="op">,</span> <span class="dv">180</span><span class="op">,</span> <span class="dv">300</span><span class="op">,</span> <span class="dv">100</span><span class="op">)</span> <span class="co"># задать положение текста (x, y, width, height)</span></span>
<span id="cb60-12"><a href="#cb60-12" aria-hidden="true" tabindex="-1"></a><span class="va">$graphic</span><span class="op">.</span><span class="fu">DrawString</span><span class="op">(</span><span class="va">$text</span><span class="op">,</span> <span class="va">$font</span><span class="op">,</span> <span class="va">$text_color</span><span class="op">,</span> <span class="va">$text_position</span><span class="op">)</span> <span class="co"># нанести текст на изображение</span></span>
<span id="cb60-13"><a href="#cb60-13" aria-hidden="true" tabindex="-1"></a><span class="va">$image</span><span class="op">.</span><span class="fu">Save</span><span class="op">(</span><span class="st">&quot;</span><span class="va">$home</span><span class="st">\desktop\powershell_image.bmp&quot;</span><span class="op">,</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Imaging</span><span class="op">.</span><span class="fu">ImageFormat</span><span class="op">]::</span>Bmp<span class="op">)</span> <span class="co"># сохранить изображение</span></span>
<span id="cb60-14"><a href="#cb60-14" aria-hidden="true" tabindex="-1"></a><span class="va">$image</span><span class="op">.</span><span class="fu">Dispose</span><span class="op">()</span> <span class="co"># освобождение ресурсов</span></span></code></pre></div>
<p><code>$path = "$home\desktop\powershell_image.bmp"</code><br />
<code>Invoke-Item $path</code></p>
<div class="sourceCode" id="cb61"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb61-1"><a href="#cb61-1" aria-hidden="true" tabindex="-1"></a><span class="va">$src_image</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Image</span><span class="op">]::</span>FromFile<span class="op">(</span><span class="va">$path</span><span class="op">)</span></span>
<span id="cb61-2"><a href="#cb61-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Width</span> <span class="op">=</span> <span class="dv">400</span></span>
<span id="cb61-3"><a href="#cb61-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Height</span> <span class="op">=</span> <span class="dv">200</span></span>
<span id="cb61-4"><a href="#cb61-4" aria-hidden="true" tabindex="-1"></a><span class="va">$dst_image</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Bitmap</span> <span class="op">-</span>ArgumentList <span class="va">$src_image</span><span class="op">,</span> <span class="va">$Width</span><span class="op">,</span> <span class="va">$Height</span> <span class="co"># изменить размер изображения</span></span>
<span id="cb61-5"><a href="#cb61-5" aria-hidden="true" tabindex="-1"></a><span class="va">$dst_image</span><span class="op">.</span><span class="fu">Save</span><span class="op">(</span><span class="st">&quot;</span><span class="va">$home</span><span class="st">\desktop\powershell_image_resize.bmp&quot;</span><span class="op">,</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Imaging</span><span class="op">.</span><span class="fu">ImageFormat</span><span class="op">]::</span>Bmp<span class="op">)</span></span>
<span id="cb61-6"><a href="#cb61-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb61-7"><a href="#cb61-7" aria-hidden="true" tabindex="-1"></a><span class="va">$rotated_image</span> <span class="op">=</span> <span class="va">$src_image</span><span class="op">.</span><span class="fu">Clone</span><span class="op">()</span> <span class="co"># создать копию исходного изображения</span></span>
<span id="cb61-8"><a href="#cb61-8" aria-hidden="true" tabindex="-1"></a><span class="va">$rotated_image</span><span class="op">.</span><span class="fu">RotateFlip</span><span class="op">([</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">RotateFlipType</span><span class="op">]::</span>Rotate180FlipNone<span class="op">)</span> <span class="co"># перевернуть изображение на 180 градусов</span></span>
<span id="cb61-9"><a href="#cb61-9" aria-hidden="true" tabindex="-1"></a><span class="va">$rotated_image</span><span class="op">.</span><span class="fu">Save</span><span class="op">(</span><span class="st">&quot;</span><span class="va">$home</span><span class="st">\desktop\powershell_image_rotated.bmp&quot;</span><span class="op">,</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Drawing</span><span class="op">.</span><span class="fu">Imaging</span><span class="op">.</span><span class="fu">ImageFormat</span><span class="op">]::</span>Bmp<span class="op">)</span></span>
<span id="cb61-10"><a href="#cb61-10" aria-hidden="true" tabindex="-1"></a><span class="va">$src_image</span><span class="op">.</span><span class="fu">Dispose</span><span class="op">()</span> <span class="co"># закрыть (отпустить) исходный файл</span></span></code></pre></div>
<h1 id="objectevent">ObjectEvent</h1>
<div class="sourceCode" id="cb62"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb62-1"><a href="#cb62-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Timer</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Timers</span><span class="op">.</span><span class="fu">Timer</span></span>
<span id="cb62-2"><a href="#cb62-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Timer</span><span class="op">.</span><span class="fu">Interval</span> <span class="op">=</span> <span class="dv">1000</span></span>
<span id="cb62-3"><a href="#cb62-3" aria-hidden="true" tabindex="-1"></a><span class="dt">Register</span><span class="op">-</span>ObjectEvent <span class="op">-</span>InputObject <span class="va">$Timer</span> <span class="op">-</span>EventName Elapsed <span class="op">-</span>SourceIdentifier Timer<span class="op">.</span><span class="fu">Output</span> <span class="op">-</span>Action <span class="op">{</span></span>
<span id="cb62-4"><a href="#cb62-4" aria-hidden="true" tabindex="-1"></a><span class="va">$Random</span> <span class="op">=</span> <span class="fu">Get-Random</span> <span class="op">-</span>Min <span class="dv">0</span> <span class="op">-</span>Max <span class="dv">100</span></span>
<span id="cb62-5"><a href="#cb62-5" aria-hidden="true" tabindex="-1"></a><span class="dt">Write</span><span class="op">-</span>Host <span class="va">$Random</span> </span>
<span id="cb62-6"><a href="#cb62-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb62-7"><a href="#cb62-7" aria-hidden="true" tabindex="-1"></a><span class="va">$Timer</span><span class="op">.</span><span class="fu">Enabled</span> <span class="op">=</span> <span class="va">$True</span></span></code></pre></div>
<p><code>$Timer.Enabled = $False</code> остановить<br />
<code>$Timer | Get-Member -MemberType Event</code> отобразить список
всех событий объекта<br />
<code>Get-EventSubscriber</code> список зарегистрированных подписок на
события в текущей сессии<br />
<code>Unregister-Event -SourceIdentifier Timer.Output</code> удаляет
регистрацию подписки на событие по имени события (EventName) или все
*<br />
<code>-Forward</code> перенаправляет события из удаленного сеанса
(New-PSSession) в локальный сеанс<br />
<code>-SupportEvent</code> не выводит результат регистрации события на
экран (и Get-EventSubscriber и Get-Job)</p>
<pre><code>Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Action {
$date = Get-Date -f hh:mm:ss
(New-Object -ComObject Wscript.Shell).Popup(&quot;PowerShell Exit: $date&quot;,0,&quot;Action&quot;,64)
}</code></pre>
<h1 id="sockets">Sockets</h1>
<h3 id="udp-socket">UDP Socket</h3>
<p>Source:
https://cloudbrothers.info/en/test-udp-connection-powershell/</p>
<div class="sourceCode" id="cb64"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb64-1"><a href="#cb64-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Start-UDPServer <span class="op">{</span></span>
<span id="cb64-2"><a href="#cb64-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span><span class="op">(</span></span>
<span id="cb64-3"><a href="#cb64-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Port</span> <span class="op">=</span> <span class="dv">5201</span></span>
<span id="cb64-4"><a href="#cb64-4" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
<span id="cb64-5"><a href="#cb64-5" aria-hidden="true" tabindex="-1"></a><span class="va">$RemoteComputer</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">IPEndPoint</span><span class="op">([</span>System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">IPAddress</span><span class="op">]::</span>Any<span class="op">,</span> <span class="dv">0</span><span class="op">)</span></span>
<span id="cb64-6"><a href="#cb64-6" aria-hidden="true" tabindex="-1"></a><span class="cf">do</span> <span class="op">{</span></span>
<span id="cb64-7"><a href="#cb64-7" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpObject</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">Sockets</span><span class="op">.</span><span class="fu">UdpClient</span><span class="op">(</span><span class="va">$Port</span><span class="op">)</span></span>
<span id="cb64-8"><a href="#cb64-8" aria-hidden="true" tabindex="-1"></a><span class="va">$ReceiveBytes</span> <span class="op">=</span> <span class="va">$UdpObject</span><span class="op">.</span><span class="fu">Receive</span><span class="op">([</span>ref<span class="op">]</span><span class="va">$RemoteComputer</span><span class="op">)</span></span>
<span id="cb64-9"><a href="#cb64-9" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpObject</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
<span id="cb64-10"><a href="#cb64-10" aria-hidden="true" tabindex="-1"></a><span class="va">$ASCIIEncoding</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">ASCIIEncoding</span></span>
<span id="cb64-11"><a href="#cb64-11" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$ReturnString</span> <span class="op">=</span> <span class="va">$ASCIIEncoding</span><span class="op">.</span><span class="fu">GetString</span><span class="op">(</span><span class="va">$ReceiveBytes</span><span class="op">)</span></span>
<span id="cb64-12"><a href="#cb64-12" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
<span id="cb64-13"><a href="#cb64-13" aria-hidden="true" tabindex="-1"></a>LocalDateTime <span class="op">=</span> <span class="op">$(</span><span class="fu">Get-Date</span> <span class="op">-</span>UFormat <span class="st">&quot;%Y-%m-%d %T&quot;</span><span class="op">)</span></span>
<span id="cb64-14"><a href="#cb64-14" aria-hidden="true" tabindex="-1"></a>ClientIP <span class="op">=</span> <span class="va">$RemoteComputer</span><span class="op">.</span><span class="fu">address</span><span class="op">.</span><span class="fu">ToString</span><span class="op">()</span></span>
<span id="cb64-15"><a href="#cb64-15" aria-hidden="true" tabindex="-1"></a>ClientPort <span class="op">=</span> <span class="va">$RemoteComputer</span><span class="op">.</span><span class="fu">Port</span><span class="op">.</span><span class="fu">ToString</span><span class="op">()</span></span>
<span id="cb64-16"><a href="#cb64-16" aria-hidden="true" tabindex="-1"></a>Message <span class="op">=</span> <span class="va">$ReturnString</span></span>
<span id="cb64-17"><a href="#cb64-17" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb64-18"><a href="#cb64-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">while</span> <span class="op">(</span><span class="dv">1</span><span class="op">)</span></span>
<span id="cb64-19"><a href="#cb64-19" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Start-UDPServer -Port 5201</code></p>
<h3 id="test-netudpconnection">Test-NetUDPConnection</h3>
<div class="sourceCode" id="cb65"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb65-1"><a href="#cb65-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Test-NetUDPConnection <span class="op">{</span></span>
<span id="cb65-2"><a href="#cb65-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span><span class="op">(</span></span>
<span id="cb65-3"><a href="#cb65-3" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$ComputerName</span> <span class="op">=</span> <span class="st">&quot;127.0.0.1&quot;</span><span class="op">,</span></span>
<span id="cb65-4"><a href="#cb65-4" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>int32<span class="op">]</span><span class="va">$PortServer</span> <span class="op">=</span> <span class="dv">5201</span><span class="op">,</span></span>
<span id="cb65-5"><a href="#cb65-5" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>int32<span class="op">]</span><span class="va">$PortClient</span> <span class="op">=</span> <span class="dv">5211</span><span class="op">,</span></span>
<span id="cb65-6"><a href="#cb65-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Message</span></span>
<span id="cb65-7"><a href="#cb65-7" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
<span id="cb65-8"><a href="#cb65-8" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span> <span class="op">{</span></span>
<span id="cb65-9"><a href="#cb65-9" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpObject</span> <span class="op">=</span> <span class="fu">New-Object</span> system<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">Sockets</span><span class="op">.</span><span class="fu">Udpclient</span><span class="op">(</span><span class="va">$PortClient</span><span class="op">)</span></span>
<span id="cb65-10"><a href="#cb65-10" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpObject</span><span class="op">.</span><span class="fu">Connect</span><span class="op">(</span><span class="va">$ComputerName</span><span class="op">,</span> <span class="va">$PortServer</span><span class="op">)</span></span>
<span id="cb65-11"><a href="#cb65-11" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb65-12"><a href="#cb65-12" aria-hidden="true" tabindex="-1"></a><span class="cf">process</span> <span class="op">{</span></span>
<span id="cb65-13"><a href="#cb65-13" aria-hidden="true" tabindex="-1"></a><span class="va">$ASCIIEncoding</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">ASCIIEncoding</span></span>
<span id="cb65-14"><a href="#cb65-14" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(!</span><span class="va">$Message</span><span class="op">)</span> <span class="op">{</span><span class="va">$Message</span> <span class="op">=</span> <span class="fu">Get-Date</span> <span class="op">-</span>UFormat <span class="st">&quot;%Y-%m-%d %T&quot;</span><span class="op">}</span></span>
<span id="cb65-15"><a href="#cb65-15" aria-hidden="true" tabindex="-1"></a><span class="va">$Bytes</span> <span class="op">=</span> <span class="va">$ASCIIEncoding</span><span class="op">.</span><span class="fu">GetBytes</span><span class="op">(</span><span class="va">$Message</span><span class="op">)</span></span>
<span id="cb65-16"><a href="#cb65-16" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>void<span class="op">]</span><span class="va">$UdpObject</span><span class="op">.</span><span class="fu">Send</span><span class="op">(</span><span class="va">$Bytes</span><span class="op">,</span> <span class="va">$Bytes</span><span class="op">.</span><span class="fu">length</span><span class="op">)</span></span>
<span id="cb65-17"><a href="#cb65-17" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb65-18"><a href="#cb65-18" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span> <span class="op">{</span></span>
<span id="cb65-19"><a href="#cb65-19" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpObject</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
<span id="cb65-20"><a href="#cb65-20" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb65-21"><a href="#cb65-21" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Test-NetUDPConnection -ComputerName 127.0.0.1 -PortServer 5201</code><br />
<code>Test-NetUDPConnection -ComputerName 127.0.0.1 -PortServer 514 -Message "&lt;30&gt;May 31 00:00:00 HostName multipathd[784]: Test message"</code></p>
<h3 id="tcp-socket">TCP Socket</h3>
<div class="sourceCode" id="cb66"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb66-1"><a href="#cb66-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Start-TCPServer <span class="op">{</span></span>
<span id="cb66-2"><a href="#cb66-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span><span class="op">(</span></span>
<span id="cb66-3"><a href="#cb66-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Port</span> <span class="op">=</span> <span class="dv">5201</span></span>
<span id="cb66-4"><a href="#cb66-4" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
<span id="cb66-5"><a href="#cb66-5" aria-hidden="true" tabindex="-1"></a><span class="cf">do</span> <span class="op">{</span></span>
<span id="cb66-6"><a href="#cb66-6" aria-hidden="true" tabindex="-1"></a><span class="va">$TcpObject</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">Sockets</span><span class="op">.</span><span class="fu">TcpListener</span><span class="op">(</span><span class="va">$port</span><span class="op">)</span></span>
<span id="cb66-7"><a href="#cb66-7" aria-hidden="true" tabindex="-1"></a><span class="va">$ReceiveBytes</span> <span class="op">=</span> <span class="va">$TcpObject</span><span class="op">.</span><span class="fu">Start</span><span class="op">()</span></span>
<span id="cb66-8"><a href="#cb66-8" aria-hidden="true" tabindex="-1"></a><span class="va">$ReceiveBytes</span> <span class="op">=</span> <span class="va">$TcpObject</span><span class="op">.</span><span class="fu">AcceptTcpClient</span><span class="op">()</span></span>
<span id="cb66-9"><a href="#cb66-9" aria-hidden="true" tabindex="-1"></a><span class="va">$TcpObject</span><span class="op">.</span><span class="fu">Stop</span><span class="op">()</span></span>
<span id="cb66-10"><a href="#cb66-10" aria-hidden="true" tabindex="-1"></a><span class="va">$ReceiveBytes</span><span class="op">.</span><span class="fu">Client</span><span class="op">.</span><span class="fu">RemoteEndPoint</span> <span class="op">|</span> <span class="fu">select</span> Address<span class="op">,</span>Port</span>
<span id="cb66-11"><a href="#cb66-11" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">while</span> <span class="op">(</span><span class="dv">1</span><span class="op">)</span></span>
<span id="cb66-12"><a href="#cb66-12" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Start-TCPServer -Port 5201</code><br />
<code>Test-NetConnection -ComputerName 127.0.0.1 -Port 5201</code></p>
<h3 id="wakeonlan">WakeOnLan</h3>
<p>Broadcast package consisting of 6 byte filled “0xFF” and then 96 byte
where the mac address is repeated 16 times</p>
<div class="sourceCode" id="cb67"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb67-1"><a href="#cb67-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Send-WOL <span class="op">{</span></span>
<span id="cb67-2"><a href="#cb67-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span> <span class="op">(</span></span>
<span id="cb67-3"><a href="#cb67-3" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Parameter<span class="op">(</span>Mandatory <span class="op">=</span> <span class="va">$True</span><span class="op">)]</span><span class="va">$Mac</span><span class="op">,</span></span>
<span id="cb67-4"><a href="#cb67-4" aria-hidden="true" tabindex="-1"></a><span class="va">$IP</span><span class="op">,</span></span>
<span id="cb67-5"><a href="#cb67-5" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">int</span><span class="op">]</span><span class="va">$Port</span> <span class="op">=</span> <span class="dv">9</span></span>
<span id="cb67-6"><a href="#cb67-6" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
<span id="cb67-7"><a href="#cb67-7" aria-hidden="true" tabindex="-1"></a><span class="va">$Mac</span> <span class="op">=</span> <span class="va">$Mac</span><span class="op">.</span><span class="fu">replace</span><span class="op">(</span><span class="st">&quot;:&quot;</span><span class="op">,</span> <span class="st">&quot;-&quot;</span><span class="op">)</span></span>
<span id="cb67-8"><a href="#cb67-8" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(!</span><span class="va">$IP</span><span class="op">)</span> <span class="op">{</span><span class="va">$IP</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">IPAddress</span><span class="op">]::</span>Broadcast<span class="op">}</span></span>
<span id="cb67-9"><a href="#cb67-9" aria-hidden="true" tabindex="-1"></a><span class="va">$SynchronizationChain</span> <span class="op">=</span> <span class="op">[</span><span class="dt">byte</span><span class="op">[]](,</span><span class="dv">0xFF</span> <span class="op">*</span> <span class="dv">6</span><span class="op">)</span></span>
<span id="cb67-10"><a href="#cb67-10" aria-hidden="true" tabindex="-1"></a><span class="va">$ByteMac</span> <span class="op">=</span> <span class="va">$Mac</span><span class="op">.</span><span class="fu">Split</span><span class="op">(</span><span class="st">&quot;-&quot;</span><span class="op">)</span> <span class="op">|</span> <span class="op">%{[</span><span class="dt">byte</span><span class="op">](</span><span class="st">&quot;0x&quot;</span> <span class="op">+</span> <span class="va">$_</span><span class="op">)}</span></span>
<span id="cb67-11"><a href="#cb67-11" aria-hidden="true" tabindex="-1"></a><span class="va">$Package</span> <span class="op">=</span> <span class="va">$SynchronizationChain</span> <span class="op">+</span> <span class="op">(</span><span class="va">$ByteMac</span> <span class="op">*</span> <span class="dv">16</span><span class="op">)</span></span>
<span id="cb67-12"><a href="#cb67-12" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpClient</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">Sockets</span><span class="op">.</span><span class="fu">UdpClient</span></span>
<span id="cb67-13"><a href="#cb67-13" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpClient</span><span class="op">.</span><span class="fu">Connect</span><span class="op">(</span><span class="va">$IP</span><span class="op">,</span> <span class="va">$port</span><span class="op">)</span></span>
<span id="cb67-14"><a href="#cb67-14" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpClient</span><span class="op">.</span><span class="fu">Send</span><span class="op">(</span><span class="va">$Package</span><span class="op">,</span> <span class="va">$Package</span><span class="op">.</span><span class="fu">Length</span><span class="op">)</span></span>
<span id="cb67-15"><a href="#cb67-15" aria-hidden="true" tabindex="-1"></a><span class="va">$UdpClient</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
<span id="cb67-16"><a href="#cb67-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Send-WOL -Mac "D8-BB-C1-70-A3-4E"</code><br />
<code>Send-WOL -Mac "D8-BB-C1-70-A3-4E" -IP 192.168.3.100</code></p>
<h3 id="encoding">Encoding</h3>
<p><code>$ByteText = [System.Text.Encoding]::UTF8.GetBytes("password")</code><br />
<code>$Text = [System.Text.Encoding]::UTF8.GetString($ByteText)</code></p>
<h3 id="base64">Base64</h3>
<p><code>$text = "password"</code><br />
<code>$byte = [System.Text.Encoding]::Unicode.GetBytes($text)</code><br />
<code>$base64 = [System.Convert]::ToBase64String($byte)</code><br />
<code>$decode_base64 = [System.Convert]::FromBase64String($base64)</code><br />
<code>$decode_string = [System.Text.Encoding]::Unicode.GetString($decode_base64)</code></p>
<p><code>$path_image = "$home\Documents\1200x800.jpg"</code><br />
<code>$BBase64 = [System.Convert]::ToBase64String((Get-Content $path_image -Encoding Byte))</code><br />
<code>Add-Type -assembly System.Drawing</code><br />
<code>$Image = [System.Drawing.Bitmap]::FromStream([IO.MemoryStream][Convert]::FromBase64String($BBase64))</code><br />
<code>$Image.Save("$home\Desktop\1200x800.jpg")</code></p>
<h3 id="http-listener">HTTP Listener</h3>
<div class="sourceCode" id="cb68"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb68-1"><a href="#cb68-1" aria-hidden="true" tabindex="-1"></a><span class="va">$httpListener</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">HttpListener</span></span>
<span id="cb68-2"><a href="#cb68-2" aria-hidden="true" tabindex="-1"></a><span class="va">$httpListener</span><span class="op">.</span><span class="fu">Prefixes</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="st">&quot;http://+:8888/&quot;</span><span class="op">)</span></span>
<span id="cb68-3"><a href="#cb68-3" aria-hidden="true" tabindex="-1"></a><span class="va">$httpListener</span><span class="op">.</span><span class="fu">Start</span><span class="op">()</span></span>
<span id="cb68-4"><a href="#cb68-4" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(!([</span>console<span class="op">]::</span>KeyAvailable<span class="op">))</span> <span class="op">{</span></span>
<span id="cb68-5"><a href="#cb68-5" aria-hidden="true" tabindex="-1"></a><span class="va">$info</span> <span class="op">=</span> <span class="fu">Get-Service</span> <span class="op">|</span> <span class="fu">select</span> name<span class="op">,</span>status <span class="op">|</span> <span class="fu">ConvertTo-HTML</span></span>
<span id="cb68-6"><a href="#cb68-6" aria-hidden="true" tabindex="-1"></a><span class="va">$context</span> <span class="op">=</span> <span class="va">$httpListener</span><span class="op">.</span><span class="fu">GetContext</span><span class="op">()</span></span>
<span id="cb68-7"><a href="#cb68-7" aria-hidden="true" tabindex="-1"></a><span class="va">$context</span><span class="op">.</span><span class="fu">Response</span><span class="op">.</span><span class="fu">StatusCode</span> <span class="op">=</span> <span class="dv">200</span></span>
<span id="cb68-8"><a href="#cb68-8" aria-hidden="true" tabindex="-1"></a><span class="va">$context</span><span class="op">.</span><span class="fu">Response</span><span class="op">.</span><span class="fu">ContentType</span> <span class="op">=</span> <span class="st">&#39;text/HTML&#39;</span></span>
<span id="cb68-9"><a href="#cb68-9" aria-hidden="true" tabindex="-1"></a><span class="va">$WebContent</span> <span class="op">=</span> <span class="va">$info</span></span>
<span id="cb68-10"><a href="#cb68-10" aria-hidden="true" tabindex="-1"></a><span class="va">$EncodingWebContent</span> <span class="op">=</span> <span class="op">[</span>Text<span class="op">.</span><span class="fu">Encoding</span><span class="op">]::</span>UTF8<span class="op">.</span><span class="fu">GetBytes</span><span class="op">(</span><span class="va">$WebContent</span><span class="op">)</span></span>
<span id="cb68-11"><a href="#cb68-11" aria-hidden="true" tabindex="-1"></a><span class="va">$context</span><span class="op">.</span><span class="fu">Response</span><span class="op">.</span><span class="fu">OutputStream</span><span class="op">.</span><span class="fu">Write</span><span class="op">(</span><span class="va">$EncodingWebContent</span> <span class="op">,</span> <span class="dv">0</span><span class="op">,</span> <span class="va">$EncodingWebContent</span><span class="op">.</span><span class="fu">Length</span><span class="op">)</span></span>
<span id="cb68-12"><a href="#cb68-12" aria-hidden="true" tabindex="-1"></a><span class="va">$context</span><span class="op">.</span><span class="fu">Response</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
<span id="cb68-13"><a href="#cb68-13" aria-hidden="true" tabindex="-1"></a>Get-NetTcpConnection <span class="op">-</span>LocalPort <span class="dv">8888</span></span>
<span id="cb68-14"><a href="#cb68-14" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="fu">Get-Date</span><span class="op">).</span><span class="fu">datetime</span></span>
<span id="cb68-15"><a href="#cb68-15" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb68-16"><a href="#cb68-16" aria-hidden="true" tabindex="-1"></a><span class="va">$httpListener</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span></code></pre></div>
<h3 id="webclient">WebClient</h3>
<p><code>[System.Net.WebClient] | Get-Member</code><br />
<code>(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/Lifailon/PowerShell-Commands/rsa/README.md")</code></p>
<h3 id="certificate">Certificate</h3>
<div class="sourceCode" id="cb69"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb69-1"><a href="#cb69-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-WebCertificate <span class="op">(</span><span class="va">$srv</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb69-2"><a href="#cb69-2" aria-hidden="true" tabindex="-1"></a><span class="va">$iwr</span> <span class="op">=</span> <span class="fu">iwr</span> <span class="va">$srv</span></span>
<span id="cb69-3"><a href="#cb69-3" aria-hidden="true" tabindex="-1"></a><span class="va">$status_code</span> <span class="op">=</span> <span class="va">$iwr</span><span class="op">.</span><span class="fu">StatusCode</span></span>
<span id="cb69-4"><a href="#cb69-4" aria-hidden="true" tabindex="-1"></a><span class="va">$status</span> <span class="op">=</span> <span class="va">$iwr</span><span class="op">.</span><span class="fu">BaseResponse</span><span class="op">.</span><span class="fu">StatusCode</span></span>
<span id="cb69-5"><a href="#cb69-5" aria-hidden="true" tabindex="-1"></a><span class="va">$info</span> <span class="op">=</span> <span class="va">$iwr</span><span class="op">.</span><span class="fu">BaseResponse</span><span class="op">.</span><span class="fu">Server</span></span>
<span id="cb69-6"><a href="#cb69-6" aria-hidden="true" tabindex="-1"></a><span class="va">$spm</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">ServicePointManager</span><span class="op">]::</span>FindServicePoint<span class="op">(</span><span class="va">$srv</span><span class="op">)</span></span>
<span id="cb69-7"><a href="#cb69-7" aria-hidden="true" tabindex="-1"></a><span class="va">$date_end</span> <span class="op">=</span> <span class="va">$spm</span><span class="op">.</span><span class="fu">Certificate</span><span class="op">.</span><span class="fu">GetExpirationDateString</span><span class="op">()</span></span>
<span id="cb69-8"><a href="#cb69-8" aria-hidden="true" tabindex="-1"></a><span class="va">$cert_name</span> <span class="op">=</span> <span class="op">(</span><span class="va">$spm</span><span class="op">.</span><span class="fu">Certificate</span><span class="op">.</span><span class="fu">Subject</span><span class="op">)</span> <span class="op">-replace</span> <span class="st">&quot;CN=&quot;</span></span>
<span id="cb69-9"><a href="#cb69-9" aria-hidden="true" tabindex="-1"></a><span class="va">$cert_owner</span> <span class="op">=</span> <span class="op">(((</span><span class="va">$spm</span><span class="op">.</span><span class="fu">Certificate</span><span class="op">.</span><span class="fu">Issuer</span><span class="op">)</span> <span class="op">-split</span> <span class="st">&quot;, &quot;</span><span class="op">)</span> <span class="op">|</span> <span class="fu">where</span> <span class="op">{</span><span class="va">$_</span> <span class="op">-match</span> <span class="st">&quot;O=&quot;</span><span class="op">})</span> <span class="op">-replace</span> <span class="st">&quot;O=&quot;</span></span>
<span id="cb69-10"><a href="#cb69-10" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Collections</span><span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>System<span class="op">.</span><span class="fu">Object</span><span class="op">]</span></span>
<span id="cb69-11"><a href="#cb69-11" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span><span class="op">.</span><span class="fu">Add</span><span class="op">([</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
<span id="cb69-12"><a href="#cb69-12" aria-hidden="true" tabindex="-1"></a>Host <span class="op">=</span> <span class="va">$srv</span><span class="op">;</span></span>
<span id="cb69-13"><a href="#cb69-13" aria-hidden="true" tabindex="-1"></a>Server <span class="op">=</span> <span class="va">$info</span><span class="op">;</span></span>
<span id="cb69-14"><a href="#cb69-14" aria-hidden="true" tabindex="-1"></a>Status <span class="op">=</span> <span class="va">$status</span><span class="op">;</span></span>
<span id="cb69-15"><a href="#cb69-15" aria-hidden="true" tabindex="-1"></a>StatusCode <span class="op">=</span> <span class="va">$status_code</span><span class="op">;</span></span>
<span id="cb69-16"><a href="#cb69-16" aria-hidden="true" tabindex="-1"></a>Certificate <span class="op">=</span> <span class="va">$cert_name</span><span class="op">;</span></span>
<span id="cb69-17"><a href="#cb69-17" aria-hidden="true" tabindex="-1"></a>Issued <span class="op">=</span> <span class="va">$cert_owner</span><span class="op">;</span></span>
<span id="cb69-18"><a href="#cb69-18" aria-hidden="true" tabindex="-1"></a><span class="kw">End</span> <span class="op">=</span> <span class="va">$date_end</span></span>
<span id="cb69-19"><a href="#cb69-19" aria-hidden="true" tabindex="-1"></a><span class="op">})</span></span>
<span id="cb69-20"><a href="#cb69-20" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span></span>
<span id="cb69-21"><a href="#cb69-21" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Get-WebCertificate https://google.com</code></p>
<h1 id="excel">Excel</h1>
<div class="sourceCode" id="cb70"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb70-1"><a href="#cb70-1" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Desktop\Services-to-Excel.xlsx&quot;</span></span>
<span id="cb70-2"><a href="#cb70-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Excel</span> <span class="op">=</span> <span class="fu">New-Object</span> <span class="op">-</span>ComObject Excel<span class="op">.</span><span class="fu">Application</span></span>
<span id="cb70-3"><a href="#cb70-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Excel</span><span class="op">.</span><span class="fu">Visible</span> <span class="op">=</span> <span class="va">$false</span><span class="ch">` </span>отключить открытие GUI</span>
<span id="cb70-4"><a href="#cb70-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkBook</span> <span class="op">=</span> <span class="va">$Excel</span><span class="op">.</span><span class="fu">Workbooks</span><span class="op">.</span><span class="fu">Add</span><span class="op">()</span><span class="ch">` </span>Создать книгу</span>
<span id="cb70-5"><a href="#cb70-5" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span> <span class="op">=</span> <span class="va">$ExcelWorkBook</span><span class="op">.</span><span class="fu">Worksheets</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">)</span><span class="ch">` </span>Создать лист</span>
<span id="cb70-6"><a href="#cb70-6" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Name</span> <span class="op">=</span> <span class="st">&quot;Services&quot;</span><span class="ch">` </span>задать имя листа</span>
<span id="cb70-7"><a href="#cb70-7" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Cells</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">,</span><span class="dv">1</span><span class="op">)</span> <span class="op">=</span> <span class="st">&quot;Name service&quot;</span></span>
<span id="cb70-8"><a href="#cb70-8" aria-hidden="true" tabindex="-1"></a><span class="co"># Задать имена столбцов:</span></span>
<span id="cb70-9"><a href="#cb70-9" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Cells</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">,</span><span class="dv">2</span><span class="op">)</span> <span class="op">=</span> <span class="st">&quot;Description&quot;</span></span>
<span id="cb70-10"><a href="#cb70-10" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Cells</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">,</span><span class="dv">3</span><span class="op">)</span> <span class="op">=</span> <span class="st">&quot;Status&quot;</span></span>
<span id="cb70-11"><a href="#cb70-11" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Cells</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">,</span><span class="dv">4</span><span class="op">)</span> <span class="op">=</span> <span class="st">&quot;Startup type&quot;</span></span>
<span id="cb70-12"><a href="#cb70-12" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Rows</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">).</span><span class="fu">Font</span><span class="op">.</span><span class="fu">Bold</span> <span class="op">=</span> <span class="va">$true</span><span class="ch">` </span>выделить жирным шрифтом</span>
<span id="cb70-13"><a href="#cb70-13" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Rows</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">).</span><span class="fu">Font</span><span class="op">.</span><span class="fu">size</span><span class="op">=</span><span class="dv">14</span></span>
<span id="cb70-14"><a href="#cb70-14" aria-hidden="true" tabindex="-1"></a><span class="co"># Задать ширину колонок:</span></span>
<span id="cb70-15"><a href="#cb70-15" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">).</span><span class="fu">ColumnWidth</span><span class="op">=</span><span class="dv">30</span></span>
<span id="cb70-16"><a href="#cb70-16" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">2</span><span class="op">).</span><span class="fu">ColumnWidth</span><span class="op">=</span><span class="dv">80</span></span>
<span id="cb70-17"><a href="#cb70-17" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">3</span><span class="op">).</span><span class="fu">ColumnWidth</span><span class="op">=</span><span class="dv">15</span></span>
<span id="cb70-18"><a href="#cb70-18" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">4</span><span class="op">).</span><span class="fu">ColumnWidth</span><span class="op">=</span><span class="dv">25</span></span>
<span id="cb70-19"><a href="#cb70-19" aria-hidden="true" tabindex="-1"></a><span class="va">$services</span> <span class="op">=</span> <span class="fu">Get-Service</span></span>
<span id="cb70-20"><a href="#cb70-20" aria-hidden="true" tabindex="-1"></a><span class="va">$counter</span> <span class="op">=</span> <span class="dv">2</span><span class="ch">` </span>задать начальный номер строки для записи</span>
<span id="cb70-21"><a href="#cb70-21" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$service</span> <span class="kw">in</span> <span class="va">$services</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb70-22"><a href="#cb70-22" aria-hidden="true" tabindex="-1"></a><span class="va">$status</span> <span class="op">=</span> <span class="va">$service</span><span class="op">.</span><span class="fu">Status</span></span>
<span id="cb70-23"><a href="#cb70-23" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$status</span> <span class="op">-eq</span> <span class="dv">1</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb70-24"><a href="#cb70-24" aria-hidden="true" tabindex="-1"></a><span class="va">$status_type</span> <span class="op">=</span> <span class="st">&quot;Stopped&quot;</span></span>
<span id="cb70-25"><a href="#cb70-25" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">elseif</span> <span class="op">(</span><span class="va">$status</span> <span class="op">-eq</span> <span class="dv">4</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb70-26"><a href="#cb70-26" aria-hidden="true" tabindex="-1"></a><span class="va">$status_type</span> <span class="op">=</span> <span class="st">&quot;Running&quot;</span></span>
<span id="cb70-27"><a href="#cb70-27" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb70-28"><a href="#cb70-28" aria-hidden="true" tabindex="-1"></a><span class="va">$Start</span> <span class="op">=</span> <span class="va">$service</span><span class="op">.</span><span class="fu">StartType</span></span>
<span id="cb70-29"><a href="#cb70-29" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$Start</span> <span class="op">-eq</span> <span class="dv">1</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb70-30"><a href="#cb70-30" aria-hidden="true" tabindex="-1"></a><span class="va">$start_type</span> <span class="op">=</span> <span class="st">&quot;Delayed start&quot;</span></span>
<span id="cb70-31"><a href="#cb70-31" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">elseif</span> <span class="op">(</span><span class="va">$Start</span> <span class="op">-eq</span> <span class="dv">2</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb70-32"><a href="#cb70-32" aria-hidden="true" tabindex="-1"></a><span class="va">$start_type</span> <span class="op">=</span> <span class="st">&quot;Automatic&quot;</span></span>
<span id="cb70-33"><a href="#cb70-33" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">elseif</span> <span class="op">(</span><span class="va">$Start</span> <span class="op">-eq</span> <span class="dv">3</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb70-34"><a href="#cb70-34" aria-hidden="true" tabindex="-1"></a><span class="va">$start_type</span> <span class="op">=</span> <span class="st">&quot;Manually&quot;</span></span>
<span id="cb70-35"><a href="#cb70-35" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">elseif</span> <span class="op">(</span><span class="va">$Start</span> <span class="op">-eq</span> <span class="dv">4</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb70-36"><a href="#cb70-36" aria-hidden="true" tabindex="-1"></a><span class="va">$start_type</span> <span class="op">=</span> <span class="st">&quot;Disabled&quot;</span></span>
<span id="cb70-37"><a href="#cb70-37" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb70-38"><a href="#cb70-38" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">).</span><span class="fu">Rows</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="va">$counter</span><span class="op">)</span> <span class="op">=</span> <span class="va">$service</span><span class="op">.</span><span class="fu">Name</span></span>
<span id="cb70-39"><a href="#cb70-39" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">2</span><span class="op">).</span><span class="fu">Rows</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="va">$counter</span><span class="op">)</span> <span class="op">=</span> <span class="va">$service</span><span class="op">.</span><span class="fu">DisplayName</span></span>
<span id="cb70-40"><a href="#cb70-40" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">3</span><span class="op">).</span><span class="fu">Rows</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="va">$counter</span><span class="op">)</span> <span class="op">=</span> <span class="va">$status_type</span></span>
<span id="cb70-41"><a href="#cb70-41" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">4</span><span class="op">).</span><span class="fu">Rows</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="va">$counter</span><span class="op">)</span> <span class="op">=</span> <span class="va">$start_type</span></span>
<span id="cb70-42"><a href="#cb70-42" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$status_type</span> <span class="op">-eq</span> <span class="st">&quot;Running&quot;</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb70-43"><a href="#cb70-43" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Columns</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">3</span><span class="op">).</span><span class="fu">Rows</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="va">$counter</span><span class="op">).</span><span class="fu">Font</span><span class="op">.</span><span class="fu">Bold</span> <span class="op">=</span> <span class="va">$true</span></span>
<span id="cb70-44"><a href="#cb70-44" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb70-45"><a href="#cb70-45" aria-hidden="true" tabindex="-1"></a><span class="va">$counter</span><span class="op">++</span><span class="ch">` </span><span class="op">+</span><span class="dv">1</span> увеличить для счетчика строки Rows</span>
<span id="cb70-46"><a href="#cb70-46" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb70-47"><a href="#cb70-47" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkBook</span><span class="op">.</span><span class="fu">SaveAs</span><span class="op">(</span><span class="va">$path</span><span class="op">)</span></span>
<span id="cb70-48"><a href="#cb70-48" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkBook</span><span class="op">.</span><span class="fu">close</span><span class="op">(</span><span class="va">$true</span><span class="op">)</span></span>
<span id="cb70-49"><a href="#cb70-49" aria-hidden="true" tabindex="-1"></a><span class="va">$Excel</span><span class="op">.</span><span class="fu">Quit</span><span class="op">()</span></span></code></pre></div>
<h3 id="excel.application.open">Excel.Application.Open</h3>
<div class="sourceCode" id="cb71"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb71-1"><a href="#cb71-1" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Desktop\Services-to-Excel.xlsx&quot;</span></span>
<span id="cb71-2"><a href="#cb71-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Excel</span> <span class="op">=</span> <span class="fu">New-Object</span> <span class="op">-</span>ComObject Excel<span class="op">.</span><span class="fu">Application</span></span>
<span id="cb71-3"><a href="#cb71-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Excel</span><span class="op">.</span><span class="fu">Visible</span> <span class="op">=</span> <span class="va">$false</span></span>
<span id="cb71-4"><a href="#cb71-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkBook</span> <span class="op">=</span> <span class="va">$excel</span><span class="op">.</span><span class="fu">Workbooks</span><span class="op">.</span><span class="fu">Open</span><span class="op">(</span><span class="va">$path</span><span class="op">)</span><span class="ch">` </span>открыть xlsx-файл</span>
<span id="cb71-5"><a href="#cb71-5" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkBook</span><span class="op">.</span><span class="fu">Sheets</span> <span class="op">|</span> <span class="fu">select</span> Name<span class="op">,</span>Index<span class="ch">` </span>отобразить листы</span>
<span id="cb71-6"><a href="#cb71-6" aria-hidden="true" tabindex="-1"></a><span class="va">$ExcelWorkSheet</span> <span class="op">=</span> <span class="va">$ExcelWorkBook</span><span class="op">.</span><span class="fu">Sheets</span><span class="op">.</span><span class="fu">Item</span><span class="op">(</span><span class="dv">1</span><span class="op">)</span><span class="ch">` </span>открыть лист по номеру Index</span>
<span id="cb71-7"><a href="#cb71-7" aria-hidden="true" tabindex="-1"></a><span class="dv">1</span><span class="op">..</span><span class="dv">100</span> <span class="op">|</span> <span class="op">%{</span><span class="va">$ExcelWorkSheet</span><span class="op">.</span><span class="fu">Range</span><span class="op">(</span><span class="st">&quot;A</span><span class="va">$_</span><span class="st">&quot;</span><span class="op">).</span><span class="fu">Text</span><span class="op">}</span><span class="ch">` </span>прочитать значение из столбца А строки c <span class="dv">1</span> по <span class="dv">100</span></span>
<span id="cb71-8"><a href="#cb71-8" aria-hidden="true" tabindex="-1"></a><span class="va">$Excel</span><span class="op">.</span><span class="fu">Quit</span><span class="op">()</span></span></code></pre></div>
<h3 id="importexcel">ImportExcel</h3>
<p><code>Install-Module -Name ImportExcel</code><br />
<code>$data | Export-Excel .\Data.xlsx</code><br />
<code>$data = Import-Excel .\Data.xlsx</code></p>
<p><code>$data = ps</code><br />
<code>$Chart = New-ExcelChartDefinition -XRange CPU -YRange WS -Title "Process" -NoLegend</code><br />
<code>$data | Export-Excel .\ps.xlsx -AutoNameRange -ExcelChartDefinition $Chart -Show</code></p>
<h1 id="csv">CSV</h1>
<p><code>Get-Service | Select Name,DisplayName,Status,StartType | Export-Csv -path "$home\Desktop\Get-Service.csv" -Append -Encoding Default</code>
экспортировать в csv (-Encoding UTF8)<br />
<code>Import-Csv "$home\Desktop\Get-Service.csv" -Delimiter ","</code>
импортировать массив</p>
<div class="sourceCode" id="cb72"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb72-1"><a href="#cb72-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> <span class="fu">ConvertFrom-Csv</span> <span class="vs">@&quot;</span></span>
<span id="cb72-2"><a href="#cb72-2" aria-hidden="true" tabindex="-1"></a><span class="vs">Region,State,Units,Price</span></span>
<span id="cb72-3"><a href="#cb72-3" aria-hidden="true" tabindex="-1"></a><span class="vs">West,Texas,927,923.71</span></span>
<span id="cb72-4"><a href="#cb72-4" aria-hidden="true" tabindex="-1"></a><span class="va">$null</span><span class="vs">,Tennessee,466,770.67</span></span>
<span id="cb72-5"><a href="#cb72-5" aria-hidden="true" tabindex="-1"></a><span class="vs">&quot;@</span></span></code></pre></div>
<p><code>$systeminfo = systeminfo /FO csv | ConvertFrom-Csv</code> вывод
работы программы в CSV и конвертация в объект<br />
<code>$systeminfo."Полный объем физической памяти"</code><br />
<code>$systeminfo."Доступная физическая память"</code></p>
<h3 id="convertfrom-string">ConvertFrom-String</h3>
<div class="sourceCode" id="cb73"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb73-1"><a href="#cb73-1" aria-hidden="true" tabindex="-1"></a><span class="st">&#39;</span></span>
<span id="cb73-2"><a href="#cb73-2" aria-hidden="true" tabindex="-1"></a><span class="st">log = </span></span>
<span id="cb73-3"><a href="#cb73-3" aria-hidden="true" tabindex="-1"></a><span class="st">{</span></span>
<span id="cb73-4"><a href="#cb73-4" aria-hidden="true" tabindex="-1"></a><span class="st"> level = 4;</span></span>
<span id="cb73-5"><a href="#cb73-5" aria-hidden="true" tabindex="-1"></a><span class="st">};</span></span>
<span id="cb73-6"><a href="#cb73-6" aria-hidden="true" tabindex="-1"></a><span class="st">&#39;</span> <span class="op">|</span> ConvertFrom-String<span class="ch">` </span>создает PSCustomObject <span class="op">(</span>разбивает по пробелам<span class="op">,</span> удаляет все пробелы и пустые строки<span class="op">)</span></span></code></pre></div>
<h3 id="convertfrom-stringdata">ConvertFrom-StringData</h3>
<div class="sourceCode" id="cb74"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb74-1"><a href="#cb74-1" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;</span></span>
<span id="cb74-2"><a href="#cb74-2" aria-hidden="true" tabindex="-1"></a><span class="st">key1 = value1</span></span>
<span id="cb74-3"><a href="#cb74-3" aria-hidden="true" tabindex="-1"></a><span class="st">key2 = value2</span></span>
<span id="cb74-4"><a href="#cb74-4" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;</span> <span class="op">|</span> <span class="fu">ConvertFrom-StringData</span> <span class="co"># создает Hashtable</span></span></code></pre></div>
<h1 id="xml">XML</h1>
<div class="sourceCode" id="cb75"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb75-1"><a href="#cb75-1" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span> <span class="op">=</span> <span class="op">[</span>xml<span class="op">](</span><span class="fu">Get-Content</span> <span class="va">$home</span>\desktop\test<span class="op">.</span><span class="fu">rdg</span><span class="op">)</span><span class="ch">` </span>прочитать содержимое XML-файла</span>
<span id="cb75-2"><a href="#cb75-2" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">load</span><span class="op">(</span><span class="st">&quot;</span><span class="va">$home</span><span class="st">\desktop\test.rdg&quot;</span><span class="op">)</span><span class="ch">` </span>открыть файл</span>
<span id="cb75-3"><a href="#cb75-3" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">RDCMan</span><span class="op">.</span><span class="fu">file</span><span class="op">.</span><span class="fu">group</span><span class="op">.</span><span class="fu">properties</span><span class="op">.</span><span class="fu">name</span><span class="ch">` </span>имена групп</span>
<span id="cb75-4"><a href="#cb75-4" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">RDCMan</span><span class="op">.</span><span class="fu">file</span><span class="op">.</span><span class="fu">group</span><span class="op">.</span><span class="fu">server</span><span class="op">.</span><span class="fu">properties</span><span class="ch">` </span>имена всех серверов</span>
<span id="cb75-5"><a href="#cb75-5" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">RDCMan</span><span class="op">.</span><span class="fu">file</span><span class="op">.</span><span class="fu">group</span><span class="op">[</span><span class="dv">3</span><span class="op">].</span><span class="fu">server</span><span class="op">.</span><span class="fu">properties</span><span class="ch">` </span>список серверов в <span class="dv">4</span><span class="op">-</span>й группе</span>
<span id="cb75-6"><a href="#cb75-6" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="va">$xml</span><span class="op">.</span><span class="fu">RDCMan</span><span class="op">.</span><span class="fu">file</span><span class="op">.</span><span class="fu">group</span><span class="op">[</span><span class="dv">3</span><span class="op">].</span><span class="fu">server</span><span class="op">.</span><span class="fu">properties</span> <span class="op">|</span> <span class="op">?</span> name <span class="op">-like</span> ADIRK<span class="op">).</span><span class="fu">Name</span> <span class="op">=</span> <span class="st">&quot;New-Name&quot;</span><span class="ch">` </span>изменить значение</span>
<span id="cb75-7"><a href="#cb75-7" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">RDCMan</span><span class="op">.</span><span class="fu">file</span><span class="op">.</span><span class="fu">group</span><span class="op">[</span><span class="dv">3</span><span class="op">].</span><span class="fu">server</span><span class="op">[</span><span class="dv">0</span><span class="op">].</span><span class="fu">properties</span><span class="op">.</span><span class="fu">displayName</span> <span class="op">=</span> <span class="st">&quot;New-displayName&quot;</span> </span>
<span id="cb75-8"><a href="#cb75-8" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">RDCMan</span><span class="op">.</span><span class="fu">file</span><span class="op">.</span><span class="fu">group</span><span class="op">[</span><span class="dv">3</span><span class="op">].</span><span class="fu">server</span><span class="op">[</span><span class="dv">1</span><span class="op">].</span><span class="fu">RemoveAll</span><span class="op">()</span><span class="ch">` </span>удалить объект <span class="op">(</span><span class="dv">2</span><span class="op">-</span>й сервер в списке<span class="op">)</span></span>
<span id="cb75-9"><a href="#cb75-9" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">Save</span><span class="op">(</span><span class="va">$file</span><span class="op">)</span><span class="ch">` </span>сохранить содержимое объекта в файла</span></code></pre></div>
<p><code>Get-Service | Export-Clixml -path $home\desktop\test.xml</code>
экспортировать объект PowerShell в XML<br />
<code>Import-Clixml -Path $home\desktop\test.xml</code> импортировать
объект XML в PowerShell<br />
<code>ConvertTo-Xml (Get-Service)</code></p>
<h3 id="get-credtoxml">Get-CredToXML</h3>
<div class="sourceCode" id="cb76"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb76-1"><a href="#cb76-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-CredToXML <span class="op">{</span></span>
<span id="cb76-2"><a href="#cb76-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">param</span> <span class="op">(</span></span>
<span id="cb76-3"><a href="#cb76-3" aria-hidden="true" tabindex="-1"></a> <span class="va">$CredFile</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Documents\cred.xml&quot;</span></span>
<span id="cb76-4"><a href="#cb76-4" aria-hidden="true" tabindex="-1"></a> <span class="op">)</span></span>
<span id="cb76-5"><a href="#cb76-5" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="fu">Test-Path</span> <span class="va">$CredFile</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb76-6"><a href="#cb76-6" aria-hidden="true" tabindex="-1"></a> <span class="fu">Import-Clixml</span> <span class="op">-</span>path <span class="va">$CredFile</span></span>
<span id="cb76-7"><a href="#cb76-7" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb76-8"><a href="#cb76-8" aria-hidden="true" tabindex="-1"></a> <span class="cf">elseif</span> <span class="op">(!(</span><span class="fu">Test-Path</span> <span class="va">$CredFile</span><span class="op">))</span> <span class="op">{</span></span>
<span id="cb76-9"><a href="#cb76-9" aria-hidden="true" tabindex="-1"></a> <span class="va">$Cred</span> <span class="op">=</span> <span class="fu">Get-Credential</span> <span class="op">-</span>Message <span class="st">&quot;Enter credential&quot;</span></span>
<span id="cb76-10"><a href="#cb76-10" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="va">$Cred</span> <span class="op">-ne</span> <span class="va">$null</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb76-11"><a href="#cb76-11" aria-hidden="true" tabindex="-1"></a> <span class="va">$Cred</span> <span class="op">|</span> <span class="fu">Export-CliXml</span> <span class="op">-</span>Path <span class="va">$CredFile</span></span>
<span id="cb76-12"><a href="#cb76-12" aria-hidden="true" tabindex="-1"></a> <span class="va">$Cred</span></span>
<span id="cb76-13"><a href="#cb76-13" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb76-14"><a href="#cb76-14" aria-hidden="true" tabindex="-1"></a> <span class="cf">else</span> <span class="op">{</span></span>
<span id="cb76-15"><a href="#cb76-15" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span></span>
<span id="cb76-16"><a href="#cb76-16" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb76-17"><a href="#cb76-17" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb76-18"><a href="#cb76-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>$Cred = Get-CredToXML</code><br />
<code>$Login = $Cred.UserName</code><br />
<code>$PasswordText = $Cred.GetNetworkCredential().password</code>
получить пароль в текстовом виде</p>
<h3 id="xmlwriter-extensible-markup-language">XmlWriter (Extensible
Markup Language)</h3>
<div class="sourceCode" id="cb77"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb77-1"><a href="#cb77-1" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlWriterSettings</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Xml</span><span class="op">.</span><span class="fu">XmlWriterSettings</span></span>
<span id="cb77-2"><a href="#cb77-2" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlWriterSettings</span><span class="op">.</span><span class="fu">Indent</span> <span class="op">=</span> <span class="va">$true</span><span class="ch">` </span>включить отступы</span>
<span id="cb77-3"><a href="#cb77-3" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlWriterSettings</span><span class="op">.</span><span class="fu">IndentChars</span> <span class="op">=</span> <span class="st">&quot; &quot;</span><span class="ch">` </span>задать отступ</span>
<span id="cb77-4"><a href="#cb77-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb77-5"><a href="#cb77-5" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlFilePath</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\desktop\test.xml&quot;</span></span>
<span id="cb77-6"><a href="#cb77-6" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">XML</span><span class="op">.</span><span class="fu">XmlWriter</span><span class="op">]::</span>Create<span class="op">(</span><span class="va">$XmlFilePath</span><span class="op">,</span> <span class="va">$XmlWriterSettings</span><span class="op">)</span><span class="ch">` </span>создать документ</span>
<span id="cb77-7"><a href="#cb77-7" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteStartDocument</span><span class="op">()</span><span class="ch">` </span>начать запись в документ</span>
<span id="cb77-8"><a href="#cb77-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb77-9"><a href="#cb77-9" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteComment</span><span class="op">(</span><span class="st">&quot;Comment&quot;</span><span class="op">)</span></span>
<span id="cb77-10"><a href="#cb77-10" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteStartElement</span><span class="op">(</span><span class="st">&quot;Root&quot;</span><span class="op">)</span><span class="ch">` </span>создать стартовый элемент<span class="op">,</span> который содержит дочерние объекты</span>
<span id="cb77-11"><a href="#cb77-11" aria-hidden="true" tabindex="-1"></a> <span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteStartElement</span><span class="op">(</span><span class="st">&quot;Configuration&quot;</span><span class="op">)</span><span class="ch">` </span>создать первый дочерний элемент для BaseSettings</span>
<span id="cb77-12"><a href="#cb77-12" aria-hidden="true" tabindex="-1"></a> <span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteElementString</span><span class="op">(</span><span class="st">&quot;Language&quot;</span><span class="op">,</span><span class="st">&quot;RU&quot;</span><span class="op">)</span></span>
<span id="cb77-13"><a href="#cb77-13" aria-hidden="true" tabindex="-1"></a> <span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteStartElement</span><span class="op">(</span><span class="st">&quot;Fonts&quot;</span><span class="op">)</span> <span class="co"># &lt;Fonts&gt;</span></span>
<span id="cb77-14"><a href="#cb77-14" aria-hidden="true" tabindex="-1"></a> <span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteElementString</span><span class="op">(</span><span class="st">&quot;Name&quot;</span><span class="op">,</span><span class="st">&quot;Arial&quot;</span><span class="op">)</span></span>
<span id="cb77-15"><a href="#cb77-15" aria-hidden="true" tabindex="-1"></a> <span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteElementString</span><span class="op">(</span><span class="st">&quot;Size&quot;</span><span class="op">,</span><span class="st">&quot;12&quot;</span><span class="op">)</span></span>
<span id="cb77-16"><a href="#cb77-16" aria-hidden="true" tabindex="-1"></a> <span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteEndElement</span><span class="op">()</span> <span class="co"># &lt;/Fonts&gt;</span></span>
<span id="cb77-17"><a href="#cb77-17" aria-hidden="true" tabindex="-1"></a> <span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteEndElement</span><span class="op">()</span><span class="ch">` </span>конечный элемент <span class="op">&lt;/</span>Configuration<span class="op">&gt;</span></span>
<span id="cb77-18"><a href="#cb77-18" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteEndElement</span><span class="op">()</span><span class="ch">` </span>конечный элемент <span class="op">&lt;/</span>Root<span class="op">&gt;</span></span>
<span id="cb77-19"><a href="#cb77-19" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb77-20"><a href="#cb77-20" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">WriteEndDocument</span><span class="op">()</span><span class="ch">` </span>завершить запись в документ</span>
<span id="cb77-21"><a href="#cb77-21" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">Flush</span><span class="op">()</span></span>
<span id="cb77-22"><a href="#cb77-22" aria-hidden="true" tabindex="-1"></a><span class="va">$XmlObjectWriter</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span></code></pre></div>
<h3 id="createelement">CreateElement</h3>
<div class="sourceCode" id="cb78"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb78-1"><a href="#cb78-1" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span> <span class="op">=</span> <span class="op">[</span>xml<span class="op">](</span><span class="fu">gc</span> <span class="va">$home</span>\desktop\test<span class="op">.</span><span class="fu">xml</span><span class="op">)</span></span>
<span id="cb78-2"><a href="#cb78-2" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">Root</span><span class="op">.</span><span class="fu">Configuration</span><span class="op">.</span><span class="fu">Fonts</span></span>
<span id="cb78-3"><a href="#cb78-3" aria-hidden="true" tabindex="-1"></a><span class="va">$NewElement</span> <span class="op">=</span> <span class="va">$xml</span><span class="op">.</span><span class="fu">CreateElement</span><span class="op">(</span><span class="st">&quot;Fonts&quot;</span><span class="op">)</span><span class="ch">` </span>выбрать элемент куда добавить</span>
<span id="cb78-4"><a href="#cb78-4" aria-hidden="true" tabindex="-1"></a><span class="va">$NewElement</span><span class="op">.</span><span class="fu">set_InnerXML</span><span class="op">(</span><span class="st">&quot;&lt;Name&gt;Times New Roman&lt;/Name&gt;&lt;Size&gt;14&lt;/Size&gt;&quot;</span><span class="op">)</span><span class="ch">` </span>Заполнить значениями дочерние элементы Fonts</span>
<span id="cb78-5"><a href="#cb78-5" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">Root</span><span class="op">.</span><span class="fu">Configuration</span><span class="op">.</span><span class="fu">AppendChild</span><span class="op">(</span><span class="va">$NewElement</span><span class="op">)</span><span class="ch">` </span>добавить элемент новой строкой в Configuration <span class="op">(</span>родитель Fonts<span class="op">)</span></span>
<span id="cb78-6"><a href="#cb78-6" aria-hidden="true" tabindex="-1"></a><span class="va">$xml</span><span class="op">.</span><span class="fu">Save</span><span class="op">(</span><span class="st">&quot;</span><span class="va">$home</span><span class="st">\desktop\test.xml&quot;</span><span class="op">)</span></span></code></pre></div>
<h1 id="json">JSON</h1>
<div class="sourceCode" id="cb79"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb79-1"><a href="#cb79-1" aria-hidden="true" tabindex="-1"></a><span class="va">$log</span> <span class="op">=</span> <span class="st">&#39;</span></span>
<span id="cb79-2"><a href="#cb79-2" aria-hidden="true" tabindex="-1"></a><span class="st">{</span></span>
<span id="cb79-3"><a href="#cb79-3" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;log&quot;: {</span></span>
<span id="cb79-4"><a href="#cb79-4" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;level&quot;: 7</span></span>
<span id="cb79-5"><a href="#cb79-5" aria-hidden="true" tabindex="-1"></a><span class="st"> }</span></span>
<span id="cb79-6"><a href="#cb79-6" aria-hidden="true" tabindex="-1"></a><span class="st">}</span></span>
<span id="cb79-7"><a href="#cb79-7" aria-hidden="true" tabindex="-1"></a><span class="st">&#39;</span> <span class="op">|</span> <span class="fu">ConvertFrom-Json</span></span>
<span id="cb79-8"><a href="#cb79-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb79-9"><a href="#cb79-9" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Service</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span></span>
<span id="cb79-10"><a href="#cb79-10" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb79-11"><a href="#cb79-11" aria-hidden="true" tabindex="-1"></a><span class="va">$OOKLA</span> <span class="op">=</span> <span class="st">&#39;</span></span>
<span id="cb79-12"><a href="#cb79-12" aria-hidden="true" tabindex="-1"></a><span class="st">{</span></span>
<span id="cb79-13"><a href="#cb79-13" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;result&quot; : </span></span>
<span id="cb79-14"><a href="#cb79-14" aria-hidden="true" tabindex="-1"></a><span class="st">{&quot;date&quot;:1683534970,&quot;id&quot;:&quot;14708271987&quot;,&quot;connection_icon&quot;:&quot;wireless&quot;,&quot;download&quot;:33418,&quot;upload&quot;:35442,&quot;latency&quot;:15,&quot;distance&quot;:50,&quot;country_code&quot;:&quot;RU&quot;,&quot;server_id&quot;:2707,&quot;server_name&quot;:&quot;Bryansk&quot;,&quot;sponsor_name&quot;:&quot;DOM.RU&quot;,&quot;sponsor_url&quot;:null,&quot;connection_mode&quot;:&quot;multi&quot;,&quot;isp_name&quot;:&quot;Resource Link&quot;,&quot;isp_rating&quot;:&quot;4.0&quot;,&quot;test_rank&quot;:63,&quot;test_grade&quot;:&quot;B-&quot;,&quot;test_rating&quot;:4,&quot;idle_latency&quot;:&quot;17&quot;,&quot;download_latency&quot;:&quot;116&quot;,&quot;upload_latency&quot;:&quot;75&quot;,&quot;additional_servers&quot;:</span></span>
<span id="cb79-15"><a href="#cb79-15" aria-hidden="true" tabindex="-1"></a><span class="st">[{&quot;server_id&quot;:8191,&quot;server_name&quot;:&quot;Bryansk&quot;,&quot;sponsor_name&quot;:&quot;SectorTelecom.ru&quot;},{&quot;server_id&quot;:46278,&quot;server_name&quot;:&quot;Fokino&quot;,&quot;sponsor_name&quot;:&quot;Fokks - Promyshlennaya avtomatika Ltd.&quot;},{&quot;server_id&quot;:18218,&quot;server_name&quot;:&quot;Bryansk&quot;,&quot;sponsor_name&quot;:&quot;RIA-link Ltd.&quot;}],</span></span>
<span id="cb79-16"><a href="#cb79-16" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;path&quot;:&quot;result\u002F14708271987&quot;,&quot;hasSecondary&quot;:true</span></span>
<span id="cb79-17"><a href="#cb79-17" aria-hidden="true" tabindex="-1"></a><span class="st">}</span></span>
<span id="cb79-18"><a href="#cb79-18" aria-hidden="true" tabindex="-1"></a><span class="st">}</span></span>
<span id="cb79-19"><a href="#cb79-19" aria-hidden="true" tabindex="-1"></a><span class="st">&#39;</span> <span class="op">|</span> <span class="fu">ConvertFrom-Json</span></span>
<span id="cb79-20"><a href="#cb79-20" aria-hidden="true" tabindex="-1"></a><span class="va">$ookla</span><span class="op">.</span><span class="fu">result</span></span></code></pre></div>
<h1 id="yaml">YAML</h1>
<div class="sourceCode" id="cb80"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb80-1"><a href="#cb80-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Import-Module</span> PSYaml<span class="ch">` </span>используется в Docker<span class="op">/</span>Ansible</span>
<span id="cb80-2"><a href="#cb80-2" aria-hidden="true" tabindex="-1"></a><span class="va">$netplan</span> <span class="op">=</span> <span class="st">&quot;</span></span>
<span id="cb80-3"><a href="#cb80-3" aria-hidden="true" tabindex="-1"></a><span class="st">network:</span><span class="ch">` </span><span class="st">словарь по типу - ключ : значение с вложенными словарями</span></span>
<span id="cb80-4"><a href="#cb80-4" aria-hidden="true" tabindex="-1"></a><span class="st"> ethernets:</span></span>
<span id="cb80-5"><a href="#cb80-5" aria-hidden="true" tabindex="-1"></a><span class="st"> ens160:</span></span>
<span id="cb80-6"><a href="#cb80-6" aria-hidden="true" tabindex="-1"></a><span class="st"> dhcp4: yes</span></span>
<span id="cb80-7"><a href="#cb80-7" aria-hidden="true" tabindex="-1"></a><span class="st"> dhcp6: no</span></span>
<span id="cb80-8"><a href="#cb80-8" aria-hidden="true" tabindex="-1"></a><span class="st"> nameservers:</span></span>
<span id="cb80-9"><a href="#cb80-9" aria-hidden="true" tabindex="-1"></a><span class="st"> addresses:</span><span class="ch">` </span><span class="st">[8.8.8.8, 1.1.1.1]</span><span class="ch">` </span><span class="st">список данных (строк)</span></span>
<span id="cb80-10"><a href="#cb80-10" aria-hidden="true" tabindex="-1"></a><span class="st"> - 8.8.8.8</span></span>
<span id="cb80-11"><a href="#cb80-11" aria-hidden="true" tabindex="-1"></a><span class="st"> - 1.1.1.1</span></span>
<span id="cb80-12"><a href="#cb80-12" aria-hidden="true" tabindex="-1"></a><span class="st"> version: 2</span></span>
<span id="cb80-13"><a href="#cb80-13" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;</span></span>
<span id="cb80-14"><a href="#cb80-14" aria-hidden="true" tabindex="-1"></a><span class="va">$network</span> <span class="op">=</span> ConvertFrom-Yaml <span class="va">$netplan</span></span>
<span id="cb80-15"><a href="#cb80-15" aria-hidden="true" tabindex="-1"></a><span class="va">$network</span><span class="op">.</span><span class="fu">Values</span><span class="op">.</span><span class="fu">ethernets</span><span class="op">.</span><span class="fu">ens160</span><span class="op">.</span><span class="fu">nameservers</span></span>
<span id="cb80-16"><a href="#cb80-16" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb80-17"><a href="#cb80-17" aria-hidden="true" tabindex="-1"></a><span class="va">$DataType</span> <span class="op">=</span> <span class="st">&quot;</span></span>
<span id="cb80-18"><a href="#cb80-18" aria-hidden="true" tabindex="-1"></a><span class="st">int: !!int 10.1</span></span>
<span id="cb80-19"><a href="#cb80-19" aria-hidden="true" tabindex="-1"></a><span class="st">flo: !!float 10.1</span></span>
<span id="cb80-20"><a href="#cb80-20" aria-hidden="true" tabindex="-1"></a><span class="st">str: !!str string</span></span>
<span id="cb80-21"><a href="#cb80-21" aria-hidden="true" tabindex="-1"></a><span class="st">bool: !!bool</span><span class="ch">` </span><span class="st">boolean</span></span>
<span id="cb80-22"><a href="#cb80-22" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;</span></span></code></pre></div>
<h1 id="html">HTML</h1>
<h3 id="convertfrom-html">ConvertFrom-Html</h3>
<div class="sourceCode" id="cb81"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb81-1"><a href="#cb81-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> ConvertFrom-Html <span class="op">{</span></span>
<span id="cb81-2"><a href="#cb81-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">param</span> <span class="op">(</span></span>
<span id="cb81-3"><a href="#cb81-3" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span>Parameter<span class="op">(</span>ValueFromPipeline<span class="op">)]</span><span class="va">$url</span></span>
<span id="cb81-4"><a href="#cb81-4" aria-hidden="true" tabindex="-1"></a> <span class="op">)</span></span>
<span id="cb81-5"><a href="#cb81-5" aria-hidden="true" tabindex="-1"></a> <span class="va">$irm</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="va">$url</span></span>
<span id="cb81-6"><a href="#cb81-6" aria-hidden="true" tabindex="-1"></a> <span class="va">$HTMLFile</span> <span class="op">=</span> <span class="fu">New-Object</span> <span class="op">-</span>ComObject HTMLFile</span>
<span id="cb81-7"><a href="#cb81-7" aria-hidden="true" tabindex="-1"></a> <span class="va">$Bytes</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">Encoding</span><span class="op">]::</span>Unicode<span class="op">.</span><span class="fu">GetBytes</span><span class="op">(</span><span class="va">$irm</span><span class="op">)</span></span>
<span id="cb81-8"><a href="#cb81-8" aria-hidden="true" tabindex="-1"></a> <span class="va">$HTMLFile</span><span class="op">.</span><span class="fu">write</span><span class="op">(</span><span class="va">$Bytes</span><span class="op">)</span></span>
<span id="cb81-9"><a href="#cb81-9" aria-hidden="true" tabindex="-1"></a> <span class="op">(</span><span class="va">$HTMLFile</span><span class="op">.</span><span class="fu">all</span> <span class="op">|</span> <span class="fu">where</span> <span class="op">{</span><span class="va">$_</span><span class="op">.</span><span class="fu">tagname</span> <span class="op">-eq</span> <span class="st">&quot;body&quot;</span><span class="op">}).</span><span class="fu">innerText</span></span>
<span id="cb81-10"><a href="#cb81-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb81-11"><a href="#cb81-11" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb81-12"><a href="#cb81-12" aria-hidden="true" tabindex="-1"></a><span class="va">$apache_status</span> <span class="op">=</span> <span class="st">&quot;http://192.168.3.102/server-status&quot;</span></span>
<span id="cb81-13"><a href="#cb81-13" aria-hidden="true" tabindex="-1"></a><span class="va">$apache_status</span> <span class="op">|</span> ConvertFrom-Html</span></code></pre></div>
<h3 id="convertto-html">ConvertTo-Html</h3>
<p><code>Get-Process | select Name, CPU | ConvertTo-Html -As Table &gt; "$home\desktop\proc-table.html"</code>
вывод в формате List (Format-List) или Table (Format-Table)</p>
<div class="sourceCode" id="cb82"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb82-1"><a href="#cb82-1" aria-hidden="true" tabindex="-1"></a><span class="va">$servers</span> <span class="op">=</span> <span class="st">&quot;ya.ru&quot;</span><span class="op">,</span><span class="st">&quot;ya.com&quot;</span><span class="op">,</span><span class="st">&quot;google.com&quot;</span></span>
<span id="cb82-2"><a href="#cb82-2" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Desktop\Ping.html&quot;</span> </span>
<span id="cb82-3"><a href="#cb82-3" aria-hidden="true" tabindex="-1"></a><span class="va">$header</span> <span class="op">=</span> <span class="vs">@&quot;</span></span>
<span id="cb82-4"><a href="#cb82-4" aria-hidden="true" tabindex="-1"></a><span class="vs">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;</span></span>
<span id="cb82-5"><a href="#cb82-5" aria-hidden="true" tabindex="-1"></a><span class="vs">&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; lang=&quot;en&quot; xml:lang=&quot;en&quot;&gt;</span></span>
<span id="cb82-6"><a href="#cb82-6" aria-hidden="true" tabindex="-1"></a><span class="vs">&lt;head&gt;</span></span>
<span id="cb82-7"><a href="#cb82-7" aria-hidden="true" tabindex="-1"></a><span class="vs">&lt;title&gt;Отчет о статусе серверов&lt;/title&gt;</span></span>
<span id="cb82-8"><a href="#cb82-8" aria-hidden="true" tabindex="-1"></a><span class="vs">&lt;style type=&quot;text/css&quot;&gt;</span></span>
<span id="cb82-9"><a href="#cb82-9" aria-hidden="true" tabindex="-1"></a><span class="vs">&lt;!--</span></span>
<span id="cb82-10"><a href="#cb82-10" aria-hidden="true" tabindex="-1"></a><span class="vs">body {</span></span>
<span id="cb82-11"><a href="#cb82-11" aria-hidden="true" tabindex="-1"></a><span class="vs">background-color: #E0E0E0;</span></span>
<span id="cb82-12"><a href="#cb82-12" aria-hidden="true" tabindex="-1"></a><span class="vs">font-family: sans-serif</span></span>
<span id="cb82-13"><a href="#cb82-13" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb82-14"><a href="#cb82-14" aria-hidden="true" tabindex="-1"></a><span class="vs">table, th, td {</span></span>
<span id="cb82-15"><a href="#cb82-15" aria-hidden="true" tabindex="-1"></a><span class="vs">background-color: white;</span></span>
<span id="cb82-16"><a href="#cb82-16" aria-hidden="true" tabindex="-1"></a><span class="vs">border-collapse:collapse;</span></span>
<span id="cb82-17"><a href="#cb82-17" aria-hidden="true" tabindex="-1"></a><span class="vs">border: 1px solid black;</span></span>
<span id="cb82-18"><a href="#cb82-18" aria-hidden="true" tabindex="-1"></a><span class="vs">padding: 5px</span></span>
<span id="cb82-19"><a href="#cb82-19" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb82-20"><a href="#cb82-20" aria-hidden="true" tabindex="-1"></a><span class="vs">--&gt;</span></span>
<span id="cb82-21"><a href="#cb82-21" aria-hidden="true" tabindex="-1"></a><span class="vs">&lt;/style&gt;</span></span>
<span id="cb82-22"><a href="#cb82-22" aria-hidden="true" tabindex="-1"></a><span class="vs">&quot;@</span></span>
<span id="cb82-23"><a href="#cb82-23" aria-hidden="true" tabindex="-1"></a><span class="va">$body</span> <span class="op">=</span> <span class="vs">@&quot;</span></span>
<span id="cb82-24"><a href="#cb82-24" aria-hidden="true" tabindex="-1"></a><span class="vs">&lt;h1&gt;Ping status&lt;/h1&gt;</span></span>
<span id="cb82-25"><a href="#cb82-25" aria-hidden="true" tabindex="-1"></a><span class="vs">&lt;p&gt;</span><span class="op">$(</span><span class="fu">get-date</span> <span class="op">-</span>Format <span class="st">&quot;dd.MM.yyyy hh:mm&quot;</span><span class="op">)</span><span class="vs">.&lt;/p&gt;</span></span>
<span id="cb82-26"><a href="#cb82-26" aria-hidden="true" tabindex="-1"></a><span class="vs">&quot;@</span></span>
<span id="cb82-27"><a href="#cb82-27" aria-hidden="true" tabindex="-1"></a><span class="va">$results</span> <span class="op">=</span> <span class="cf">foreach</span> <span class="op">(</span><span class="va">$server</span> <span class="kw">in</span> <span class="va">$servers</span><span class="op">)</span> <span class="op">{</span> </span>
<span id="cb82-28"><a href="#cb82-28" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="fu">Test-Connection</span> <span class="va">$server</span> <span class="op">-</span>Count <span class="dv">1</span> <span class="op">-</span>ea <span class="dv">0</span> <span class="op">-</span>Quiet<span class="op">)</span> <span class="op">{</span> </span>
<span id="cb82-29"><a href="#cb82-29" aria-hidden="true" tabindex="-1"></a> <span class="va">$status</span> <span class="op">=</span> <span class="st">&quot;Up&quot;</span> </span>
<span id="cb82-30"><a href="#cb82-30" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb82-31"><a href="#cb82-31" aria-hidden="true" tabindex="-1"></a> <span class="cf">else</span> <span class="op">{</span> </span>
<span id="cb82-32"><a href="#cb82-32" aria-hidden="true" tabindex="-1"></a> <span class="va">$status</span> <span class="op">=</span> <span class="st">&quot;Down&quot;</span></span>
<span id="cb82-33"><a href="#cb82-33" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb82-34"><a href="#cb82-34" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
<span id="cb82-35"><a href="#cb82-35" aria-hidden="true" tabindex="-1"></a> Name <span class="op">=</span> <span class="va">$server</span></span>
<span id="cb82-36"><a href="#cb82-36" aria-hidden="true" tabindex="-1"></a> Status <span class="op">=</span> <span class="va">$status</span></span>
<span id="cb82-37"><a href="#cb82-37" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb82-38"><a href="#cb82-38" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb82-39"><a href="#cb82-39" aria-hidden="true" tabindex="-1"></a><span class="va">$results</span> <span class="op">|</span> <span class="fu">ConvertTo-Html</span> <span class="op">-</span>head <span class="va">$header</span> <span class="op">-</span>body <span class="va">$body</span> <span class="op">|</span> <span class="cf">foreach</span> <span class="op">{</span></span>
<span id="cb82-40"><a href="#cb82-40" aria-hidden="true" tabindex="-1"></a> <span class="va">$_</span> <span class="op">-replace</span> <span class="st">&quot;&lt;td&gt;Down&lt;/td&gt;&quot;</span><span class="op">,</span><span class="st">&quot;&lt;td style=&#39;background-color:#FF8080&#39;&gt;Down&lt;/td&gt;&quot;</span> <span class="op">-replace</span> <span class="st">&quot;&lt;td&gt;Up&lt;/td&gt;&quot;</span><span class="op">,</span><span class="st">&quot;&lt;td style=&#39;background-color:#5BCCF3&#39;&gt;Up&lt;/td&gt;&quot;</span></span>
<span id="cb82-41"><a href="#cb82-41" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">|</span> <span class="fu">Out-File</span> <span class="va">$path</span></span>
<span id="cb82-42"><a href="#cb82-42" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-Item</span> <span class="va">$path</span></span></code></pre></div>
<h3 id="pswritehtml">PSWriteHTML</h3>
<div class="sourceCode" id="cb83"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb83-1"><a href="#cb83-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Import-Module</span> PSWriteHTML</span>
<span id="cb83-2"><a href="#cb83-2" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="fu">Get-Module</span> PSWriteHTML<span class="op">).</span><span class="fu">ExportedCommands</span></span>
<span id="cb83-3"><a href="#cb83-3" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Service</span> <span class="op">|</span> Out-GridHtml <span class="op">-</span>FilePath <span class="op">~</span>\Desktop\Get-Service-Out-GridHtml<span class="op">.</span><span class="fu">html</span></span></code></pre></div>
<h3 id="htmlreport">HtmlReport</h3>
<div class="sourceCode" id="cb84"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb84-1"><a href="#cb84-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Import-Module</span> HtmlReport</span>
<span id="cb84-2"><a href="#cb84-2" aria-hidden="true" tabindex="-1"></a><span class="va">$topVM</span> <span class="op">=</span> <span class="fu">ps</span> <span class="op">|</span> <span class="fu">Sort</span> PrivateMemorySize <span class="op">-</span>Descending <span class="op">|</span> <span class="fu">Select</span> <span class="op">-</span>First <span class="dv">10</span> <span class="op">|</span> <span class="op">%{,@((</span><span class="va">$_</span><span class="op">.</span><span class="fu">ProcessName</span> <span class="op">+</span> <span class="st">&quot; &quot;</span> <span class="op">+</span> <span class="va">$_</span><span class="op">.</span><span class="fu">Id</span><span class="op">),</span> <span class="va">$_</span><span class="op">.</span><span class="fu">PrivateMemorySize</span><span class="op">)}</span></span>
<span id="cb84-3"><a href="#cb84-3" aria-hidden="true" tabindex="-1"></a><span class="va">$topCPU</span> <span class="op">=</span> <span class="fu">ps</span> <span class="op">|</span> <span class="fu">Sort</span> CPU <span class="op">-</span>Descending <span class="op">|</span> <span class="fu">Select</span> <span class="op">-</span>First <span class="dv">10</span> <span class="op">|</span> <span class="op">%{,@((</span><span class="va">$_</span><span class="op">.</span><span class="fu">ProcessName</span> <span class="op">+</span> <span class="st">&quot; &quot;</span> <span class="op">+</span> <span class="va">$_</span><span class="op">.</span><span class="fu">Id</span><span class="op">),</span> <span class="va">$_</span><span class="op">.</span><span class="fu">CPU</span><span class="op">)}</span></span>
<span id="cb84-4"><a href="#cb84-4" aria-hidden="true" tabindex="-1"></a>New-Report <span class="op">-</span>Title <span class="st">&quot;Piggy Processes&quot;</span> <span class="op">-</span>Input <span class="op">{</span></span>
<span id="cb84-5"><a href="#cb84-5" aria-hidden="true" tabindex="-1"></a>New-Chart Bar <span class="st">&quot;Top VM Users&quot;</span> <span class="op">-</span>input <span class="va">$topVm</span></span>
<span id="cb84-6"><a href="#cb84-6" aria-hidden="true" tabindex="-1"></a>New-Chart Column <span class="st">&quot;Top CPU Overall&quot;</span> <span class="op">-</span>input <span class="va">$topCPU</span></span>
<span id="cb84-7"><a href="#cb84-7" aria-hidden="true" tabindex="-1"></a><span class="fu">ps</span> <span class="op">|</span> <span class="fu">Select</span> ProcessName<span class="op">,</span> Id<span class="op">,</span> CPU<span class="op">,</span> WorkingSet<span class="op">,</span> <span class="op">*</span>MemorySize <span class="op">|</span> New-Table <span class="st">&quot;All Processes&quot;</span></span>
<span id="cb84-8"><a href="#cb84-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">&gt;</span> <span class="op">~</span>\Desktop\Get-Process-HtmlReport<span class="op">.</span><span class="fu">html</span></span></code></pre></div>
<h1 id="sqlite">SQLite</h1>
<div class="sourceCode" id="cb85"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb85-1"><a href="#cb85-1" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Documents\Get-Service.db&quot;</span></span>
<span id="cb85-2"><a href="#cb85-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Module</span> <span class="op">=</span> <span class="fu">Get-Module</span> MySQLite</span>
<span id="cb85-3"><a href="#cb85-3" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$Module</span> <span class="op">-eq</span> <span class="va">$null</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb85-4"><a href="#cb85-4" aria-hidden="true" tabindex="-1"></a>Install-Module MySQLite <span class="op">-</span>Repository PSGallery <span class="op">-</span>Scope CurrentUser</span>
<span id="cb85-5"><a href="#cb85-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb85-6"><a href="#cb85-6" aria-hidden="true" tabindex="-1"></a><span class="fu">Import-Module</span> MySQLite</span>
<span id="cb85-7"><a href="#cb85-7" aria-hidden="true" tabindex="-1"></a>New-MySQLiteDB <span class="op">-</span>Path <span class="va">$path</span> <span class="co"># создать БД</span></span>
<span id="cb85-8"><a href="#cb85-8" aria-hidden="true" tabindex="-1"></a>Invoke-MySQLiteQuery <span class="op">-</span>Path <span class="va">$path</span> <span class="op">-</span>Query <span class="st">&quot;CREATE TABLE Service (Name TEXT NOT NULL, DisplayName TEXT NOT NULL, Status TEXT NOT NULL);&quot;</span> <span class="co"># создать таблицу</span></span>
<span id="cb85-9"><a href="#cb85-9" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb85-10"><a href="#cb85-10" aria-hidden="true" tabindex="-1"></a><span class="va">$Service</span> <span class="op">=</span> <span class="fu">Get-Service</span> <span class="op">|</span> <span class="fu">select</span> Name<span class="op">,</span>DisplayName<span class="op">,</span>Status</span>
<span id="cb85-11"><a href="#cb85-11" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$S</span> <span class="kw">in</span> <span class="va">$Service</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb85-12"><a href="#cb85-12" aria-hidden="true" tabindex="-1"></a><span class="va">$Name</span> <span class="op">=</span> <span class="va">$S</span><span class="op">.</span><span class="fu">Name</span></span>
<span id="cb85-13"><a href="#cb85-13" aria-hidden="true" tabindex="-1"></a><span class="va">$DName</span> <span class="op">=</span> <span class="va">$S</span><span class="op">.</span><span class="fu">DisplayName</span></span>
<span id="cb85-14"><a href="#cb85-14" aria-hidden="true" tabindex="-1"></a><span class="va">$Status</span> <span class="op">=</span> <span class="va">$S</span><span class="op">.</span><span class="fu">Status</span></span>
<span id="cb85-15"><a href="#cb85-15" aria-hidden="true" tabindex="-1"></a>Invoke-MySQLiteQuery <span class="op">-</span>Path <span class="va">$path</span> <span class="op">-</span>Query <span class="st">&quot;INSERT INTO Service (Name, DisplayName, Status) VALUES (&#39;</span><span class="va">$Name</span><span class="st">&#39;, &#39;</span><span class="va">$DName</span><span class="st">&#39;, &#39;</span><span class="va">$Status</span><span class="st">&#39;);&quot;</span></span>
<span id="cb85-16"><a href="#cb85-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>(Get-MySQLiteDB $path).Tables</code> список таблиц в базе<br />
<code>Invoke-MySQLiteQuery -Path $path -Query "SELECT name FROM sqlite_master WHERE type='table';"</code>
список таблиц в базе<br />
<code>Invoke-MySQLiteQuery -Path $path -Query "DROP TABLE Service;"</code>
удалить таблицу</p>
<div class="sourceCode" id="cb86"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb86-1"><a href="#cb86-1" aria-hidden="true" tabindex="-1"></a><span class="va">$TableName</span> <span class="op">=</span> <span class="st">&quot;Service&quot;</span></span>
<span id="cb86-2"><a href="#cb86-2" aria-hidden="true" tabindex="-1"></a>Invoke-MySQLiteQuery <span class="op">-</span>Path <span class="va">$path</span> <span class="op">-</span>Query <span class="st">&quot;SELECT * FROM </span><span class="va">$TableName</span><span class="st">&quot;</span> <span class="co"># прочитать содержимое таблицы (в формате объекта)</span></span></code></pre></div>
<p><code>Get-Service | select Name,DisplayName,Status | ConvertTo-MySQLiteDB -Path $path -TableName Service -force</code>
конвертировать объект в таблицу</p>
<h3 id="database-password">Database password</h3>
<div class="sourceCode" id="cb87"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb87-1"><a href="#cb87-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span> <span class="op">=</span> New-SQLiteConnection <span class="op">-</span>DataSource <span class="va">$path</span></span>
<span id="cb87-2"><a href="#cb87-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span><span class="op">.</span><span class="fu">ChangePassword</span><span class="op">(</span><span class="st">&quot;password&quot;</span><span class="op">)</span></span>
<span id="cb87-3"><a href="#cb87-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
<span id="cb87-4"><a href="#cb87-4" aria-hidden="true" tabindex="-1"></a>Invoke-SqliteQuery <span class="op">-</span>Query <span class="st">&quot;SELECT * FROM Service&quot;</span> <span class="op">-</span>DataSource <span class="st">&quot;</span><span class="va">$path</span><span class="st">;Password=password&quot;</span></span></code></pre></div>
<h1 id="mysql">MySQL</h1>
<p><code>apt -y install mysql-server mysql-client</code><br />
<code>mysql -V</code><br />
<code>systemctl status mysql</code><br />
<code>mysqladmin -u root password</code> задать пароль root</p>
<p><code>nano /etc/mysql/mysql.conf.d/mysqld.cnf</code></p>
<pre><code>[mysqld]
user = mysql
# pid-file = /var/run/mysqld/mysqld.pid
# socket = /var/run/mysqld/mysqld.sock
# port = 3306
# datadir = /var/lib/mysql
# tmpdir = /tmp
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
log_error = /var/log/mysql/error.log</code></pre>
<p><code>systemctl restart mysql</code><br />
<code>ss -tulnp | grep 3306</code><br />
<code>ufw allow 3306/tcp</code><br />
<code>nc -zv 192.168.1.253 3306</code><br />
<code>tnc 192.168.1.253 -p 3306</code></p>
<p><code>mysql -u root -p</code><br />
<code>SELECT user(), now(), version();</code><br />
<code>quit;</code></p>
<p><code>mysql -u root -p -e 'SHOW TABLES FROM db_aduser;'</code>
отобразить список таблиц без подключения к консоли MySQL</p>
<p><code>CREATE</code> создать БД, пользователя, таблицу<br />
<code>ALTER</code> управление столбцами таблице<br />
<code>DROP</code> удалить БД, пользователя, таблицу<br />
<code>USE</code> выбрать БД<br />
<code>SHOW</code> вывесли список БД, прав доступа пользователя (GRANTS),
названия столбцов и их свойства<br />
<code>GRANT</code> дать доступ пользователю к БД<br />
<code>REVOKE</code> удалить доступ пользователя к БД<br />
<code>UPDATE</code> изменить права доступа, значения с таблице<br />
<code>FLUSH</code> обновить права доступа<br />
<code>SELECT</code> отобразить выбранную БД, вывести список
пользователей, выборка данных в таблице<br />
<code>INSERT</code> внести данные<br />
<code>DELETE</code> удалить данные в (FROM) таблице</p>
<h3 id="data-type">DATA TYPE</h3>
<p><code>VARCHAR(N)</code> строка переменной длины, в формате ASCII, где
один символ занимает 1 байт, числом N указывается максимальная возможная
длина строки<br />
<code>NVARCHAR(N)</code> строка переменной длины, в формате Unicode, где
один символ занимает 2 байта<br />
<code>CHAR(N)/nchar(N)</code> строка фиксированной длины, которая всегда
дополняется справа пробелами до длины N и в базе данных она занимает
ровно N символов<br />
<code>INT</code> целое число, от -2147483648 до 2147483647, занимает 4
байта<br />
<code>FLOAT</code> число, в котором может присутствовать десятичная
точка (запятая)<br />
<code>BIT</code> флаг, Да - 1 или Нет - 0<br />
<code>DATE</code> формат даты, например 25.05.2023<br />
<code>TIME</code> 23:30:55.1234567<br />
<code>DATETIME</code> 25.05.2023 23:30:55.1234567</p>
<h3 id="database-1">DATABASE</h3>
<pre><code>SHOW databases; # вывести список БД
CREATE DATABASE db_aduser; # создать БД
CREATE DATABASE db_rep DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; # создать БД с кодировкой UTF-8
DROP DATABASE db_rep; # удалить БД
USE db_aduser; # выбрать/переключиться на выбранную БД
SELECT database(); # отобразить выбранную БД</code></pre>
<h3 id="user">USER</h3>
<pre><code>SELECT USER,HOST FROM mysql.user; # вывести список УЗ
CREATE USER posh@localhost IDENTIFIED BY &#39;1qaz!QAZ&#39;; # создать УЗ, которая будет подключаться с локального сервера
CREATE USER posh@localhost IDENTIFIED BY &#39;1qaz!QAZ&#39;; # создать УЗ, которая будет подключаться с указанного сервера
CREATE USER posh@&#39;192.168.3.99&#39; IDENTIFIED BY &#39;1qaz!QAZ&#39;; # УЗ для доступа с конкретного сервера
CREATE USER &#39;admin&#39;@&#39;%&#39; IDENTIFIED BY &#39;Admin12#&#39;; # УЗ для доступа с любого сервера (% - wildcard)
DROP USER posh@localhost; # удалить пользователя
SHOW GRANTS FOR posh@&#39;%&#39;; # отобразить права доступа пользователя
GRANT ALL PRIVILEGES ON db_aduser.* TO posh@&#39;192.168.3.99&#39;; # полный доступ для posh к БД db_aduser
GRANT ALL PRIVILEGES ON *.* TO posh@&#39;%&#39;; # доступ к всем БД c любого клиентского хоста
GRANT SELECT,DELETE ON mysql.* TO posh@&#39;%&#39;; # права SELECT и DELETE на встроенную БД mysql
REVOKE DELETE ON mysql.* FROM posh@&#39;%&#39;; # удалить доступ DELETE
UPDATE mysql.user SET super_priv=&#39;Y&#39; WHERE USER=&#39;posh&#39; AND host=&#39;%&#39;; # изменить привелегии для пользователя
SELECT USER,HOST,super_priv FROM mysql.user; # список УЗ и таблица с правами SUPER privilege
FLUSH PRIVILEGES; # обновить права доступа</code></pre>
<h3 id="table">TABLE</h3>
<pre><code>SHOW TABLES; # отобразить список всех таблиц
SHOW TABLES LIKE &#39;%user&#39;; # поиск таблицы по wildcard-имени
CREATE TABLE table_aduser (id INT NOT NULL AUTO_INCREMENT, Name VARCHAR(100), email VARCHAR(100), PRIMARY KEY (ID)); # создать таблицу
DROP TABLE table_aduser; # удалить таблицу</code></pre>
<h3 id="column">COLUMN</h3>
<pre><code>SHOW COLUMNS FROM table_aduser; # отобразить название стобцов и их свойства
ALTER TABLE table_aduser DROP COLUMN id; # удалить столбец id
ALTER TABLE table_aduser ADD COLUMN info VARCHAR(10); # добавить столбец info
ALTER TABLE table_aduser CHANGE info new_info VARCHAR(100); # изменить имя столбца info на new_info и его тип данных
ALTER TABLE table_aduser ADD COLUMN (id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (ID)); # добавить столбец id</code></pre>
<h3 id="insert">INSERT</h3>
<pre><code>INSERT table_aduser (Name,email) VALUES (&#39;Alex&#39;,&#39;no-email&#39;);
INSERT table_aduser (Name,email) VALUES (&#39;Alex&#39;,&#39;no-email&#39;);
INSERT table_aduser (Name) VALUES (&#39;Support&#39;);
INSERT table_aduser (Name) VALUES (&#39;Jack&#39;);</code></pre>
<h3 id="select">SELECT</h3>
<pre><code>SELECT * FROM table_aduser; # содержимое всех стобцов в выбранной (FROM) таблице
SELECT Name,email FROM table_aduser; # содержимое указанных стобцов
SELECT DISTINCT Name,Email FROM table_aduser; # отобразить уникальные записи (без повторений)
SELECT * FROM table_aduser ORDER BY Name; # отсортировать по Name
SELECT * FROM table_aduser ORDER BY Name DESC; # обратная сортировка
SELECT COUNT(*) FROM table_aduser; # количество строк в таблице
SELECT COUNT(new_info) FROM table_aduser; # количество строк в столбце</code></pre>
<h3 id="where">WHERE</h3>
<pre><code>NOT; AND; OR # по приоритетам условий
SELECT * FROM table_aduser WHERE Name = &#39;Alex&#39;; # поиск по содержимому
SELECT * FROM table_aduser WHERE NOT Name != &#39;Alex&#39;; # условие NOT где Name не равен значению
SELECT * FROM table_aduser WHERE email != &#39;&#39;; # вывести строки, где содержимое email не рано null
SELECT * FROM table_aduser WHERE email != &#39;&#39; OR id &gt; 1000; # или id выше 1000
SELECT * FROM table_aduser WHERE Name RLIKE &quot;support&quot;; # регистронезависемый (RLIKE) поиск
SELECT * FROM table_aduser WHERE Name RLIKE &quot;^support&quot;; # начинаются только с этого словосочетания</code></pre>
<h3 id="delete">DELETE</h3>
<pre><code>SELECT * FROM table_aduser WHERE Name RLIKE &quot;alex&quot;; # найти и проверить значения перед удалением
DELETE FROM table_aduser WHERE Name RLIKE &quot;alex&quot;; # Query OK, 2 rows affected # удалено две строки
DELETE FROM table_aduser; # удалить ВСЕ значения</code></pre>
<h3 id="update">UPDATE</h3>
<pre><code>SELECT * FROM table_aduser WHERE Name = &#39;Jack&#39;; # найти и проверить значение перед изменением
UPDATE table_aduser SET Name = &#39;Alex&#39; WHERE Name = &#39;Jack&#39;; # изменить значение &#39;Jack&#39; на &#39;Alex&#39;
UPDATE db_aduser.table_aduser SET Name=&#39;BCA&#39; WHERE id=1; # изменить значение в строке с ID 1</code></pre>
<h3 id="check">CHECK</h3>
<pre><code>CHECK TABLE db_aduser.table_aduser; # проверить
ANALYZE TABLE db_aduser.table_aduser; # анализировать
OPTIMIZE TABLE db_aduser.table_aduser; # оптимизировать
REPAIR TABLE db_aduser.table_aduser; # восстановить
TRUNCATE TABLE db_aduser.table_aduser; # очистить</code></pre>
<h3 id="dump">DUMP</h3>
<pre><code>mysqldump -u root -p --databases db_aduser &gt; /bak/db_aduser.sql
mysql -u root -p db_aduser &lt; /bak/db_aduser.sql
crontab -e
00 22 * * * /usr/bin/mysqldump -uroot -p1qaz!QAZ db_zabbix | /bin/bzip2 &gt; `date +/dump/zabbix/zabbix-\%d-\%m-\%Y-\%H:\%M.bz2`
00 23 * * * /usr/bin/mysqldump -uroot -p1qaz!QAZ db_zabbix &gt; `date +/dump/smb/zabbix-\%d-\%m-\%Y-\%H:\%M.sql`
0 0 * * * find /dump/zabbix -mtime +7 -exec rm {} \;
mysqldump -u root --single-transaction db_zabbix &gt; /dump/zabbix/db_zabbix.sql
mysql -u user_zabbix -p -e &#39;CREATE DATABASE db_zabbix;&#39;
mysql -u user_zabbix -p db_zabbix &lt; /root/db_zabbix.sql</code></pre>
<h3 id="innodb_force_recovery">innodb_force_recovery</h3>
<pre><code>sed -i &#39;/innodb_force_recovery/d&#39; /etc/mysql/my.cnf # удалить
mode=6; sed -i &quot;/^\[mysqld\]/{N;s/$/\ninnodb_force_recovery=$mode/}&quot; /etc/mysql/my.cnf # добавить mode 6
systemctl restart mysql
[mysqld]
innodb_force_recovery=1 # сервер пытается начать работу независимо от того, есть ли поврежденные данные InnoDB или нет
innodb_force_recovery=2 # удается восстановить работу за счет остановки потока команд, которые были частично выполнены или не выполнены (не запускает фоновые операции)
innodb_force_recovery=3 # отменяет откат после восстановления поврежденных файлов (не пытается откатить транзакции)
innodb_force_recovery=6 # запуск СУБД в режиме read only</code></pre>
<h3 id="mysql-connector-net">MySQL Connector NET</h3>
<h3 id="add-aduser">Add-ADUser</h3>
<div class="sourceCode" id="cb101"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb101-1"><a href="#cb101-1" aria-hidden="true" tabindex="-1"></a><span class="va">$ip</span> <span class="op">=</span> <span class="st">&quot;192.168.1.253&quot;</span></span>
<span id="cb101-2"><a href="#cb101-2" aria-hidden="true" tabindex="-1"></a><span class="va">$user</span> <span class="op">=</span> <span class="st">&quot;posh&quot;</span></span>
<span id="cb101-3"><a href="#cb101-3" aria-hidden="true" tabindex="-1"></a><span class="va">$pass</span> <span class="op">=</span> <span class="st">&quot;1qaz!QAZ&quot;</span></span>
<span id="cb101-4"><a href="#cb101-4" aria-hidden="true" tabindex="-1"></a><span class="va">$db</span> <span class="op">=</span> <span class="st">&quot;db_aduser&quot;</span></span>
<span id="cb101-5"><a href="#cb101-5" aria-hidden="true" tabindex="-1"></a><span class="fu">Add-Type</span> Path <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Documents\MySQL-Connector-NET\8.0.31-4.8\MySql.Data.dll&quot;</span></span>
<span id="cb101-6"><a href="#cb101-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span> <span class="op">=</span> <span class="op">[</span>MySql<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">MySqlClient</span><span class="op">.</span><span class="fu">MySqlConnection</span><span class="op">]</span>@<span class="op">{</span></span>
<span id="cb101-7"><a href="#cb101-7" aria-hidden="true" tabindex="-1"></a>ConnectionString<span class="op">=</span><span class="st">&quot;server=</span><span class="va">$ip</span><span class="st">;uid=</span><span class="va">$user</span><span class="st">;pwd=</span><span class="va">$pass</span><span class="st">;database=</span><span class="va">$db</span><span class="st">&quot;</span></span>
<span id="cb101-8"><a href="#cb101-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb101-9"><a href="#cb101-9" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span><span class="op">.</span><span class="fu">Open</span><span class="op">()</span></span>
<span id="cb101-10"><a href="#cb101-10" aria-hidden="true" tabindex="-1"></a><span class="va">$Command</span> <span class="op">=</span> <span class="fu">New-Object</span> MySql<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">MySqlClient</span><span class="op">.</span><span class="fu">MySqlCommand</span></span>
<span id="cb101-11"><a href="#cb101-11" aria-hidden="true" tabindex="-1"></a><span class="va">$Command</span><span class="op">.</span><span class="fu">Connection</span> <span class="op">=</span> <span class="va">$Connection</span></span>
<span id="cb101-12"><a href="#cb101-12" aria-hidden="true" tabindex="-1"></a><span class="va">$UserList</span> <span class="op">=</span> <span class="fu">Get-ADUser</span> <span class="op">-</span>filter <span class="op">*</span> <span class="op">-</span>properties name<span class="op">,</span>EmailAddress</span>
<span id="cb101-13"><a href="#cb101-13" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$user</span> <span class="kw">in</span> <span class="va">$UserList</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb101-14"><a href="#cb101-14" aria-hidden="true" tabindex="-1"></a><span class="va">$uname</span><span class="op">=</span><span class="va">$user</span><span class="op">.</span><span class="fu">Name</span></span>
<span id="cb101-15"><a href="#cb101-15" aria-hidden="true" tabindex="-1"></a><span class="va">$uemail</span><span class="op">=</span><span class="va">$user</span><span class="op">.</span><span class="fu">EmailAddress</span></span>
<span id="cb101-16"><a href="#cb101-16" aria-hidden="true" tabindex="-1"></a><span class="va">$Command</span><span class="op">.</span><span class="fu">CommandText</span> <span class="op">=</span> <span class="st">&quot;INSERT INTO table_aduser (Name,Email) VALUES (&#39;</span><span class="va">$uname</span><span class="st">&#39;,&#39;</span><span class="va">$uemail</span><span class="st">&#39;)&quot;</span></span>
<span id="cb101-17"><a href="#cb101-17" aria-hidden="true" tabindex="-1"></a><span class="va">$Command</span><span class="op">.</span><span class="fu">ExecuteNonQuery</span><span class="op">()</span></span>
<span id="cb101-18"><a href="#cb101-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb101-19"><a href="#cb101-19" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span></code></pre></div>
<h3 id="get-aduser">Get-ADUser</h3>
<div class="sourceCode" id="cb102"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb102-1"><a href="#cb102-1" aria-hidden="true" tabindex="-1"></a><span class="va">$ip</span> <span class="op">=</span> <span class="st">&quot;192.168.1.253&quot;</span></span>
<span id="cb102-2"><a href="#cb102-2" aria-hidden="true" tabindex="-1"></a><span class="va">$user</span> <span class="op">=</span> <span class="st">&quot;posh&quot;</span></span>
<span id="cb102-3"><a href="#cb102-3" aria-hidden="true" tabindex="-1"></a><span class="va">$pass</span> <span class="op">=</span> <span class="st">&quot;1qaz!QAZ&quot;</span></span>
<span id="cb102-4"><a href="#cb102-4" aria-hidden="true" tabindex="-1"></a><span class="va">$db</span> <span class="op">=</span> <span class="st">&quot;db_aduser&quot;</span></span>
<span id="cb102-5"><a href="#cb102-5" aria-hidden="true" tabindex="-1"></a><span class="fu">Add-Type</span> Path <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Documents\MySQL-Connector-NET\8.0.31-4.8\MySql.Data.dll&quot;</span></span>
<span id="cb102-6"><a href="#cb102-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span> <span class="op">=</span> <span class="op">[</span>MySql<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">MySqlClient</span><span class="op">.</span><span class="fu">MySqlConnection</span><span class="op">]</span>@<span class="op">{</span></span>
<span id="cb102-7"><a href="#cb102-7" aria-hidden="true" tabindex="-1"></a>ConnectionString <span class="op">=</span> <span class="st">&quot;server=</span><span class="va">$ip</span><span class="st">;uid=</span><span class="va">$user</span><span class="st">;pwd=</span><span class="va">$pass</span><span class="st">;database=</span><span class="va">$db</span><span class="st">&quot;</span></span>
<span id="cb102-8"><a href="#cb102-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb102-9"><a href="#cb102-9" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span><span class="op">.</span><span class="fu">Open</span><span class="op">()</span></span>
<span id="cb102-10"><a href="#cb102-10" aria-hidden="true" tabindex="-1"></a><span class="va">$Command</span> <span class="op">=</span> <span class="fu">New-Object</span> MySql<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">MySqlClient</span><span class="op">.</span><span class="fu">MySqlCommand</span></span>
<span id="cb102-11"><a href="#cb102-11" aria-hidden="true" tabindex="-1"></a><span class="va">$Command</span><span class="op">.</span><span class="fu">Connection</span> <span class="op">=</span> <span class="va">$Connection</span></span>
<span id="cb102-12"><a href="#cb102-12" aria-hidden="true" tabindex="-1"></a><span class="va">$MYSQLDataAdapter</span> <span class="op">=</span> <span class="fu">New-Object</span> MySql<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">MySqlClient</span><span class="op">.</span><span class="fu">MySqlDataAdapter</span></span>
<span id="cb102-13"><a href="#cb102-13" aria-hidden="true" tabindex="-1"></a><span class="va">$MYSQLDataSet</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">DataSet</span></span>
<span id="cb102-14"><a href="#cb102-14" aria-hidden="true" tabindex="-1"></a><span class="va">$Command</span><span class="op">.</span><span class="fu">CommandText</span> <span class="op">=</span> <span class="st">&quot;SELECT * FROM table_aduser&quot;</span></span>
<span id="cb102-15"><a href="#cb102-15" aria-hidden="true" tabindex="-1"></a><span class="va">$MYSQLDataAdapter</span><span class="op">.</span><span class="fu">SelectCommand</span> <span class="op">=</span> <span class="va">$Command</span></span>
<span id="cb102-16"><a href="#cb102-16" aria-hidden="true" tabindex="-1"></a><span class="va">$NumberOfDataSets</span> <span class="op">=</span> <span class="va">$MYSQLDataAdapter</span><span class="op">.</span><span class="fu">Fill</span><span class="op">(</span><span class="va">$MYSQLDataSet</span><span class="op">,</span> <span class="st">&quot;data&quot;</span><span class="op">)</span></span>
<span id="cb102-17"><a href="#cb102-17" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Collections</span><span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>System<span class="op">.</span><span class="fu">Object</span><span class="op">]</span></span>
<span id="cb102-18"><a href="#cb102-18" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span><span class="op">(</span><span class="va">$DataSet</span> <span class="kw">in</span> <span class="va">$MYSQLDataSet</span><span class="op">.</span><span class="fu">tables</span><span class="op">[</span><span class="dv">0</span><span class="op">])</span> <span class="op">{</span></span>
<span id="cb102-19"><a href="#cb102-19" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span><span class="op">.</span><span class="fu">Add</span><span class="op">([</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
<span id="cb102-20"><a href="#cb102-20" aria-hidden="true" tabindex="-1"></a>Name <span class="op">=</span> <span class="va">$DataSet</span><span class="op">.</span><span class="fu">name</span><span class="op">;</span></span>
<span id="cb102-21"><a href="#cb102-21" aria-hidden="true" tabindex="-1"></a>Mail <span class="op">=</span> <span class="va">$DataSet</span><span class="op">.</span><span class="fu">email</span></span>
<span id="cb102-22"><a href="#cb102-22" aria-hidden="true" tabindex="-1"></a><span class="op">})</span></span>
<span id="cb102-23"><a href="#cb102-23" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb102-24"><a href="#cb102-24" aria-hidden="true" tabindex="-1"></a><span class="va">$Connection</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
<span id="cb102-25"><a href="#cb102-25" aria-hidden="true" tabindex="-1"></a><span class="va">$Collections</span></span></code></pre></div>
<h1 id="mssql">MSSQL</h1>
<p><code>wget -qO- https://packages.microsoft.com/keys/microsoft.asc | apt-key add -</code>
импортировать GPG-ключ для репозитория<br />
<code>https://packages.microsoft.com/config/ubuntu/</code> выбрать
репозиторий и скопировать URL<br />
<code>add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2019.list)"</code><br />
<code>apt-get update</code> обновить список пакетов<br />
<code>apt-get install mssql-server</code><br />
<code>/opt/mssql/bin/mssql-conf setup</code> скрипт начальной
конфигурации (выбрать редакцию, 3 - express и русский язык 9 из
11)<br />
<code>systemctl status mssql-server</code><br />
<code>curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -</code>
установить клиент<br />
<code>curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | tee /etc/apt/sources.list.d/msprod.list</code><br />
<code>apt-get update</code><br />
<code>apt-get install mssql-tools</code><br />
<code>echo 'export PATH="$PATH:/opt/mssql-tools/bin"' &gt;&gt; ~/.bashrc</code>
добавить в домашний каталог файла bashrc, что бы не писать путь к
исполняемому файлу<br />
<code>export PATH="$PATH:/opt/mssql-tools/bin"</code><br />
<code>iptables -I INPUT 1 -p tcp --dport 1433 -j ACCEPT</code></p>
<pre><code>sqlcmd -S localhost -U SA
CREATE DATABASE itinvent
go
SELECT name FROM master.dbo.sysdatabases
go</code></pre>
<h3 id="system.data.sqlclient">System.Data.SqlClient</h3>
<div class="sourceCode" id="cb104"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb104-1"><a href="#cb104-1" aria-hidden="true" tabindex="-1"></a><span class="va">$user</span> <span class="op">=</span> <span class="st">&quot;itinvent&quot;</span></span>
<span id="cb104-2"><a href="#cb104-2" aria-hidden="true" tabindex="-1"></a><span class="va">$pass</span> <span class="op">=</span> <span class="st">&quot;itinvent&quot;</span></span>
<span id="cb104-3"><a href="#cb104-3" aria-hidden="true" tabindex="-1"></a><span class="va">$db</span> <span class="op">=</span> <span class="st">&quot;itinvent&quot;</span></span>
<span id="cb104-4"><a href="#cb104-4" aria-hidden="true" tabindex="-1"></a><span class="va">$srv</span> <span class="op">=</span> <span class="st">&quot;192.168.3.103&quot;</span></span>
<span id="cb104-5"><a href="#cb104-5" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlConnection</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">SqlClient</span><span class="op">.</span><span class="fu">SqlConnection</span></span>
<span id="cb104-6"><a href="#cb104-6" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlConnection</span><span class="op">.</span><span class="fu">ConnectionString</span> <span class="op">=</span> <span class="st">&quot;server=</span><span class="va">$srv</span><span class="st">;database=</span><span class="va">$db</span><span class="st">;user id=</span><span class="va">$user</span><span class="st">;password=</span><span class="va">$pass</span><span class="st">;Integrated Security=false&quot;</span></span>
<span id="cb104-7"><a href="#cb104-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb104-8"><a href="#cb104-8" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlCommand</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">SqlClient</span><span class="op">.</span><span class="fu">SqlCommand</span><span class="ch">` </span>класс формата команды</span>
<span id="cb104-9"><a href="#cb104-9" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlCommand</span><span class="op">.</span><span class="fu">CommandText</span> <span class="op">=</span> <span class="st">&quot;SELECT * FROM ITINVENT.dbo.USERS&quot;</span><span class="ch">` </span>отобразить содержимое таблицы</span>
<span id="cb104-10"><a href="#cb104-10" aria-hidden="true" tabindex="-1"></a><span class="co">#$SqlCommand.CommandText = &quot;SELECT LICENCE_DATE,DESCR,MODEL_NO,TYPE_NO FROM ITINVENT.dbo.ITEMS where LICENCE_DATE IS NOT NULL&quot;</span></span>
<span id="cb104-11"><a href="#cb104-11" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlCommand</span><span class="op">.</span><span class="fu">Connection</span> <span class="op">=</span> <span class="va">$SqlConnection</span><span class="ch">` </span>передать формат подключения</span>
<span id="cb104-12"><a href="#cb104-12" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlAdapter</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">SqlClient</span><span class="op">.</span><span class="fu">SqlDataAdapter</span><span class="ch">` </span>создать адаптер подключения для выполнения <span class="fu">SELECT</span> запросов к БД</span>
<span id="cb104-13"><a href="#cb104-13" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlAdapter</span><span class="op">.</span><span class="fu">SelectCommand</span> <span class="op">=</span> <span class="va">$SqlCommand</span><span class="ch">` </span>передать команду</span>
<span id="cb104-14"><a href="#cb104-14" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb104-15"><a href="#cb104-15" aria-hidden="true" tabindex="-1"></a><span class="va">$DataSet</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">DataSet</span><span class="ch">` </span>создать объект приема данных формата XML</span>
<span id="cb104-16"><a href="#cb104-16" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlAdapter</span><span class="op">.</span><span class="fu">Fill</span><span class="op">(</span><span class="va">$DataSet</span><span class="op">)</span><span class="ch">` </span>заполнить данными полученные от адаптера <span class="op">(</span>возвращает кол-во объектов<span class="op">)</span></span>
<span id="cb104-17"><a href="#cb104-17" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlConnection</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
<span id="cb104-18"><a href="#cb104-18" aria-hidden="true" tabindex="-1"></a><span class="va">$Data</span> <span class="op">=</span> <span class="va">$DataSet</span><span class="op">.</span><span class="fu">Tables</span></span>
<span id="cb104-19"><a href="#cb104-19" aria-hidden="true" tabindex="-1"></a><span class="va">$Data</span><span class="op">[</span><span class="dv">0</span><span class="op">]</span> <span class="op">|</span> <span class="fu">ft</span></span></code></pre></div>
<h3 id="sqlclient-insert">SqlClient INSERT</h3>
<div class="sourceCode" id="cb105"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb105-1"><a href="#cb105-1" aria-hidden="true" tabindex="-1"></a><span class="va">$user</span> <span class="op">=</span> <span class="st">&quot;itinvent&quot;</span></span>
<span id="cb105-2"><a href="#cb105-2" aria-hidden="true" tabindex="-1"></a><span class="va">$pass</span> <span class="op">=</span> <span class="st">&quot;itinvent&quot;</span></span>
<span id="cb105-3"><a href="#cb105-3" aria-hidden="true" tabindex="-1"></a><span class="va">$db</span> <span class="op">=</span> <span class="st">&quot;db_test&quot;</span></span>
<span id="cb105-4"><a href="#cb105-4" aria-hidden="true" tabindex="-1"></a><span class="va">$srv</span> <span class="op">=</span> <span class="st">&quot;192.168.3.103&quot;</span></span>
<span id="cb105-5"><a href="#cb105-5" aria-hidden="true" tabindex="-1"></a><span class="va">$sql</span> <span class="op">=</span> <span class="st">&quot;INSERT INTO table_test (column_user) VALUES (&#39;lifailon&#39;)&quot;</span><span class="ch">` </span>добавить данные в таблицу table_test в колонку column_user</span>
<span id="cb105-6"><a href="#cb105-6" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlConnection</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">SqlClient</span><span class="op">.</span><span class="fu">SqlConnection</span></span>
<span id="cb105-7"><a href="#cb105-7" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlConnection</span><span class="op">.</span><span class="fu">ConnectionString</span> <span class="op">=</span> <span class="st">&quot;server=</span><span class="va">$srv</span><span class="st">;database=</span><span class="va">$db</span><span class="st">;user id=</span><span class="va">$user</span><span class="st">;password=</span><span class="va">$pass</span><span class="st">;Integrated Security=false&quot;</span></span>
<span id="cb105-8"><a href="#cb105-8" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlCommand</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">SqlClient</span><span class="op">.</span><span class="fu">SqlCommand</span></span>
<span id="cb105-9"><a href="#cb105-9" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlCommand</span><span class="op">.</span><span class="fu">CommandText</span> <span class="op">=</span> <span class="va">$sql</span></span>
<span id="cb105-10"><a href="#cb105-10" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlCommand</span><span class="op">.</span><span class="fu">Connection</span> <span class="op">=</span> <span class="va">$SqlConnection</span></span>
<span id="cb105-11"><a href="#cb105-11" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlConnection</span><span class="op">.</span><span class="fu">Open</span><span class="op">()</span></span>
<span id="cb105-12"><a href="#cb105-12" aria-hidden="true" tabindex="-1"></a><span class="va">$rowsAffected</span> <span class="op">=</span> <span class="va">$SqlCommand</span><span class="op">.</span><span class="fu">ExecuteNonQuery</span><span class="op">();</span><span class="ch">` </span>для запросов INSERT<span class="op">/</span>UPDATE<span class="op">/</span>DELETE не используется SqlDataAdapter</span>
<span id="cb105-13"><a href="#cb105-13" aria-hidden="true" tabindex="-1"></a><span class="va">$SqlConnection</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span></code></pre></div>
<h3 id="ssms-insert">SSMS INSERT</h3>
<pre><code>USE [db_test]
GO
INSERT INTO [dbo].[table_test]
([column_user])
VALUES
(&#39;lifailon&#39;)
GO
SELECT TOP (1000) [column_user]
FROM [db_test].[dbo].[table_test]</code></pre>
<h3 id="t-sql">T-SQL</h3>
<ul>
<li><p>DDL (Data Definition Language / Язык определения данных). К этому
типу относятся команды, которые создают базу данных, таблицы, индексы,
хранимые процедуры.<br />
<code>CREATE</code> создает объекты базы данных (саму базу даных,
таблицы, индексы и т.д.)<br />
<code>ALTER</code> изменяет объекты базы данных<br />
<code>DROP</code> удаляет объекты базы данных<br />
<code>TRUNCATE</code> удаляет все данные из таблиц</p></li>
<li><p>DML (Data Manipulation Language / Язык манипуляции данными). К
этому типу относят команды по выбору, обновлению, добавлению и удалению
данных.<br />
<code>SELECT</code> извлекает данные из БД<br />
<code>UPDATE</code> обновляет данные<br />
<code>INSERT</code> добавляет новые данные<br />
<code>DELETE</code> удаляет данные</p></li>
<li><p>DCL (Data Control Language / Язык управления доступа к данным). К
этому типу относят команды, которые управляют правами по доступу к
данным.<br />
<code>GRANT</code> предоставляет права для доступа к данным<br />
<code>REVOKE</code> отзывает права на доступ к данным</p></li>
</ul>
<pre><code>-- Переменные
DECLARE @text NVARCHAR(20), @int INT;
SET @text=&#39;Test&#39;;
SET @int = 21;
select @text,@int
-- Имена сервера и экземпляра
Select @@SERVERNAME as [Server\Instance];
-- версия SQL Server
Select @@VERSION as SQLServerVersion;
-- Текущая БД (БД, в контексте которой выполняется запрос)
Select DB_NAME() AS CurrentDB_Name;
-- Время работы с момента запуска сервера
SELECT @@Servername AS ServerName ,
create_date AS ServerStarted ,
DATEDIFF(s, create_date, GETDATE()) / 86400.0 AS DaysRunning ,
DATEDIFF(s, create_date, GETDATE()) AS SecondsRunnig
FROM sys.databases
WHERE name = &#39;tempdb&#39;;
-- Количество активных соединений
SELECT @@Servername AS Server ,
DB_NAME(database_id) AS DatabaseName ,
COUNT(database_id) AS Connections ,
Login_name AS LoginName ,
MIN(Login_Time) AS Login_Time ,
MIN(COALESCE(last_request_end_time, last_request_start_time))
AS Last_Batch
FROM sys.dm_exec_sessions
WHERE database_id &gt; 0
AND DB_NAME(database_id) NOT IN ( &#39;master&#39;, &#39;msdb&#39; )
GROUP BY database_id ,
login_name
ORDER BY DatabaseName;
-- Статус Backup
SELECT @@Servername AS ServerName ,
d.Name AS DBName ,
MAX(b.backup_finish_date) AS LastBackupCompleted
FROM sys.databases d
LEFT OUTER JOIN msdb..backupset b
ON b.database_name = d.name
AND b.[type] = &#39;D&#39;
GROUP BY d.Name
ORDER BY d.Name;
-- Путь к Backup
SELECT @@Servername AS ServerName ,
d.Name AS DBName ,
b.Backup_finish_date ,
bmf.Physical_Device_name
FROM sys.databases d
INNER JOIN msdb..backupset b ON b.database_name = d.name
AND b.[type] = &#39;D&#39;
INNER JOIN msdb.dbo.backupmediafamily bmf ON b.media_set_id = bmf.media_set_id
ORDER BY d.NAME ,
b.Backup_finish_date DESC;
-- Вывести список всех БД, модели восстановления и путь к mdf/ldf
EXEC sp_helpdb;
SELECT @@SERVERNAME AS Server ,
d.name AS DBName ,
create_date ,
recovery_model_Desc AS RecoveryModel ,
m.physical_name AS FileName
FROM sys.databases d
JOIN sys.master_files m ON d.database_id = m.database_id
ORDER BY d.name;
-- Размер БД
with fs
as
(
select database_id, type, size * 8.0 / 1024 size
from sys.master_files
)
select
name,
(select sum(size) from fs where type = 0 and fs.database_id = db.database_id) DataFileSizeMB,
(select sum(size) from fs where type = 1 and fs.database_id = db.database_id) LogFileSizeMB
from sys.databases
-- Поиск таблицы по маске имени (вывод: названия схемы где распологается объект, тип объекта, дата создания и последней модификации):
select [object_id], [schema_id],
schema_name([schema_id]) as [schema_name],
[name],
[type],
[type_desc],
[create_date],
[modify_date]
from sys.all_objects
-- where [name]=&#39;INVENT&#39;;
where [name] like &#39;%INVENT%&#39;;
-- Кол-во строк в таблицах
SELECT @@ServerName AS Server ,
DB_NAME() AS DBName ,
OBJECT_SCHEMA_NAME(p.object_id) AS SchemaName ,
OBJECT_NAME(p.object_id) AS TableName ,
i.Type_Desc ,
i.Name AS IndexUsedForCounts ,
SUM(p.Rows) AS Rows
FROM sys.partitions p
JOIN sys.indexes i ON i.object_id = p.object_id
AND i.index_id = p.index_id
WHERE i.type_desc IN ( &#39;CLUSTERED&#39;, &#39;HEAP&#39; )
-- This is key (1 index per table)
AND OBJECT_SCHEMA_NAME(p.object_id) &lt;&gt; &#39;sys&#39;
GROUP BY p.object_id ,
i.type_desc ,
i.Name
ORDER BY SchemaName ,
TableName;
-- Найти строковое (nvarchar) значение 2023 по всем таблицам базы данных
-- Отображается в какой таблице и столбце хранится значение, а также количество найденных пары таблица-колонка
set nocount on
declare @name varchar(128), @substr nvarchar(4000), @column varchar(128)
set @substr = &#39;%2023%&#39;
declare @sql nvarchar(max);
create table`rslt
(table_name varchar(128), field_name varchar(128), [value] nvarchar(max))
declare s cursor for select table_name as table_name from information_schema.tables where table_type = &#39;BASE TABLE&#39; order by table_name
open s
fetch next from s into @name
while @@fetch_status = 0
begin
declare c cursor for
select quotename(column_name) as column_name from information_schema.columns
where data_type in (&#39;text&#39;, &#39;ntext&#39;, &#39;varchar&#39;, &#39;char&#39;, &#39;nvarchar&#39;, &#39;char&#39;, &#39;sysname&#39;, &#39;int&#39;, &#39;tinyint&#39;) and table_name = @name
set @name = quotename(@name)
open c
fetch next from c into @column
while @@fetch_status = 0
begin
--print &#39;Processing table - &#39; + @name + &#39;, column - &#39; + @column
set @sql=&#39;insert into`rslt select &#39;&#39;&#39; + @name + &#39;&#39;&#39; as Table_name, &#39;&#39;&#39; + @column + &#39;&#39;&#39;, cast(&#39; + @column +
&#39; as nvarchar(max)) from&#39; + @name + &#39; where cast(&#39; + @column + &#39; as nvarchar(max)) like &#39;&#39;&#39; + @substr + &#39;&#39;&#39;&#39;;
print @sql;
exec(@sql);
fetch next from c into @column;
end
close c
deallocate c
fetch next from s into @name
end
select table_name as [Table Name], field_name as [Field Name], count(*) as [Found Mathes] from`rslt
group by table_name, field_name
order by table_name, field_name
drop table`rslt
close s
deallocate s
-- Поиск в таблице [CI_HISTORY] и столбцу [HIST_ID]:
SELECT * FROM ITINVENT.dbo.CI_HISTORY where [HIST_ID] like &#39;%2023%&#39;;
-- Узнать фрагментацию индексов
DECLARE @db_id SMALLINT;
SET @db_id = DB_ID(N&#39;itinvent&#39;);
IF @db_id IS NULL
BEGIN;
PRINT N&#39;Неправильное имя базы&#39;;
END;
ELSE
BEGIN;
SELECT
object_id AS [ID объекта],
index_id AS [ID индекса],
index_type_desc AS [Тип индекса],
avg_fragmentation_in_percent AS [Фрагментация в %]
FROM sys.dm_db_index_physical_stats(@db_id, NULL, NULL, NULL , &#39;LIMITED&#39;)
ORDER BY [avg_fragmentation_in_percent] DESC;
END;
GO
-- TempDB
-- Initial size - начальный/минимальный размер БД (1024 MB)
-- Autogrowh - прирост (512MB)
-- По умолчанию tempdb настроена на авто-расширение (Autogrow) и при каждой перезагрузке SQL Server пересоздаёт файлы этой БД с минимальным размером инициализации.
-- Увеличив размер инициализации файлов tempdb, можно свести к минимуму затраты системных ресурсов на операции авто-расширения.
-- Изменить путь к БД:
USE master;
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = &#39;F:\tempdb.mdf&#39;);
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp2, FILENAME = &#39;F:\tempdb_mssql_2.ndf&#39;);
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp3, FILENAME = &#39;F:\tempdb_mssql_3.ndf&#39;);
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp4, FILENAME = &#39;F:\tempdb_mssql_4.ndf&#39;);
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp5, FILENAME = &#39;F:\tempdb_mssql_5.ndf&#39;);
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp6, FILENAME = &#39;F:\tempdb_mssql_6.ndf&#39;);
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp7, FILENAME = &#39;F:\tempdb_mssql_7.ndf&#39;);
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp8, FILENAME = &#39;F:\tempdb_mssql_8.ndf&#39;);
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = &#39;F:\templog.ldf&#39;);
GO
-- Указать размер файла:
MODIFY FILE (NAME = temp2, FILENAME = &#39;F:\tempdb_mssql_2.ndf&#39; , SIZE = 1048576KB , FILEGROWTH = 524288KB);</code></pre>
<h3 id="тип-резервной-копии">Тип резервной копии</h3>
<ul>
<li>Full (Полная копия). Когда стартует полное резервирование,
записывается Log Sequence Number (LSN - последовательный номер журнала),
а так же LSN записывается и при завершении полного резервирования. Этот
LSN является механизмом, используемым SQL Server, чтобы знать, в каком
порядке выполнялись операторы INSERT, UPDATE или DELETE. При этом
наличие записанных LSN начала и окончания, как части полного бэкапа,
обеспечивает согласованное с точки зрения транзакций резервное
копирование, поскольку при полном резервном копировании учитываются
изменения, произошедшие во время резервного копирования. Это
обеспечивает обработку таких транзакций в процессе восстановления
бэкапа.</li>
<li>Differential (дифференциальная/разностная копия). Хранит данных,
изменившиеся с момента последней Полной резервной копии. При
восстановлении нужно сначала восстановить Полную резервную копию в
режиме NORECOVERY, потом можно применить любую из последующих Разностных
копий, без предыдущей Полной резервной копии Разностная копия
бесполезна. Каждая последующая Разностная копия будет хранить все
данные, входящие в предыдущую Разностную резервную копию, сделанную
после предыдущей Полной копии.</li>
<li>Incremental (инкрементальная/копия журналов транзакций). Резервное
копирования журнала транзакций копирует все транзакции, которые
произошли с момента последнего резервного копирования, а затем урезает
журнал транзакций для освобождения дискового пространства. Транзакции
происходят в определенном порядке (LSN), бэкап журнала поддерживает этот
порядок транзакций. Бэкапы журналов транзакций должны восстанавливаться
по порядку. Для восстановления базы данных потребуется вся цепочка
резервных копий: полная и все последующие инкрементальные журнала
транзакций.</li>
</ul>
<h3 id="модели-восстановления">Модели восстановления</h3>
<ul>
<li>Simple (Простая). Хранится только необходимый для жизни остаток
журнала транзакций. Журнал транзакций (лог) автоматически очищается.
Создание резервных копий журнала транзакций невозможна, поэтому остается
самое ограниченное число опций по восстановлению. Недоступен функционал:
Always On, Point-In-Time восстановление, Резервные копии журнала
транзакций.</li>
<li>Full (Полная). Хранится журнал транзакций всех изменений в БД с
момента последнего резервного копирования журнала транзакций. Журнал
транзакций не будет очищаться до тех пор, пока не будет сделана
резервная копия журнала транзакций.</li>
<li>Bulk logged (С неполным протоколированием). Идентична Full, за
исключение: SELECT INTO, BULK INSERT и BCP, INSERT INTO SELECT, операции
с индексами (CREATE INDEX, ALTER INDEX REBUILD, DROP INDEX)</li>
</ul>
<h3 id="системные-бд">Системные БД</h3>
<ul>
<li>master. Хранятся все данные системного уровня (конфигурация системы,
сведенья об учетных записях входа, информация обо всех других базах
данных) для экземпляра SQL Server.</li>
<li>tempdb. Рабочее пространство для временных объектов, таких как
глобальные или локальные временные таблицы, временные хранимые
процедуры, табличные переменные и курсоры. Пересоздаётся при каждом
запуске SQL Server.</li>
<li>model. Используется в качестве шаблона для всех баз данных,
создаваемых в экземпляре SQL Server, все содержимое базы данных model,
включая параметры базы данных, копируется в создаваемую базу данных. Так
как база данных tempdb создается каждый раз при запуске SQL Server, база
данных model всегда должна существовать в системе SQL Server.</li>
<li>msdb. Используется агентом SQL Server для создания расписания
предупреждений (оператор) и выполнение заданий, а также другими
компонентами. SQL Server хранит полный журнал резервного копирования и
восстановления в базе данных msdb. Для отправки почты оператору
используется: USE [msdb].</li>
<li>resource. Доступная только для чтения база данных, которая содержит
все системные объекты, например sys.objects, физически хранятся в базе
данных resource, но логически присутствуют в схеме sys каждой базы
данных.</li>
</ul>
<h3 id="регламентные-операции">Регламентные операции</h3>
<ul>
<li>Проверка целостности базы данных</li>
</ul>
<p><code>DBCC CHECKDB</code></p>
<ul>
<li><p>Индексы. Индексы используются для быстрого поиска данных без
необходимости поиска/просмотра всех строк в таблице базы данных при
каждом обращении к таблице базы данных. Индекс ускоряет процесс запроса,
предоставляя быстрый доступ к строкам данных в таблице, аналогично тому,
как указатель в книге помогает вам быстро найти необходимую информацию.
Индексы предоставляют путь для быстрого поиска данных на основе значений
в этих столбцах. Для каждого индекса обязательно хранится его
статистика. MS SQL Server самостоятельно создает и изменяет индексы при
работе с базой. С течением времени данные в индексе становятся
фрагментированными, т.е. разбросанными по базе данных, что серьезно
снижает производительность запросов. Если фрагментация составляет от 5
до 30% (стандартно в задании 15%), то рекомендуется ее устранить с
помощью реорганизации, при фрагментации выше 30% (по умолчанию в задаче
&gt; 30% фрагментации и число страниц &gt; 1000) необходимо полное
перестроение индексов. После перестроения планово используется только
реорганизация.</p></li>
<li><p>Реорганизация (Reorganize) или дефрагментация индекса — это серия
небольших локальных перемещений страниц так, чтобы индекс не был
фрагментирован. После реорганизации статистика не обновляется. Во время
выполнения почти все данные доступны, пользователи смогут
работать.</p></li>
</ul>
<p><code>sp_msforeachtable N'DBCC INDEXDEFRAG (&lt;имя базы данных&gt;, ''?'')'</code></p>
<ul>
<li>Перестроение (Rebuild) индексов (или задача в мастере планов
обслуживания: Восстановить индекс) запускает процесс полного построения
индексов. В версии MS SQL Server Standard происходит отключение всех
клиентов от базы на время выполнения операции. После перестроения
обязательно обновляется статистика.</li>
</ul>
<p><code>sp_msforeachtable N'DBCC DBREINDEX (''?'')'</code></p>
<ul>
<li>Обновление статистики. Статистика — небольшая таблица (обычно до 200
строк), в которой хранится обобщенная информация о том, какие значения и
как часто встречаются в таблице. На основании статистики сервер
принимает решение, как лучше построить запрос. Когда происходят запросы
к БД (например, SELECT) вы получаете данные, но не описываете то, как
эти данные должны быть извлечены. В получении и обработке данных
помогает статистика. Во время выполнения процедуры обновления статистики
данные не блокируются.</li>
</ul>
<p><code>exec sp_msforeachtable N'UPDATE STATISTICS ? WITH FULLSCAN'</code></p>
<ul>
<li>Очистка процедурного кэша, выполняется после обновления статистики.
Оптимизатор MS SQL Server кэширует планы запросов для их повторного
выполнения. Это делается для того, чтобы экономить время, затрачиваемое
на компиляцию запроса в том случае, если такой же запрос уже выполнялся
и его план известен. После обновия статистики, не будет очищен
процедурный кэш, то SQL Server может выбрать старый (неоптимальный) план
запроса из кэша вместо того, чтобы построить новый (более оптимальный)
план.</li>
</ul>
<p><code>DBCC FREEPROCCACHE</code></p>
<h1 id="influxdb">InfluxDB</h1>
<p><a href="https://www.influxdata.com/downloads">Download InfluxDB 1.x
Open Source</a> <a
href="https://github.com/CymaticLabs/InfluxDBStudio">InfluxDB-Studio</a></p>
<h3 id="install-windows">Install Windows</h3>
<div class="sourceCode" id="cb108"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb108-1"><a href="#cb108-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> <span class="st">&quot;https://dl.influxdata.com/influxdb/releases/influxdb-1.8.10_windows_amd64.zip&quot;</span> <span class="op">-</span>OutFile <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Downloads\influxdb-1.8.10_windows_amd64.zip&quot;</span></span>
<span id="cb108-2"><a href="#cb108-2" aria-hidden="true" tabindex="-1"></a>Expand-Archive <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Downloads\influxdb-1.8.10_windows_amd64.zip&quot;</span> <span class="op">-</span>DestinationPath <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Documents\&quot;</span></span>
<span id="cb108-3"><a href="#cb108-3" aria-hidden="true" tabindex="-1"></a><span class="fu">Remove-Item</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Downloads\influxdb-1.8.10_windows_amd64.zip&quot;</span></span>
<span id="cb108-4"><a href="#cb108-4" aria-hidden="true" tabindex="-1"></a><span class="op">&amp;</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Downloads\influxdb-1.8.10-1\influxd.exe&quot;</span></span></code></pre></div>
<h3 id="install-ubuntu">Install Ubuntu</h3>
<div class="sourceCode" id="cb109"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb109-1"><a href="#cb109-1" aria-hidden="true" tabindex="-1"></a><span class="fu">wget</span> https://dl.influxdata.com/influxdb/releases/influxdb_1.8.10_amd64.deb</span>
<span id="cb109-2"><a href="#cb109-2" aria-hidden="true" tabindex="-1"></a><span class="fu">sudo</span> dpkg <span class="at">-i</span> influxdb_1.8.10_amd64.deb</span>
<span id="cb109-3"><a href="#cb109-3" aria-hidden="true" tabindex="-1"></a><span class="ex">systemctl</span> start influxdb</span>
<span id="cb109-4"><a href="#cb109-4" aria-hidden="true" tabindex="-1"></a><span class="ex">systemctl</span> status influxdb</span>
<span id="cb109-5"><a href="#cb109-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb109-6"><a href="#cb109-6" aria-hidden="true" tabindex="-1"></a><span class="fu">ps</span> aux <span class="kw">|</span> <span class="fu">grep</span> influxdb <span class="kw">|</span> <span class="fu">grep</span> <span class="at">-Ev</span> <span class="st">&quot;grep&quot;</span></span>
<span id="cb109-7"><a href="#cb109-7" aria-hidden="true" tabindex="-1"></a><span class="fu">netstat</span> <span class="at">-natpl</span> <span class="kw">|</span> <span class="fu">grep</span> 80<span class="pp">[</span><span class="ss">8</span><span class="pp">-</span><span class="ss">9</span><span class="pp">][</span><span class="ss">3</span><span class="pp">-</span><span class="ss">9</span><span class="pp">]</span></span></code></pre></div>
<h3 id="api">API</h3>
<div class="sourceCode" id="cb110"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb110-1"><a href="#cb110-1" aria-hidden="true" tabindex="-1"></a><span class="fu">nano</span> /etc/influxdb/influxdb.conf</span>
<span id="cb110-2"><a href="#cb110-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb110-3"><a href="#cb110-3" aria-hidden="true" tabindex="-1"></a><span class="ex">[http]</span></span>
<span id="cb110-4"><a href="#cb110-4" aria-hidden="true" tabindex="-1"></a> <span class="ex">enabled</span> = true</span>
<span id="cb110-5"><a href="#cb110-5" aria-hidden="true" tabindex="-1"></a> <span class="ex">bind-address</span> = <span class="st">&quot;:8086&quot;</span></span>
<span id="cb110-6"><a href="#cb110-6" aria-hidden="true" tabindex="-1"></a> <span class="ex">auth-enabled</span> = false</span>
<span id="cb110-7"><a href="#cb110-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb110-8"><a href="#cb110-8" aria-hidden="true" tabindex="-1"></a><span class="ex">systemctl</span> restart influxdb</span></code></pre></div>
<h3 id="chronograf">Chronograf</h3>
<pre><code>wget https://dl.influxdata.com/chronograf/releases/chronograf-1.10.2_windows_amd64.zip -UseBasicParsing -OutFile chronograf-1.10.2_windows_amd64.zip
Expand-Archive .\chronograf-1.10.2_windows_amd64.zip -DestinationPath &#39;C:\Program Files\InfluxData\chronograf\&#39;
wget https://dl.influxdata.com/chronograf/releases/chronograf_1.10.2_amd64.deb
sudo dpkg -i chronograf_1.10.2_amd64.deb
systemctl status influxdb
http://192.168.3.102:8888</code></pre>
<h3 id="grafana">Grafana</h3>
<p><a href="https://grafana.com/grafana/download">Download</a></p>
<p><code>invoke-RestMethod https://dl.grafana.com/enterprise/release/grafana-enterprise-10.3.1.windows-amd64.msi -OutFile "$home\Download\grafana.msi"</code></p>
<div class="sourceCode" id="cb112"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb112-1"><a href="#cb112-1" aria-hidden="true" tabindex="-1"></a><span class="ex">apt-get</span> install <span class="at">-y</span> adduser libfontconfig1 musl</span>
<span id="cb112-2"><a href="#cb112-2" aria-hidden="true" tabindex="-1"></a><span class="fu">wget</span> https://dl.grafana.com/enterprise/release/grafana-enterprise_10.3.1_amd64.deb</span>
<span id="cb112-3"><a href="#cb112-3" aria-hidden="true" tabindex="-1"></a><span class="ex">dpkg</span> <span class="at">-i</span> grafana-enterprise_10.3.1_amd64.deb</span>
<span id="cb112-4"><a href="#cb112-4" aria-hidden="true" tabindex="-1"></a><span class="ex">systemctl</span> start grafana-server</span>
<span id="cb112-5"><a href="#cb112-5" aria-hidden="true" tabindex="-1"></a><span class="ex">systemctl</span> status grafana-server</span></code></pre></div>
<h3 id="cli-client">CLI Client</h3>
<p><code>apt install influxdb-client</code><br />
<code>influx</code><br />
<code>influx --host 192.168.3.102 --username admin --password password</code></p>
<div class="sourceCode" id="cb113"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb113-1"><a href="#cb113-1" aria-hidden="true" tabindex="-1"></a><span class="va">$influx_client_exec</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Documents\influxdb-1.8.10-1\influx.exe&quot;</span></span>
<span id="cb113-2"><a href="#cb113-2" aria-hidden="true" tabindex="-1"></a><span class="op">&amp;</span> <span class="va">$influx_client_exec</span> <span class="op">-</span>host <span class="dv">192.168</span><span class="op">.</span><span class="dv">3.102</span> <span class="op">-</span>port <span class="dv">8086</span></span>
<span id="cb113-3"><a href="#cb113-3" aria-hidden="true" tabindex="-1"></a><span class="dt">help</span></span>
<span id="cb113-4"><a href="#cb113-4" aria-hidden="true" tabindex="-1"></a>show databases</span>
<span id="cb113-5"><a href="#cb113-5" aria-hidden="true" tabindex="-1"></a>use PowerShell</span>
<span id="cb113-6"><a href="#cb113-6" aria-hidden="true" tabindex="-1"></a><span class="fu">SELECT</span> <span class="op">*</span> <span class="kw">FROM</span> <span class="st">&quot;HardwareMonitor&quot;</span> <span class="fu">WHERE</span> time <span class="op">&gt;</span> now<span class="op">()</span> <span class="op">-</span> 5m</span></code></pre></div>
<h3 id="users">USERS</h3>
<p><code>SHOW USERS</code> отобразить пользователей и их права
доступа<br />
<code>CREATE USER admin WITH PASSWORD 'password' WITH ALL PRIVILEGES</code>
создать пользователя<br />
<code>GRANT ALL PRIVILEGES TO "admin"</code> предоставить права
доступа<br />
<code>GRANT READ ON "database" TO "admin"</code> доступ на чтение для БД
или запись (WRITE)<br />
<code>REVOKE ALL PRIVILEGES FROM "admin"</code> отозвать права
доступа<br />
<code>SHOW GRANTS FOR "admin"</code> БД и привелегии доступа для
указанного пользователя<br />
<code>SET PASSWORD FOR "admin" = 'new_password'</code> изменить
пароль<br />
<code>DROP USER "admin"</code> удалить пользователя</p>
<h3 id="database-2">DATABASE</h3>
<p><code>CREATE DATABASE powershell</code> создать БД<br />
<code>SHOW DATABASES</code> отобразить список БД<br />
<code>DROP DATABASE powershell</code> удалить БД<br />
<code>USE powershell</code><br />
<code>SHOW measurements</code> отобразить все таблицы<br />
<code>INSERT performance,host=console,counter=CPU value=0.88</code>
записать данные в таблицу performance</p>
<h3 id="measurement">MEASUREMENT</h3>
<p><code>SHOW TAG KEYS FROM "HardwareMonitor"</code> отобразить все тэги
в таблице<br />
<code>SHOW TAG VALUES FROM "HardwareMonitor" WITH KEY = "HardwareName"</code>
отобразить все значения указанного тэга<br />
<code>SHOW FIELD KEYS FROM "HardwareMonitor"</code> отобразить все Field
Tags и их тип данных<br />
<code>SHOW SERIES FROM "HardwareMonitor"</code> отобразить список всех
уникальных серий в указанной таблице. Серия - это набор точек данных,
которые имеют одинаковые значения для всех тегов, за исключением
времени.<br />
<code>DROP SERIES FROM "HardwareMonitor"</code> очистить все данные в
таблице<br />
<code>DROP MEASUREMENT "HardwareMonitor"</code> удалить таблицу</p>
<h3 id="selectwhere">SELECT/WHERE</h3>
<p><code>SELECT * FROM performance</code> отобразить все данные в
таблице<br />
<code>SELECT value FROM performance</code> отфильтровать по столбцу
value (только Field Keys)<br />
<code>SELECT * FROM performance limit 10</code> отобразить 10 единиц
данных<br />
<code>SELECT * FROM performance WHERE time &gt; now() -2d</code>
отобразить данные за последние 2 дня<br />
<code>SELECT * FROM performance WHERE time &gt; now() +3h -5m</code>
данные за последние 5 минут (+3 часа от текущего времени по UTC 0 -5
минут)<br />
<code>SELECT * FROM performance WHERE counter = 'CPU'</code> выборка по
тэгу<br />
<code>SELECT upload/1000 FROM speedtest WHERE upload/1000 &lt;= 250</code>
выборка по столбцу upload и разделить вывод на 1000, вывести upload
меньше 250<br />
<code>DELETE FROM performance WHERE time &gt; now() -1h</code> удалить
данные за последние 1/4 часа<br />
<code>DELETE FROM performance WHERE time &lt; now() -24h</code> удалить
данные старше 24 часов</p>
<h3 id="regex-1">REGEX</h3>
<p><code>SELECT * FROM "win_pdisk" WHERE instance =~/.*C:/ and time &gt; now() - 5m</code>
и<br />
<code>SELECT * FROM "win_pdisk" WHERE instance =~/.*E:/ or instance =~ /.*F:/</code>
или<br />
<code>SELECT * FROM "win_pdisk" WHERE instance !~ /.*Total/</code> не
равно (исключить)<br />
<code>SELECT * FROM "HardwareMonitor" WHERE time &gt; now() - 5m and HardwareName =~ /Intel/</code>
приблизительно равно<br />
<code>SELECT * FROM "HardwareMonitor" WHERE time &gt; now() - 5m and HardwareName =~ /Intel.+i7/</code>
эквивалент 12th_Gen_Intel_Core_i7-1260P<br />
<code>SELECT * FROM "HardwareMonitor" WHERE time &gt; now() - 5m and HardwareName =~ /^Intel/</code>
начинается на Intel<br />
<code>SELECT * FROM "HardwareMonitor" WHERE time &gt; now() - 5m and HardwareName =~ /00$/</code>
заканчивается на 00</p>
<h3 id="group-by-tag_key">GROUP BY tag_key</h3>
<p><code>SELECT * FROM "HardwareMonitor" WHERE time &gt; now() - 5m and SensorName = 'Temperature' GROUP BY HardwareName</code>
создать уникальные группы по тэгу HardwareName<br />
<code>SELECT * FROM "HardwareMonitor" WHERE time &gt; now() - 5m and SensorName = 'Temperature' GROUP BY Host,HardwareName</code>
больше групп по двум тэгаам</p>
<h3 id="functionsfield_key">Functions(field_key)</h3>
<p><a
href="https://docs.influxdata.com/influxdb/v1.8/query_language/functions">Functions</a></p>
<p><code>SELECT instance,LAST(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance</code>
отфильтровать вывод по последнему/текущему значению<br />
<code>SELECT instance,FIRST(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance</code>
отфильтровать вывод по первому значению за весь или указанный отрезок
времени<br />
<code>SELECT instance,MIN(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance</code>
отфильтровать вывод с отображением минимального значения<br />
<code>SELECT instance,MAX(Avg._Disk_Read_Queue_Length) FROM "win_pdisk" GROUP BY instance</code>
отфильтровать вывод с отображением максимального значения<br />
<code>SELECT SUM(Bytes_Received_persec) FROM "win_net" GROUP BY instance</code>
суммах всех значений<br />
<code>SELECT COUNT(Bytes_Received_persec) FROM "win_net" WHERE Bytes_Received_persec &gt;= 0 GROUP BY instance</code>
кол-во данных, где значение выше или равно 0<br />
<code>SELECT MEAN(Bytes_Received_persec) FROM "win_net" WHERE Bytes_Received_persec &lt; 1000 GROUP BY instance</code>
среднее значение данных с показателем от 0 до 1000 (509)</p>
<p><code>SELECT *,MAX(Value) FROM "HardwareMonitor" WHERE time &gt; now() -1h GROUP BY SensorName,Host</code>
создать группы для выявления максимального значения значения стобца
Value каждого тэга SensorName и хоста за последний час<br />
<code>SELECT *,MAX(Value) FROM "HardwareMonitor" WHERE time &gt; now() -1h and SensorName = 'CPU_Package' GROUP BY Host</code>
масимальное значение CPU_Package за последний час для каждого
хоста<br />
<code>SELECT MEAN(Value) FROM "HardwareMonitor" WHERE time &gt; now() -1h and SensorName = 'CPU_Package' GROUP BY Host</code>
среднее значение CPU_Package за последний час</p>
<h3 id="policy">POLICY</h3>
<p><code>CREATE DATABASE powershell WITH DURATION 48h REPLICATION 1 NAME "del2d"</code>
создать БД с политикой хранения 2 дня<br />
<code>CREATE RETENTION POLICY del2h ON powershell DURATION 2h REPLICATION 1</code>
создать новую политику хранения для БД<br />
<code>CREATE RETENTION POLICY del6h ON powershell DURATION 6h REPLICATION 1 SHARD DURATION 2h</code>
указать период хранения 6 часов + 2 часа до очистки (по умолчанию 1ч или
больше)<br />
<code>ALTER RETENTION POLICY del6h ON powershell DEFAULT</code> изменить
(ALTER) политику хранения для БД на del6h (DEFAULT)<br />
<code>DROP RETENTION POLICY del2d ON powershell</code> удаление политики
хранения приводит к безвозвратному удалению всех измерений (таблиц) и
данных, хранящихся в политике хранения<br />
<code>SHOW RETENTION POLICIES ON PowerShell</code> отобразить
действующие политики базы данных PowerShell</p>
<div class="sourceCode" id="cb114"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb114-1"><a href="#cb114-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> http<span class="op">://</span><span class="dv">192.168</span><span class="op">.</span><span class="dv">3.102</span><span class="op">:</span><span class="dv">8086</span><span class="op">/</span>query<span class="op">?</span>q<span class="op">=</span><span class="st">&quot;SHOW RETENTION POLICIES ON PowerShell&quot;</span></span>
<span id="cb114-2"><a href="#cb114-2" aria-hidden="true" tabindex="-1"></a><span class="va">$col</span> <span class="op">=</span> <span class="va">$data</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">series</span><span class="op">.</span><span class="fu">columns</span></span>
<span id="cb114-3"><a href="#cb114-3" aria-hidden="true" tabindex="-1"></a><span class="va">$val</span> <span class="op">=</span> <span class="va">$data</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">series</span><span class="op">.</span><span class="fu">values</span></span>
<span id="cb114-4"><a href="#cb114-4" aria-hidden="true" tabindex="-1"></a><span class="va">$mass</span> <span class="op">=</span> <span class="op">@()</span></span>
<span id="cb114-5"><a href="#cb114-5" aria-hidden="true" tabindex="-1"></a><span class="va">$mass</span> <span class="op">+=</span> <span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$col</span></span>
<span id="cb114-6"><a href="#cb114-6" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$v</span> <span class="kw">in</span> <span class="va">$val</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb114-7"><a href="#cb114-7" aria-hidden="true" tabindex="-1"></a> <span class="va">$mass</span> <span class="op">+=</span> <span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$v</span></span>
<span id="cb114-8"><a href="#cb114-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb114-9"><a href="#cb114-9" aria-hidden="true" tabindex="-1"></a><span class="va">$mass</span> <span class="op">=</span> <span class="va">$mass</span> <span class="op">-replace</span> <span class="st">&#39;^&#39;</span><span class="op">,</span><span class="st">&#39;&quot;&#39;</span></span>
<span id="cb114-10"><a href="#cb114-10" aria-hidden="true" tabindex="-1"></a><span class="va">$mass</span> <span class="op">=</span> <span class="va">$mass</span> <span class="op">-replace</span> <span class="st">&#39;$&#39;</span><span class="op">,</span><span class="st">&#39;&quot;&#39;</span></span>
<span id="cb114-11"><a href="#cb114-11" aria-hidden="true" tabindex="-1"></a><span class="va">$mass</span> <span class="op">=</span> <span class="va">$mass</span> <span class="op">-replace</span> <span class="st">&#39;\s&#39;</span><span class="op">,</span><span class="st">&#39;&quot;,&quot;&#39;</span></span>
<span id="cb114-12"><a href="#cb114-12" aria-hidden="true" tabindex="-1"></a><span class="va">$mass</span> <span class="op">|</span> <span class="fu">ConvertFrom-Csv</span></span></code></pre></div>
<h3 id="api-post">API POST</h3>
<p>Вместо таблиц в InfluxDB имеются измерения. Вместо столбцов в ней
есть теги и поля.</p>
<pre><code> Table Tag (string/int) Field (double/int) TIMESTAMP
measurement,Tag_Keys1=Tag_Values1,Tag_Keys2=Tag_Values2 Field_Keys1=&quot;Values&quot;,Field_Keys2=&quot;Values&quot; 0000000000000000000
1 2 3
$ip = &quot;192.168.3.104&quot;
$port = &quot;8086&quot;
$db = &quot;powershell&quot;
$table = &quot;speedtest&quot;
$ipp = $ip+&quot;:&quot;+$port
$url = &quot;http://$ipp/write?db=$db&quot;
$user = &quot;admin&quot;
$pass = &quot;password&quot; | ConvertTo-SecureString -AsPlainText -Force
$cred = [System.Management.Automation.PSCredential]::new($user,$pass)
$unixtime = (New-TimeSpan -Start (Get-Date &quot;01/01/1970&quot;) -End (Get-Date)).TotalSeconds
$timestamp = ([string]$unixtime -replace &quot;\..+&quot;) + &quot;000000000&quot;
Invoke-RestMethod -Method POST -Uri $url -Body &quot;$table,host=$(hostname) download=200000,upload=300000,ping=3 $timestamp&quot;</code></pre>
<h3 id="api-get">API GET</h3>
<p><code>curl http://192.168.3.104:8086/query --data-urlencode "q=SHOW DATABASES"</code>
pwsh7 (ConvertFrom-Json) and bash</p>
<p><code>$dbs = irm "http://192.168.3.104:8086/query?q=SHOW DATABASES"</code><br />
<code>$dbs = irm "http://192.168.3.104:8086/query?epoch=ms&amp;u=admin&amp;p=password&amp;q=SHOW DATABASES"</code><br />
<code>$dbs.results.series.values</code></p>
<div class="sourceCode" id="cb116"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb116-1"><a href="#cb116-1" aria-hidden="true" tabindex="-1"></a><span class="va">$ip</span> <span class="op">=</span> <span class="st">&quot;192.168.3.104&quot;</span></span>
<span id="cb116-2"><a href="#cb116-2" aria-hidden="true" tabindex="-1"></a><span class="va">$port</span> <span class="op">=</span> <span class="st">&quot;8086&quot;</span></span>
<span id="cb116-3"><a href="#cb116-3" aria-hidden="true" tabindex="-1"></a><span class="va">$db</span> <span class="op">=</span> <span class="st">&quot;powershell&quot;</span></span>
<span id="cb116-4"><a href="#cb116-4" aria-hidden="true" tabindex="-1"></a><span class="va">$table</span> <span class="op">=</span> <span class="st">&quot;speedtest&quot;</span></span>
<span id="cb116-5"><a href="#cb116-5" aria-hidden="true" tabindex="-1"></a><span class="va">$query</span> <span class="op">=</span> <span class="st">&quot;SELECT * FROM </span><span class="va">$table</span><span class="st">&quot;</span></span>
<span id="cb116-6"><a href="#cb116-6" aria-hidden="true" tabindex="-1"></a><span class="va">$ipp</span> <span class="op">=</span> <span class="va">$ip</span><span class="op">+</span><span class="st">&quot;:&quot;</span><span class="op">+</span><span class="va">$port</span></span>
<span id="cb116-7"><a href="#cb116-7" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="st">&quot;http://</span><span class="va">$ipp</span><span class="st">/query?db=</span><span class="va">$db</span><span class="st">&amp;q=</span><span class="va">$query</span><span class="st">&quot;</span></span>
<span id="cb116-8"><a href="#cb116-8" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method GET <span class="op">-</span>Uri <span class="va">$url</span><span class="ch">` </span><span class="op">-</span>Credential <span class="va">$cred</span> </span>
<span id="cb116-9"><a href="#cb116-9" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">series</span><span class="op">.</span><span class="fu">name</span> <span class="ch">` </span>имя таблицы</span>
<span id="cb116-10"><a href="#cb116-10" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">series</span><span class="op">.</span><span class="fu">columns</span><span class="ch">` </span>столбцы<span class="op">/</span>ключи</span>
<span id="cb116-11"><a href="#cb116-11" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">series</span><span class="op">.</span><span class="fu">values</span> <span class="ch">` </span>данные построчно</span></code></pre></div>
<h3 id="endpoints">Endpoints</h3>
<p>https://docs.influxdata.com/influxdb/v1.7/tools/api/</p>
<div class="sourceCode" id="cb117"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb117-1"><a href="#cb117-1" aria-hidden="true" tabindex="-1"></a><span class="va">$stats</span> <span class="op">=</span> <span class="fu">irm</span> http<span class="op">://</span><span class="dv">192.168</span><span class="op">.</span><span class="dv">3.104</span><span class="op">:</span><span class="dv">8086</span><span class="op">/</span>debug<span class="op">/</span>vars<span class="ch">` </span>статистика сервера</span>
<span id="cb117-2"><a href="#cb117-2" aria-hidden="true" tabindex="-1"></a><span class="va">$stats</span><span class="op">.</span><span class="st">&quot;database:powershell&quot;</span><span class="op">.</span><span class="fu">values</span><span class="ch">` </span>кол-во таблиц к БД</span>
<span id="cb117-3"><a href="#cb117-3" aria-hidden="true" tabindex="-1"></a><span class="va">$stats</span><span class="op">.</span><span class="fu">queryExecutor</span><span class="op">.</span><span class="fu">values</span><span class="ch">` </span>количество query-запросов <span class="op">(</span>обращений к endpoint <span class="op">/</span>query<span class="op">)</span></span>
<span id="cb117-4"><a href="#cb117-4" aria-hidden="true" tabindex="-1"></a><span class="va">$stats</span><span class="op">.</span><span class="fu">write</span><span class="op">.</span><span class="fu">values</span><span class="ch">` </span>количество write-запросов</span>
<span id="cb117-5"><a href="#cb117-5" aria-hidden="true" tabindex="-1"></a><span class="va">$stats</span><span class="op">.</span><span class="fu">system</span><span class="op">.</span><span class="fu">uptime</span></span></code></pre></div>
<p><code>http://192.168.3.104:8086/debug/requests</code> кол-во
клиентских HTTP-запросов к конечным точкам /writeи /query<br />
<code>http://192.168.3.104:8086/debug/pprof</code><br />
<code>http://192.168.3.104:8086/ping</code><br />
<code>http://192.168.3.104:8086/query</code><br />
<code>http://192.168.3.104:8086/write</code></p>
<p><code>http://192.168.3.99:8086/api/v2/setup</code><br />
<code>http://192.168.3.99:8086/api/v2/config</code><br />
<code>http://192.168.3.99:8086/api/v2/write</code></p>
<h3 id="pingto-influxdb">PingTo-InfluxDB</h3>
<div class="sourceCode" id="cb118"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb118-1"><a href="#cb118-1" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span><span class="va">$true</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb118-2"><a href="#cb118-2" aria-hidden="true" tabindex="-1"></a> <span class="va">$tz</span> <span class="op">=</span> <span class="op">(</span>Get-TimeZone<span class="op">).</span><span class="fu">BaseUtcOffset</span><span class="op">.</span><span class="fu">TotalMinutes</span></span>
<span id="cb118-3"><a href="#cb118-3" aria-hidden="true" tabindex="-1"></a> <span class="va">$unixtime</span> <span class="op">=</span> <span class="op">(</span><span class="fu">New-TimeSpan</span> <span class="op">-</span>Start <span class="op">(</span><span class="fu">Get-Date</span> <span class="st">&quot;01/01/1970&quot;</span><span class="op">)</span> <span class="op">-</span>End <span class="op">((</span><span class="fu">Get-Date</span><span class="op">).</span><span class="fu">AddMinutes</span><span class="op">(-</span><span class="va">$tz</span><span class="op">))).</span><span class="fu">TotalSeconds</span><span class="ch">` </span><span class="op">-</span>3h UTC</span>
<span id="cb118-4"><a href="#cb118-4" aria-hidden="true" tabindex="-1"></a> <span class="va">$timestamp</span> <span class="op">=</span> <span class="op">([</span><span class="dt">string</span><span class="op">]</span><span class="va">$unixtime</span> <span class="op">-replace</span> <span class="st">&quot;\..+&quot;</span><span class="op">)</span> <span class="op">+</span> <span class="st">&quot;000000000&quot;</span></span>
<span id="cb118-5"><a href="#cb118-5" aria-hidden="true" tabindex="-1"></a> <span class="va">$tnc</span> <span class="op">=</span> tnc <span class="dv">8.8</span><span class="op">.</span><span class="dv">8.8</span></span>
<span id="cb118-6"><a href="#cb118-6" aria-hidden="true" tabindex="-1"></a> <span class="va">$Status</span> <span class="op">=</span> <span class="va">$tnc</span><span class="op">.</span><span class="fu">PingSucceeded</span></span>
<span id="cb118-7"><a href="#cb118-7" aria-hidden="true" tabindex="-1"></a> <span class="va">$RTime</span> <span class="op">=</span> <span class="va">$tnc</span><span class="op">.</span><span class="fu">PingReplyDetails</span><span class="op">.</span><span class="fu">RoundtripTime</span></span>
<span id="cb118-8"><a href="#cb118-8" aria-hidden="true" tabindex="-1"></a> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="st">&quot;http://192.168.3.104:8086/write?db=powershell&quot;</span> <span class="op">-</span>Body <span class="st">&quot;ping,host=</span><span class="op">$(</span>hostname<span class="op">)</span><span class="st"> status=</span><span class="va">$status</span><span class="st">,rtime=</span><span class="va">$RTime</span><span class="st"> </span><span class="va">$timestamp</span><span class="st">&quot;</span></span>
<span id="cb118-9"><a href="#cb118-9" aria-hidden="true" tabindex="-1"></a> <span class="fu">sleep</span> <span class="dv">1</span></span>
<span id="cb118-10"><a href="#cb118-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>SELECT * FROM ping WHERE status = false</code></p>
<h3 id="performanceto-influxdb">PerformanceTo-InfluxDB</h3>
<div class="sourceCode" id="cb119"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb119-1"><a href="#cb119-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> ConvertTo-Encoding <span class="op">([</span><span class="dt">string</span><span class="op">]</span><span class="va">$From</span><span class="op">,</span> <span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$To</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb119-2"><a href="#cb119-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">Begin</span> <span class="op">{</span></span>
<span id="cb119-3"><a href="#cb119-3" aria-hidden="true" tabindex="-1"></a> <span class="va">$encFrom</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">Encoding</span><span class="op">]::</span>GetEncoding<span class="op">(</span><span class="va">$from</span><span class="op">)</span></span>
<span id="cb119-4"><a href="#cb119-4" aria-hidden="true" tabindex="-1"></a> <span class="va">$encTo</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">Encoding</span><span class="op">]::</span>GetEncoding<span class="op">(</span><span class="va">$to</span><span class="op">)</span></span>
<span id="cb119-5"><a href="#cb119-5" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb119-6"><a href="#cb119-6" aria-hidden="true" tabindex="-1"></a> <span class="cf">Process</span> <span class="op">{</span></span>
<span id="cb119-7"><a href="#cb119-7" aria-hidden="true" tabindex="-1"></a> <span class="va">$bytes</span> <span class="op">=</span> <span class="va">$encTo</span><span class="op">.</span><span class="fu">GetBytes</span><span class="op">(</span><span class="va">$_</span><span class="op">)</span></span>
<span id="cb119-8"><a href="#cb119-8" aria-hidden="true" tabindex="-1"></a> <span class="va">$bytes</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">Encoding</span><span class="op">]::</span>Convert<span class="op">(</span><span class="va">$encFrom</span><span class="op">,</span> <span class="va">$encTo</span><span class="op">,</span> <span class="va">$bytes</span><span class="op">)</span></span>
<span id="cb119-9"><a href="#cb119-9" aria-hidden="true" tabindex="-1"></a> <span class="va">$encTo</span><span class="op">.</span><span class="fu">GetString</span><span class="op">(</span><span class="va">$bytes</span><span class="op">)</span></span>
<span id="cb119-10"><a href="#cb119-10" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb119-11"><a href="#cb119-11" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb119-12"><a href="#cb119-12" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb119-13"><a href="#cb119-13" aria-hidden="true" tabindex="-1"></a><span class="va">$localization</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Culture</span><span class="op">).</span><span class="fu">LCID</span><span class="ch">` </span>текущая локализация</span>
<span id="cb119-14"><a href="#cb119-14" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$localization</span> <span class="op">-eq</span> <span class="dv">1049</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb119-15"><a href="#cb119-15" aria-hidden="true" tabindex="-1"></a> <span class="va">$performance</span> <span class="op">=</span> <span class="st">&quot;\\</span><span class="op">$(</span>hostname<span class="op">)</span><span class="st">\Процессор(_Total)\% загруженности процессора&quot;</span> <span class="op">|</span> ConvertTo-Encoding UTF-8 windows-1251<span class="ch">` </span>декодировать кириллицу</span>
<span id="cb119-16"><a href="#cb119-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="cf">else</span> <span class="op">{</span></span>
<span id="cb119-17"><a href="#cb119-17" aria-hidden="true" tabindex="-1"></a> <span class="va">$performance</span> <span class="op">=</span> <span class="st">&quot;\Processor(_Total)\% Processor Time&quot;</span></span>
<span id="cb119-18"><a href="#cb119-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb119-19"><a href="#cb119-19" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb119-20"><a href="#cb119-20" aria-hidden="true" tabindex="-1"></a><span class="va">$tz</span> <span class="op">=</span> <span class="op">(</span>Get-TimeZone<span class="op">).</span><span class="fu">BaseUtcOffset</span><span class="op">.</span><span class="fu">TotalMinutes</span></span>
<span id="cb119-21"><a href="#cb119-21" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span><span class="va">$true</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb119-22"><a href="#cb119-22" aria-hidden="true" tabindex="-1"></a> <span class="va">$unixtime</span> <span class="op">=</span> <span class="op">(</span><span class="fu">New-TimeSpan</span> <span class="op">-</span>Start <span class="op">(</span><span class="fu">Get-Date</span> <span class="st">&quot;01/01/1970&quot;</span><span class="op">)</span> <span class="op">-</span>End <span class="op">((</span><span class="fu">Get-Date</span><span class="op">).</span><span class="fu">AddMinutes</span><span class="op">(-</span><span class="va">$tz</span><span class="op">))).</span><span class="fu">TotalSeconds</span><span class="ch">` </span><span class="op">-</span>3h UTC</span>
<span id="cb119-23"><a href="#cb119-23" aria-hidden="true" tabindex="-1"></a> <span class="va">$timestamp</span> <span class="op">=</span> <span class="op">([</span><span class="dt">string</span><span class="op">]</span><span class="va">$unixtime</span> <span class="op">-replace</span> <span class="st">&quot;\..+&quot;</span><span class="op">)</span> <span class="op">+</span> <span class="st">&quot;000000000&quot;</span></span>
<span id="cb119-24"><a href="#cb119-24" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="dt">double</span><span class="op">]</span><span class="va">$value</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Counter</span> <span class="va">$performance</span><span class="op">).</span><span class="fu">CounterSamples</span><span class="op">.</span><span class="fu">CookedValue</span><span class="op">.</span><span class="fu">ToString</span><span class="op">(</span><span class="st">&quot;0.00&quot;</span><span class="op">).</span><span class="fu">replace</span><span class="op">(</span><span class="st">&quot;,&quot;</span><span class="op">,</span><span class="st">&quot;.&quot;</span><span class="op">)</span><span class="ch">` </span>округлить в тип данных Double</span>
<span id="cb119-25"><a href="#cb119-25" aria-hidden="true" tabindex="-1"></a> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="st">&quot;http://192.168.3.104:8086/write?db=powershell&quot;</span> <span class="op">-</span>Body <span class="st">&quot;performance,host=</span><span class="op">$(</span>hostname<span class="op">)</span><span class="st">,counter=CPU value=</span><span class="va">$value</span><span class="st"> </span><span class="va">$timestamp</span><span class="st">&quot;</span></span>
<span id="cb119-26"><a href="#cb119-26" aria-hidden="true" tabindex="-1"></a> <span class="fu">sleep</span> <span class="dv">5</span></span>
<span id="cb119-27"><a href="#cb119-27" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<h3 id="service">Service</h3>
<div class="sourceCode" id="cb120"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb120-1"><a href="#cb120-1" aria-hidden="true" tabindex="-1"></a><span class="va">$powershell_Path</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Command</span> powershell<span class="op">).</span><span class="fu">Source</span></span>
<span id="cb120-2"><a href="#cb120-2" aria-hidden="true" tabindex="-1"></a><span class="va">$NSSM_Path</span> <span class="op">=</span> <span class="st">&quot;C:\NSSM\NSSM-2.24.exe&quot;</span></span>
<span id="cb120-3"><a href="#cb120-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Script_Path</span> <span class="op">=</span> <span class="st">&quot;C:\NSSM\PerformanceTo-InfluxDB.ps1&quot;</span></span>
<span id="cb120-4"><a href="#cb120-4" aria-hidden="true" tabindex="-1"></a><span class="va">$Service_Name</span> <span class="op">=</span> <span class="st">&quot;PerformanceTo-InfluxDB&quot;</span></span>
<span id="cb120-5"><a href="#cb120-5" aria-hidden="true" tabindex="-1"></a><span class="op">&amp;</span> <span class="va">$NSSM_Path</span> install <span class="va">$Service_Name</span> <span class="va">$powershell_Path</span> <span class="op">-</span>ExecutionPolicy Bypass <span class="op">-</span>NoProfile <span class="op">-</span>f <span class="va">$Script_Path</span></span>
<span id="cb120-6"><a href="#cb120-6" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Service</span> <span class="va">$Service_Name</span> <span class="op">|</span> <span class="fu">Start-Service</span></span>
<span id="cb120-7"><a href="#cb120-7" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Service</span> <span class="va">$Service_Name</span> <span class="op">|</span> <span class="fu">Set-Service</span> <span class="op">-</span>StartupType Automatic</span></code></pre></div>
<h1 id="telegraf">Telegraf</h1>
<p>Plugins:
https://docs.influxdata.com/telegraf/v1.27/plugins/#input-plugins</p>
<p><code>iwr https://dl.influxdata.com/telegraf/releases/telegraf-1.27.1_windows_amd64.zip -UseBasicParsing -OutFile telegraf-1.27.1_windows_amd64.zip</code><br />
<code>Expand-Archive .\telegraf-1.27.1_windows_amd64.zip -DestinationPath "C:\Telegraf"</code><br />
<code>rm telegraf-1.27.1_windows_amd64.zip</code><br />
<code>cd C:\Telegraf</code><br />
<code>.\telegraf.exe -sample-config --input-filter cpu:mem:dns_query --output-filter influxdb &gt; telegraf_nt.conf</code>
создать конфигурацию с выбарнными плагинами для сбора метрик<br />
<code>Start-Process notepad++ C:\Telegraf\telegraf_nt.conf</code></p>
<pre><code>[[outputs.influxdb]]
urls = [&quot;http://192.168.3.104:8086&quot;]
database = &quot;telegraf_nt&quot;
username = &quot;user&quot;
password = &quot;pass&quot;
[[inputs.cpu]]
percpu = false
totalcpu = true
[[inputs.dns_query]]
servers = [&quot;8.8.8.8&quot;]
network = &quot;udp&quot;
domains = [&quot;.&quot;]
record_type = &quot;A&quot;
port = 53
timeout = &quot;2s&quot;</code></pre>
<p><code>.\telegraf.exe --test -config C:\Telegraf\telegraf_nt.conf</code>
тест конфигурации (получения метрик с выводом в консоль)<br />
<code>C:\Telegraf\telegraf.exe -config C:\Telegraf\telegraf_nt.conf</code>
запустить telegraf (тест отправки данных)<br />
<code>.\telegraf.exe --config "C:\Telegraf\telegraf_nt.conf" --service install</code>
создать службу<br />
<code>Get-Service telegraf | Start-Service</code><br />
<code>.\telegraf.exe --service uninstall</code></p>
<p><code>USE telegraf</code><br />
<code>SELECT usage_idle,usage_system,usage_user FROM cpu</code></p>
<h1 id="elasticsearch">Elasticsearch</h1>
<p><code>Install-Module -Name Elastic.Console -AllowPrerelease</code>
https://github.com/elastic/powershell/blob/master/Elastic.Console/README.md<br />
<code>Get-Command -Module Elastic.Console</code><br />
<code>Get-ElasticsearchVersion</code><br />
<code>Set-ElasticsearchVersion 7.3.0</code><br />
<code>Invoke-Elasticsearch</code> REST API запросы</p>
<h1 id="cdata">CData</h1>
<p>https://www.powershellgallery.com/profiles/CData<br />
https://www.cdata.com/kb/tech/elasticsearch-ado-powershell.rst</p>
<p><code>Install-Module ElasticsearchCmdlets</code>
https://www.powershellgallery.com/packages/ElasticsearchCmdlets/23.0.8565.1<br />
<code>Import-Module ElasticsearchCmdlets</code><br />
<code>Get-Command -Module ElasticsearchCmdlets</code></p>
<div class="sourceCode" id="cb122"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb122-1"><a href="#cb122-1" aria-hidden="true" tabindex="-1"></a><span class="va">$elasticsearch</span> <span class="op">=</span> Connect-Elasticsearch <span class="op">-</span>Server <span class="st">&quot;</span><span class="va">$Server</span><span class="st">&quot;</span> <span class="op">-</span>Port <span class="st">&quot;</span><span class="va">$Port</span><span class="st">&quot;</span> <span class="op">-</span>User <span class="st">&quot;</span><span class="va">$User</span><span class="st">&quot;</span> <span class="op">-</span>Password <span class="st">&quot;</span><span class="va">$Password</span><span class="st">&quot;</span></span>
<span id="cb122-2"><a href="#cb122-2" aria-hidden="true" tabindex="-1"></a><span class="va">$shipcity</span> <span class="op">=</span> <span class="st">&quot;New York&quot;</span></span>
<span id="cb122-3"><a href="#cb122-3" aria-hidden="true" tabindex="-1"></a><span class="va">$orders</span> <span class="op">=</span> Select-Elasticsearch <span class="op">-</span>Connection <span class="va">$elasticsearch</span> <span class="op">-</span>Table <span class="st">&quot;Orders&quot;</span> <span class="op">-</span>Where <span class="st">&quot;ShipCity = </span><span class="ch">`&#39;</span><span class="va">$ShipCity</span><span class="ch">`&#39;</span><span class="st">&quot;</span><span class="ch">` </span>поиск и получение данных</span>
<span id="cb122-4"><a href="#cb122-4" aria-hidden="true" tabindex="-1"></a><span class="va">$orders</span> <span class="op">=</span> Invoke-Elasticsearch <span class="op">-</span>Connection <span class="va">$elasticsearch</span> <span class="op">-</span>Query <span class="st">&#39;SELECT * FROM Orders WHERE ShipCity = @ShipCity&#39;</span> <span class="op">-</span>Params @<span class="op">{</span><span class="st">&#39;@ShipCity&#39;</span><span class="op">=</span><span class="st">&#39;New York&#39;</span><span class="op">}</span><span class="ch">` </span>SQL запросы</span></code></pre></div>
<h3 id="ado.net-assembly">ADO.NET Assembly</h3>
<p><code>Install-Package CData.Elasticsearch</code>
https://www.nuget.org/packages/CData.Elasticsearch<br />
<code>[Reflection.Assembly]::LoadFile("C:\Program Files\PackageManagement\NuGet\Packages\CData.Elasticsearch.23.0.8565\lib\net40\System.Data.CData.Elasticsearch.dll")</code></p>
<div class="sourceCode" id="cb123"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb123-1"><a href="#cb123-1" aria-hidden="true" tabindex="-1"></a><span class="va">$connect</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchConnection</span><span class="op">(</span><span class="st">&quot;Server=127.0.0.1;Port=9200;User=admin;Password=123456;&quot;</span><span class="op">)</span></span>
<span id="cb123-2"><a href="#cb123-2" aria-hidden="true" tabindex="-1"></a><span class="va">$connect</span><span class="op">.</span><span class="fu">Open</span><span class="op">()</span></span>
<span id="cb123-3"><a href="#cb123-3" aria-hidden="true" tabindex="-1"></a><span class="va">$sql</span> <span class="op">=</span> <span class="st">&quot;SELECT OrderName, Freight from Orders&quot;</span></span>
<span id="cb123-4"><a href="#cb123-4" aria-hidden="true" tabindex="-1"></a><span class="va">$da</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchDataAdapter</span><span class="op">(</span><span class="va">$sql</span><span class="op">,</span> <span class="va">$conn</span><span class="op">)</span></span>
<span id="cb123-5"><a href="#cb123-5" aria-hidden="true" tabindex="-1"></a><span class="va">$dt</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">DataTable</span></span>
<span id="cb123-6"><a href="#cb123-6" aria-hidden="true" tabindex="-1"></a><span class="va">$da</span><span class="op">.</span><span class="fu">Fill</span><span class="op">(</span><span class="va">$dt</span><span class="op">)</span></span>
<span id="cb123-7"><a href="#cb123-7" aria-hidden="true" tabindex="-1"></a><span class="va">$dt</span><span class="op">.</span><span class="fu">Rows</span> <span class="op">|</span> <span class="cf">foreach</span> <span class="op">{</span></span>
<span id="cb123-8"><a href="#cb123-8" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Host</span> <span class="va">$_</span><span class="op">.</span><span class="fu">ordername</span> <span class="va">$_</span><span class="op">.</span><span class="fu">freight</span></span>
<span id="cb123-9"><a href="#cb123-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<h3 id="update-1">UPDATE</h3>
<div class="sourceCode" id="cb124"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb124-1"><a href="#cb124-1" aria-hidden="true" tabindex="-1"></a>Update-Elasticsearch <span class="op">-</span>Connection <span class="va">$Elasticsearch</span> <span class="op">-</span>Columns <span class="op">@(</span><span class="st">&#39;OrderName&#39;</span><span class="op">,</span><span class="st">&#39;Freight&#39;</span><span class="op">)</span> <span class="op">-</span>Values <span class="op">@(</span><span class="st">&#39;MyOrderName&#39;</span><span class="op">,</span> <span class="st">&#39;MyFreight&#39;</span><span class="op">)</span> <span class="op">-</span>Table Orders <span class="op">-</span>Id <span class="st">&quot;MyId&quot;</span></span>
<span id="cb124-2"><a href="#cb124-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb124-3"><a href="#cb124-3" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchCommand</span><span class="op">(</span><span class="st">&quot;UPDATE Orders SET ShipCity=&#39;New York&#39; WHERE Id = @myId&quot;</span><span class="op">,</span> <span class="va">$conn</span><span class="op">)</span></span>
<span id="cb124-4"><a href="#cb124-4" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span><span class="op">.</span><span class="fu">Parameters</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span>new System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchParameter</span><span class="op">(</span><span class="st">&quot;@myId&quot;</span><span class="op">,</span><span class="st">&quot;10456255-0015501366&quot;</span><span class="op">))</span></span>
<span id="cb124-5"><a href="#cb124-5" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span><span class="op">.</span><span class="fu">ExecuteNonQuery</span><span class="op">()</span></span></code></pre></div>
<h3 id="insert-1">INSERT</h3>
<div class="sourceCode" id="cb125"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb125-1"><a href="#cb125-1" aria-hidden="true" tabindex="-1"></a>Add-Elasticsearch <span class="op">-</span>Connection <span class="va">$Elasticsearch</span> <span class="op">-</span>Table Orders <span class="op">-</span>Columns <span class="op">@(</span><span class="st">&quot;OrderName&quot;</span><span class="op">,</span> <span class="st">&quot;Freight&quot;</span><span class="op">)</span> <span class="op">-</span>Values <span class="op">@(</span><span class="st">&quot;MyOrderName&quot;</span><span class="op">,</span> <span class="st">&quot;MyFreight&quot;</span><span class="op">)</span></span>
<span id="cb125-2"><a href="#cb125-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb125-3"><a href="#cb125-3" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchCommand</span><span class="op">(</span><span class="st">&quot;INSERT INTO Orders (ShipCity) VALUES (@myShipCity)&quot;</span><span class="op">,</span> <span class="va">$conn</span><span class="op">)</span></span>
<span id="cb125-4"><a href="#cb125-4" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span><span class="op">.</span><span class="fu">Parameters</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span>new System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchParameter</span><span class="op">(</span><span class="st">&quot;@myShipCity&quot;</span><span class="op">,</span><span class="st">&quot;New York&quot;</span><span class="op">))</span></span>
<span id="cb125-5"><a href="#cb125-5" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span><span class="op">.</span><span class="fu">ExecuteNonQuery</span><span class="op">()</span></span></code></pre></div>
<h3 id="delete-1">DELETE</h3>
<div class="sourceCode" id="cb126"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb126-1"><a href="#cb126-1" aria-hidden="true" tabindex="-1"></a>Remove-Elasticsearch <span class="op">-</span>Connection <span class="va">$Elasticsearch</span> <span class="op">-</span>Table <span class="st">&quot;Orders&quot;</span> <span class="op">-</span>Id <span class="st">&quot;MyId&quot;</span></span>
<span id="cb126-2"><a href="#cb126-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb126-3"><a href="#cb126-3" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchCommand</span><span class="op">(</span><span class="st">&quot;DELETE FROM Orders WHERE Id=@myId&quot;</span><span class="op">,</span> <span class="va">$conn</span><span class="op">)</span></span>
<span id="cb126-4"><a href="#cb126-4" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span><span class="op">.</span><span class="fu">Parameters</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span>new System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">CData</span><span class="op">.</span><span class="fu">Elasticsearch</span><span class="op">.</span><span class="fu">ElasticsearchParameter</span><span class="op">(</span><span class="st">&quot;@myId&quot;</span><span class="op">,</span><span class="st">&quot;001d000000YBRseAAH&quot;</span><span class="op">))</span></span>
<span id="cb126-5"><a href="#cb126-5" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span><span class="op">.</span><span class="fu">ExecuteNonQuery</span><span class="op">()</span></span></code></pre></div>
<h1 id="odbc">ODBC</h1>
<p><code>Get-Command -Module Wdac</code><br />
<code>Get-OdbcDriver | ft</code> список установленных драйверов</p>
<p>https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-client-apps-ps1.html</p>
<div class="sourceCode" id="cb127"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb127-1"><a href="#cb127-1" aria-hidden="true" tabindex="-1"></a><span class="va">$connectstring</span> <span class="op">=</span> <span class="st">&quot;DSN=Local Elasticsearch;&quot;</span></span>
<span id="cb127-2"><a href="#cb127-2" aria-hidden="true" tabindex="-1"></a><span class="va">$sql</span> <span class="op">=</span> <span class="st">&quot;SELECT * FROM library&quot;</span></span>
<span id="cb127-3"><a href="#cb127-3" aria-hidden="true" tabindex="-1"></a><span class="va">$conn</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">Odbc</span><span class="op">.</span><span class="fu">OdbcConnection</span><span class="op">(</span><span class="va">$connectstring</span><span class="op">)</span></span>
<span id="cb127-4"><a href="#cb127-4" aria-hidden="true" tabindex="-1"></a><span class="va">$conn</span><span class="op">.</span><span class="fu">open</span><span class="op">()</span></span>
<span id="cb127-5"><a href="#cb127-5" aria-hidden="true" tabindex="-1"></a><span class="va">$cmd</span> <span class="op">=</span> <span class="fu">New-Object</span> system<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">Odbc</span><span class="op">.</span><span class="fu">OdbcCommand</span><span class="op">(</span><span class="va">$sql</span><span class="op">,</span><span class="va">$conn</span><span class="op">)</span></span>
<span id="cb127-6"><a href="#cb127-6" aria-hidden="true" tabindex="-1"></a><span class="va">$da</span> <span class="op">=</span> <span class="fu">New-Object</span> system<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">Odbc</span><span class="op">.</span><span class="fu">OdbcDataAdapter</span><span class="op">(</span><span class="va">$cmd</span><span class="op">)</span></span>
<span id="cb127-7"><a href="#cb127-7" aria-hidden="true" tabindex="-1"></a><span class="va">$dt</span> <span class="op">=</span> <span class="fu">New-Object</span> system<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">datatable</span></span>
<span id="cb127-8"><a href="#cb127-8" aria-hidden="true" tabindex="-1"></a><span class="va">$null</span> <span class="op">=</span> <span class="va">$da</span><span class="op">.</span><span class="fu">fill</span><span class="op">(</span><span class="va">$dt</span><span class="op">)</span></span>
<span id="cb127-9"><a href="#cb127-9" aria-hidden="true" tabindex="-1"></a><span class="va">$conn</span><span class="op">.</span><span class="fu">close</span><span class="op">()</span></span>
<span id="cb127-10"><a href="#cb127-10" aria-hidden="true" tabindex="-1"></a><span class="va">$dt</span></span></code></pre></div>
<h1 id="postgresql">PostgreSQL</h1>
<p>Скачать и установить драйвер:
https://www.postgresql.org/ftp/odbc/versions/msi/</p>
<div class="sourceCode" id="cb128"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb128-1"><a href="#cb128-1" aria-hidden="true" tabindex="-1"></a><span class="va">$dbServer</span> <span class="op">=</span> <span class="st">&quot;192.168.3.101&quot;</span></span>
<span id="cb128-2"><a href="#cb128-2" aria-hidden="true" tabindex="-1"></a><span class="va">$port</span> <span class="op">=</span> <span class="st">&quot;5432&quot;</span></span>
<span id="cb128-3"><a href="#cb128-3" aria-hidden="true" tabindex="-1"></a><span class="va">$dbName</span> <span class="op">=</span> <span class="st">&quot;test&quot;</span></span>
<span id="cb128-4"><a href="#cb128-4" aria-hidden="true" tabindex="-1"></a><span class="va">$dbUser</span> <span class="op">=</span> <span class="st">&quot;admin&quot;</span></span>
<span id="cb128-5"><a href="#cb128-5" aria-hidden="true" tabindex="-1"></a><span class="va">$dbPass</span> <span class="op">=</span> <span class="st">&quot;admin&quot;</span></span>
<span id="cb128-6"><a href="#cb128-6" aria-hidden="true" tabindex="-1"></a><span class="va">$szConnect</span> <span class="op">=</span> <span class="st">&quot;Driver={PostgreSQL Unicode(x64)};Server=</span><span class="va">$dbServer</span><span class="st">;Port=</span><span class="va">$port</span><span class="st">;Database=</span><span class="va">$dbName</span><span class="st">;Uid=</span><span class="va">$dbUser</span><span class="st">;Pwd=</span><span class="va">$dbPass</span><span class="st">;&quot;</span> </span>
<span id="cb128-7"><a href="#cb128-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb128-8"><a href="#cb128-8" aria-hidden="true" tabindex="-1"></a><span class="va">$cnDB</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">Odbc</span><span class="op">.</span><span class="fu">OdbcConnection</span><span class="op">(</span><span class="va">$szConnect</span><span class="op">)</span></span>
<span id="cb128-9"><a href="#cb128-9" aria-hidden="true" tabindex="-1"></a><span class="va">$dsDB</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">DataSet</span></span>
<span id="cb128-10"><a href="#cb128-10" aria-hidden="true" tabindex="-1"></a><span class="cf">try</span> <span class="op">{</span></span>
<span id="cb128-11"><a href="#cb128-11" aria-hidden="true" tabindex="-1"></a> <span class="va">$cnDB</span><span class="op">.</span><span class="fu">Open</span><span class="op">()</span></span>
<span id="cb128-12"><a href="#cb128-12" aria-hidden="true" tabindex="-1"></a> <span class="va">$adDB</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">Odbc</span><span class="op">.</span><span class="fu">OdbcDataAdapter</span></span>
<span id="cb128-13"><a href="#cb128-13" aria-hidden="true" tabindex="-1"></a> <span class="va">$adDB</span><span class="op">.</span><span class="fu">SelectCommand</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">Odbc</span><span class="op">.</span><span class="fu">OdbcCommand</span><span class="op">(</span><span class="st">&quot;SELECT id, name, age, login FROM public.users&quot;</span> <span class="op">,</span> <span class="va">$cnDB</span><span class="op">)</span></span>
<span id="cb128-14"><a href="#cb128-14" aria-hidden="true" tabindex="-1"></a> <span class="va">$adDB</span><span class="op">.</span><span class="fu">Fill</span><span class="op">(</span><span class="va">$dsDB</span><span class="op">)</span></span>
<span id="cb128-15"><a href="#cb128-15" aria-hidden="true" tabindex="-1"></a> <span class="va">$cnDB</span><span class="op">.</span><span class="fu">Close</span><span class="op">()</span></span>
<span id="cb128-16"><a href="#cb128-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb128-17"><a href="#cb128-17" aria-hidden="true" tabindex="-1"></a><span class="cf">catch</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">Odbc</span><span class="op">.</span><span class="fu">OdbcException</span><span class="op">]</span> <span class="op">{</span></span>
<span id="cb128-18"><a href="#cb128-18" aria-hidden="true" tabindex="-1"></a> <span class="va">$_</span><span class="op">.</span><span class="fu">Exception</span></span>
<span id="cb128-19"><a href="#cb128-19" aria-hidden="true" tabindex="-1"></a> <span class="va">$_</span><span class="op">.</span><span class="fu">Exception</span><span class="op">.</span><span class="fu">Message</span></span>
<span id="cb128-20"><a href="#cb128-20" aria-hidden="true" tabindex="-1"></a> <span class="va">$_</span><span class="op">.</span><span class="fu">Exception</span><span class="op">.</span><span class="fu">ItemName</span></span>
<span id="cb128-21"><a href="#cb128-21" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb128-22"><a href="#cb128-22" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$row</span> <span class="kw">in</span> <span class="va">$dsDB</span><span class="op">[</span><span class="dv">0</span><span class="op">].</span><span class="fu">Tables</span><span class="op">[</span><span class="dv">0</span><span class="op">].</span><span class="fu">Rows</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb128-23"><a href="#cb128-23" aria-hidden="true" tabindex="-1"></a> <span class="va">$row</span><span class="op">.</span><span class="fu">login</span></span>
<span id="cb128-24"><a href="#cb128-24" aria-hidden="true" tabindex="-1"></a> <span class="va">$row</span><span class="op">.</span><span class="fu">age</span></span>
<span id="cb128-25"><a href="#cb128-25" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<h1 id="wmi">WMI</h1>
<h3
id="wmicim-windows-management-instrumentationcommon-information-model">WMI/CIM
(Windows Management Instrumentation/Common Information Model)</h3>
<p><code>Get-WmiObjec -ComputerName localhost -Namespace root -class "__NAMESPACE" | select name,__namespace</code>
отобразить дочернии Namespace (логические иерархические группы)<br />
<code>Get-WmiObject -List</code> отобразить все классы пространства имен
“root” (по умолчанию), свойства (описывают конфигурацию и текущее
состояние управляемого ресурса) и их методы (какие действия позволяет
выполнить над этим ресурсом)<br />
<code>Get-WmiObject -List | Where-Object {$_.name -match "video"}</code>
поиск класса по имени, его свойств и методов<br />
<code>Get-WmiObject -ComputerName localhost -Class Win32_VideoController</code>
отобразить содержимое свойств класса</p>
<p><code>gwmi -List | where name -match "service" | ft -auto</code> если
в таблице присутствуют Methods, то можно взаимодействовать
{StartService, StopService}<br />
<code>gwmi -Class win32_service | select *</code> отобразить список всех
служб и всех их свойств<br />
<code>Get-CimInstance Win32_service</code> обращается на прямую к
“root”<br />
<code>gwmi win32_service -Filter "name='Zabbix Agent'"</code>
отфильтровать вывод по имени<br />
<code>(gwmi win32_service -Filter "name='Zabbix Agent'").State</code>
отобразить конкретное свойство<br />
<code>gwmi win32_service -Filter "State = 'Running'"</code>
отфильтровать запущенные службы<br />
<code>gwmi win32_service -Filter "StartMode = 'Auto'"</code>
отфильтровать службы по методу запуска<br />
<code>gwmi -Query 'select * from win32_service where startmode="Auto"'</code>
WQL-запрос (WMI Query Language)<br />
<code>gwmi win32_service | Get-Member -MemberType Method</code>
отобразить все методы взаимодействия с описание применения (Delete,
StartService)<br />
<code>(gwmi win32_service -Filter 'name="Zabbix Agent"').Delete()</code>
удалить службу<br />
<code>(gwmi win32_service -Filter 'name="MSSQL$MSSQLE"').StartService()</code>
запустить службу</p>
<p><code>Get-CimInstance -ComputerName $srv Win32_OperatingSystem | select LastBootUpTime</code>
время последнего включения<br />
<code>gwmi -ComputerName $srv -Class Win32_OperatingSystem | select LocalDateTime,LastBootUpTime</code>
текущее время и время последнего включения<br />
<code>gwmi Win32_OperatingSystem | Get-Member -MemberType Method</code>
методы reboot и shutdown<br />
<code>(gwmi Win32_OperatingSystem -EnableAllPrivileges).Reboot()</code>
используется с ключем повышения привелегий<br />
<code>(gwmi Win32_OperatingSystem -EnableAllPrivileges).Win32Shutdown(0)</code>
завершение сеанса пользователя</p>
<div class="sourceCode" id="cb129"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb129-1"><a href="#cb129-1" aria-hidden="true" tabindex="-1"></a><span class="va">$system</span> <span class="op">=</span> <span class="fu">Get-WmiObject</span> <span class="op">-</span>Class Win32_OperatingSystem</span>
<span id="cb129-2"><a href="#cb129-2" aria-hidden="true" tabindex="-1"></a><span class="va">$InstallDate</span> <span class="op">=</span> <span class="op">[</span>Management<span class="op">.</span><span class="fu">ManagementDateTimeconverter</span><span class="op">]::</span>ToDateTime<span class="op">(</span><span class="va">$system</span><span class="op">.</span><span class="fu">installdate</span><span class="op">)</span><span class="ch">` </span>Получаем дату установки ОС</span>
<span id="cb129-3"><a href="#cb129-3" aria-hidden="true" tabindex="-1"></a><span class="va">$AfterInstallDays</span> <span class="op">=</span> <span class="op">((</span><span class="fu">Get-Date</span><span class="op">)</span><span class="va">$Installdate</span><span class="op">).</span><span class="fu">Days</span><span class="ch">` </span>Вычисляем время<span class="op">,</span> прошедшее с момента установки</span>
<span id="cb129-4"><a href="#cb129-4" aria-hidden="true" tabindex="-1"></a><span class="va">$ShortInstallDate</span> <span class="op">=</span> <span class="st">&quot;{0:yyyy-MM-dd HH:MM}&quot;</span> <span class="op">-</span>f <span class="op">(</span><span class="va">$InstallDate</span><span class="op">)</span></span>
<span id="cb129-5"><a href="#cb129-5" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;Система установлена: </span><span class="va">$ShortInstallDate</span><span class="st"> (Прошло </span><span class="va">$AfterInstalldays</span><span class="st"> дней)&quot;</span></span></code></pre></div>
<p><code>(Get-WmiObject win32_battery).estimatedChargeRemaining</code>
заряд батареи в процентах<br />
<code>gwmi Win32_UserAccount</code> доменные пользователи<br />
<code>(gwmi Win32_SystemUsers).PartComponent</code><br />
<code>Get-CimInstance -ClassName Win32_LogonSession</code><br />
<code>Get-CimInstance -ClassName Win32_BIOS</code></p>
<p><code>gwmi -list -Namespace root\CIMV2\Terminalservices</code><br />
<code>(gwmi -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).AllowTSConnections</code><br />
<code>(gwmi -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).SetAllowTSConnections(1)</code>
включить RDP</p>
<pre><code>$srv = &quot;localhost&quot;
gwmi Win32_logicalDisk -ComputerName $srv | where {$_.Size -ne $null} | select @{
Label=&quot;Value&quot;; Expression={$_.DeviceID}}, @{Label=&quot;AllSize&quot;; Expression={
[string]([int]($_.Size/1Gb))+&quot; GB&quot;}},@{Label=&quot;FreeSize&quot;; Expression={
[string]([int]($_.FreeSpace/1Gb))+&quot; GB&quot;}}, @{Label=&quot;Free%&quot;; Expression={
[string]([int]($_.FreeSpace/$_.Size*100))+&quot; %&quot;}}</code></pre>
<h3 id="nla-network-level-authentication">NLA (Network Level
Authentication)</h3>
<p><code>(gwmi -class "Win32_TSGeneralSetting" -Namespace root\cimv2\Terminalservices -Filter "TerminalName='RDP-tcp'").UserAuthenticationRequired</code><br />
<code>(gwmi -class "Win32_TSGeneralSetting" -Namespace root\cimv2\Terminalservices -Filter "TerminalName='RDP-tcp'").SetUserAuthenticationRequired(1)</code>
включить NLA<br />
<code>Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name SecurityLayer</code>
отобразить значение (2)<br />
<code>Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name UserAuthentication</code>
отобразить значение (1)<br />
<code>Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name SecurityLayer -Value 0</code>
изменить значение<br />
<code>Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name UserAuthentication -Value 0</code><br />
<code>REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters /v AllowEncryptionOracle /t REG_DWORD /d 2</code>
отключить на клиентском компьютере проверку версии CredSSP, если на
целевом комьютере-сервере не установлены обновления KB4512509 от мая
2018 года</p>
<h1 id="regedit">Regedit</h1>
<p><code>Get-PSDrive</code> список всех доступных дисков/разделов, их
размер и веток реестра<br />
<code>cd HKLM:\</code> HKEY_LOCAL_MACHINE<br />
<code>cd HKCU:\</code> HKEY_CURRENT_USER<br />
<code>Get-Item</code> получить информацию о ветке реестра<br />
<code>New-Item</code> создать новый раздел реестра<br />
<code>Remove-Item</code> удалить ветку реестра<br />
<code>Get-ItemProperty</code> получить значение ключей/параметров
реестра (это свойства ветки реестра, аналогично свойствам файла)<br />
<code>Set-ItemProperty</code> изменить название или значение параметра
реестра<br />
<code>New-ItemProperty</code> создать параметр реестра<br />
<code>Remove-ItemProperty</code> удалить параметр</p>
<p><code>Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select DisplayName</code>
список установленных программ<br />
<code>Get-Item HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002</code>
посмотреть содержимое Items<br />
<code>(Get-ItemProperty HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002)."New Signature"</code>
отобразить значение (Value) свойства (Property) Items<br />
<code>$reg_path = "HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002"</code><br />
<code>$sig_name = "auto"</code><br />
<code>Set-ItemProperty -Path $reg_path -Name "New Signature" -Value $sig_name</code>
изменить или добавить в корне ветки (Path) свойство (Name) со значением
(Value)<br />
<code>Set-ItemProperty -Path $reg_path -Name "Reply-Forward Signature" -Value $sig_name</code></p>
<pre><code>Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskmgr.exe]
&quot;Debugger&quot;=&quot;\&quot;C:\\Windows\\System32\\Taskmgr.exe\&quot;&quot;</code></pre>
<h1 id="performance">Performance</h1>
<p><code>lodctr /R</code> пересоздать счетчиков производительности из
системного хранилища архивов (так же исправляет счетчики для CIM,
например, для cpu Win32_PerfFormattedData_PerfOS_Processor и iops
Win32_PerfFormattedData_PerfDisk_PhysicalDisk)<br />
<code>(Get-Counter -ListSet *).CounterSetName</code> вывести список всех
доступных счетчиков производительности в системе<br />
<code>(Get-Counter -ListSet *memory*).Counter</code> поиск по
wildcard-имени во всех счетчиках (включая дочернии)<br />
<code>Get-Counter "\Memory\Available MBytes"</code> объем свободной
оперативной памяти<br />
<code>Get-Counter -cn $srv "\LogicalDisk(*)\% Free Space"</code> %
свободного места на всех разделах дисков<br />
<code>(Get-Counter "\Process(*)\ID Process").CounterSamples</code><br />
<code>Get-Counter "\Processor(_Total)\% Processor Time" ComputerName $srv -MaxSamples 5 -SampleInterval 2</code>
5 проверок каждые 2 секунды<br />
<code>Get-Counter "\Процессор(_Total)\% загруженности процессора" -Continuous</code>
непрерывно<br />
<code>(Get-Counter "\Процессор(*)\% загруженности процессора").CounterSamples</code></p>
<p><code>(Get-Counter -ListSet *интерфейс*).Counter</code> найти все
счетчики<br />
<code>Get-Counter "\Сетевой интерфейс(*)\Всего байт/с"</code> отобразить
все адаптеры (выбрать действующий по трафику)</p>
<div class="sourceCode" id="cb132"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb132-1"><a href="#cb132-1" aria-hidden="true" tabindex="-1"></a><span class="va">$WARNING</span> <span class="op">=</span> <span class="dv">25</span></span>
<span id="cb132-2"><a href="#cb132-2" aria-hidden="true" tabindex="-1"></a><span class="va">$CRITICAL</span> <span class="op">=</span> <span class="dv">50</span></span>
<span id="cb132-3"><a href="#cb132-3" aria-hidden="true" tabindex="-1"></a><span class="va">$TransferRate</span> <span class="op">=</span> <span class="op">((</span><span class="fu">Get-Counter</span> <span class="st">&quot;\\huawei-mb-x-pro\сетевой интерфейс(intel[r] wi-fi 6e ax211 160mhz)\всего байт/с&quot;</span></span>
<span id="cb132-4"><a href="#cb132-4" aria-hidden="true" tabindex="-1"></a><span class="op">).</span><span class="fu">countersamples</span> <span class="op">|</span> <span class="fu">select</span> <span class="op">-</span>ExpandProperty CookedValue<span class="op">)*</span><span class="dv">8</span></span>
<span id="cb132-5"><a href="#cb132-5" aria-hidden="true" tabindex="-1"></a><span class="va">$NetworkUtilisation</span> <span class="op">=</span> <span class="op">[</span>math<span class="op">]::</span>round<span class="op">(</span><span class="va">$TransferRate</span><span class="op">/</span><span class="dv">1000000000</span><span class="op">*</span><span class="dv">100</span><span class="op">,</span><span class="dv">2</span><span class="op">)</span></span>
<span id="cb132-6"><a href="#cb132-6" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$NetworkUtilisation</span> <span class="op">-gt</span> <span class="va">$CRITICAL</span><span class="op">){</span></span>
<span id="cb132-7"><a href="#cb132-7" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Output</span> <span class="st">&quot;CRITICAL: </span><span class="op">$(</span><span class="va">$NetworkUtilisation</span><span class="op">)</span><span class="st"> % Network utilisation, </span><span class="op">$(</span><span class="va">$TransferRate</span><span class="op">.</span><span class="fu">ToString</span><span class="op">(</span><span class="st">&#39;N0&#39;</span><span class="op">)</span><span class="st">) b/s&quot;</span> </span>
<span id="cb132-8"><a href="#cb132-8" aria-hidden="true" tabindex="-1"></a><span class="co">#exit 2 </span></span>
<span id="cb132-9"><a href="#cb132-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb132-10"><a href="#cb132-10" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$NetworkUtilisation</span> <span class="op">-gt</span> <span class="va">$WARNING</span><span class="op">){</span></span>
<span id="cb132-11"><a href="#cb132-11" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Output</span> <span class="st">&quot;WARNING: </span><span class="op">$(</span><span class="va">$NetworkUtilisation</span><span class="op">)</span><span class="st"> % Network utilisation, </span><span class="op">$(</span><span class="va">$TransferRate</span><span class="op">.</span><span class="fu">ToString</span><span class="op">(</span><span class="st">&#39;N0&#39;</span><span class="op">)</span><span class="st">) b/s&quot;</span></span>
<span id="cb132-12"><a href="#cb132-12" aria-hidden="true" tabindex="-1"></a><span class="co">#exit 1</span></span>
<span id="cb132-13"><a href="#cb132-13" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb132-14"><a href="#cb132-14" aria-hidden="true" tabindex="-1"></a><span class="fu">Write-Output</span> <span class="st">&quot;OK: </span><span class="op">$(</span><span class="va">$NetworkUtilisation</span><span class="op">)</span><span class="st"> % Network utilisation, </span><span class="op">$(</span><span class="va">$TransferRate</span><span class="op">.</span><span class="fu">ToString</span><span class="op">(</span><span class="st">&#39;N0&#39;</span><span class="op">)</span><span class="st">) b/s&quot;</span> </span>
<span id="cb132-15"><a href="#cb132-15" aria-hidden="true" tabindex="-1"></a><span class="co">#exit 0</span></span></code></pre></div>
<h1 id="snmp">SNMP</h1>
<h3 id="setup-snmp-service">Setup SNMP Service</h3>
<p><code>Install-WindowsFeature SNMP-Service,SNMP-WMI-Provider -IncludeManagementTools</code>
установить роль SNMP и WMI провайдер через Server Manager<br />
<code>Get-WindowsFeature SNMP*</code><br />
<code>Add-WindowsCapability -Online -Name SNMP.Client~~~~0.0.1.0</code>
установить компонент Feature On Demand для Windows
10/11<code>\</code>Get-Service SNMP<em><code>\</code>Get-NetFirewallrule
-DisplayName </em>snmp* | ft<code>\</code>Get-NetFirewallrule
-DisplayName <em>snmp</em> | Enable-NetFirewallRule`</p>
<h3 id="setting-snmp-service-via-regedit">Setting SNMP Service via
Regedit</h3>
<p>Agent:<br />
<code>New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\RFC1156Agent" -Name "sysContact" -Value "lifailon-user"</code>
создать (New) или изменить (Set)<br />
<code>New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\RFC1156Agent" -Name "sysLocation" -Value "plex-server"</code></p>
<p>Security:<br />
<code>New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\public"</code>
создать новый community string<br />
<code>New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\ValidCommunities" -Name "public" -Value 16</code>
назначить права на public<br />
<code>1 — NONE</code><br />
<code>2 — NOTIFY</code> позволяет получать SNMP ловушки<br />
<code>4 — READ ONLY</code> позволяет получать данные с устройства<br />
<code>8 — READ WRITE</code> позволяет получать данные и изменять
конфигурацию устройства<br />
<code>16 — READ CREATE</code> позволяет читать данные, изменять и
создавать объекты<br />
<code>New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\PermittedManagers" -Name "1" -Value "192.168.3.99"</code>
от кого разрешено принимать запросы<br />
<code>Get-Service SNMP | Restart-Service</code></p>
<h3 id="snmpwalk">snmpwalk</h3>
<p><code>snmpwalk -v 2c -c public 192.168.3.100</code><br />
<code>snmpwalk -v 2c -c public -O e 192.168.3.100</code></p>
<h3 id="modules">Modules</h3>
<p><code>Install-Module -Name SNMP</code><br />
<code>Get-SnmpData -IP 192.168.3.100 -OID 1.3.6.1.2.1.1.4.0 -UDPport 161 -Community public</code><br />
<code>(Get-SnmpData -IP 192.168.3.100 -OID 1.3.6.1.2.1.1.4.0).Data</code><br />
<code>Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.1</code>
пройтись по дереву OID<br />
<code>Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.25.6.3.1.2</code>
список установленного ПО<br />
<code>Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.25.2.3.1</code>
список разделов и памяти (C: D: Virtual Memory и Physical Memory)<br />
<code>Set-SnmpData</code> изменение данных на удаленном устройстве</p>
<p><code>Install-Module -Name SNMPv3</code><br />
<code>Invoke-SNMPv3Get</code> получение данных по одному OID<br />
<code>Invoke-SNMPv3Set</code> изменение данных<br />
<code>Invoke-SNMPv3Walk</code> обход по дереву OID<br />
<code>Invoke-SNMPv3Walk -UserName lifailon -Target 192.168.3.100 -AuthSecret password -PrivSecret password -OID 1.3.6.1.2.1.1 -AuthType MD5 -PrivType AES128</code></p>
<h3 id="lextm.sharpsnmplib">Lextm.SharpSnmpLib</h3>
<p>https://api.nuget.org/v3-flatcontainer/lextm.sharpsnmplib/12.5.2/lextm.sharpsnmplib.12.5.2.nupkg<br />
<code>Add-Type -LiteralPath "$home\Desktop\lextm.sharpsnmplib-12.5.2\net471\SharpSnmpLib.dll"</code></p>
<div class="sourceCode" id="cb133"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb133-1"><a href="#cb133-1" aria-hidden="true" tabindex="-1"></a><span class="va">$port</span> <span class="op">=</span> <span class="dv">161</span></span>
<span id="cb133-2"><a href="#cb133-2" aria-hidden="true" tabindex="-1"></a><span class="va">$OID</span> <span class="op">=</span> <span class="st">&quot;1.3.6.1.2.1.1.4.0&quot;</span></span>
<span id="cb133-3"><a href="#cb133-3" aria-hidden="true" tabindex="-1"></a><span class="va">$variableList</span> <span class="op">=</span> <span class="fu">New-Object</span> Collections<span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">Variable</span><span class="op">]</span></span>
<span id="cb133-4"><a href="#cb133-4" aria-hidden="true" tabindex="-1"></a><span class="va">$variableList</span><span class="op">.</span><span class="fu">Add</span><span class="op">([</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">Variable</span><span class="op">]::</span>new<span class="op">([</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">ObjectIdentifier</span><span class="op">]::</span>new<span class="op">(</span><span class="va">$OID</span><span class="op">)))</span></span>
<span id="cb133-5"><a href="#cb133-5" aria-hidden="true" tabindex="-1"></a><span class="va">$timeout</span> <span class="op">=</span> <span class="dv">3000</span></span>
<span id="cb133-6"><a href="#cb133-6" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Net<span class="op">.</span><span class="fu">IPAddress</span><span class="op">]</span><span class="va">$ip</span> <span class="op">=</span> <span class="st">&quot;192.168.3.100&quot;</span></span>
<span id="cb133-7"><a href="#cb133-7" aria-hidden="true" tabindex="-1"></a><span class="va">$endpoint</span> <span class="op">=</span> <span class="fu">New-Object</span> Net<span class="op">.</span><span class="fu">IpEndPoint</span> <span class="va">$ip</span><span class="op">,</span> <span class="va">$port</span></span>
<span id="cb133-8"><a href="#cb133-8" aria-hidden="true" tabindex="-1"></a><span class="va">$Community</span> <span class="op">=</span> <span class="st">&quot;public&quot;</span></span>
<span id="cb133-9"><a href="#cb133-9" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">VersionCode</span><span class="op">]</span><span class="va">$Version</span> <span class="op">=</span> <span class="st">&quot;V2&quot;</span></span>
<span id="cb133-10"><a href="#cb133-10" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb133-11"><a href="#cb133-11" aria-hidden="true" tabindex="-1"></a><span class="va">$message</span> <span class="op">=</span> <span class="op">[</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">Messaging</span><span class="op">.</span><span class="fu">Messenger</span><span class="op">]::</span>Get<span class="op">(</span></span>
<span id="cb133-12"><a href="#cb133-12" aria-hidden="true" tabindex="-1"></a><span class="va">$Version</span><span class="op">,</span></span>
<span id="cb133-13"><a href="#cb133-13" aria-hidden="true" tabindex="-1"></a><span class="va">$endpoint</span><span class="op">,</span></span>
<span id="cb133-14"><a href="#cb133-14" aria-hidden="true" tabindex="-1"></a><span class="va">$Community</span><span class="op">,</span></span>
<span id="cb133-15"><a href="#cb133-15" aria-hidden="true" tabindex="-1"></a><span class="va">$variableList</span><span class="op">,</span></span>
<span id="cb133-16"><a href="#cb133-16" aria-hidden="true" tabindex="-1"></a><span class="va">$TimeOut</span></span>
<span id="cb133-17"><a href="#cb133-17" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
<span id="cb133-18"><a href="#cb133-18" aria-hidden="true" tabindex="-1"></a><span class="va">$message</span><span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">ToString</span><span class="op">()</span></span></code></pre></div>
<h3 id="walk">Walk</h3>
<div class="sourceCode" id="cb134"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb134-1"><a href="#cb134-1" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">ObjectIdentifier</span><span class="op">]</span><span class="va">$OID</span> <span class="op">=</span> <span class="st">&quot;1.3.6.1.2.1.1&quot;</span> <span class="co"># дерево или конечный OID</span></span>
<span id="cb134-2"><a href="#cb134-2" aria-hidden="true" tabindex="-1"></a><span class="va">$WalkMode</span> <span class="op">=</span> <span class="op">[</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">Messaging</span><span class="op">.</span><span class="fu">WalkMode</span><span class="op">]::</span>WithinSubtree <span class="co"># режим обхода по дереву</span></span>
<span id="cb134-3"><a href="#cb134-3" aria-hidden="true" tabindex="-1"></a><span class="va">$results</span> <span class="op">=</span> <span class="fu">New-Object</span> Collections<span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">Variable</span><span class="op">]</span></span>
<span id="cb134-4"><a href="#cb134-4" aria-hidden="true" tabindex="-1"></a><span class="va">$message</span> <span class="op">=</span> <span class="op">[</span>Lextm<span class="op">.</span><span class="fu">SharpSnmpLib</span><span class="op">.</span><span class="fu">Messaging</span><span class="op">.</span><span class="fu">Messenger</span><span class="op">]::</span>Walk<span class="op">(</span></span>
<span id="cb134-5"><a href="#cb134-5" aria-hidden="true" tabindex="-1"></a> <span class="va">$Version</span><span class="op">,</span></span>
<span id="cb134-6"><a href="#cb134-6" aria-hidden="true" tabindex="-1"></a> <span class="va">$endpoint</span><span class="op">,</span></span>
<span id="cb134-7"><a href="#cb134-7" aria-hidden="true" tabindex="-1"></a> <span class="va">$Community</span><span class="op">,</span></span>
<span id="cb134-8"><a href="#cb134-8" aria-hidden="true" tabindex="-1"></a> <span class="va">$OID</span><span class="op">,</span></span>
<span id="cb134-9"><a href="#cb134-9" aria-hidden="true" tabindex="-1"></a> <span class="va">$results</span><span class="op">,</span></span>
<span id="cb134-10"><a href="#cb134-10" aria-hidden="true" tabindex="-1"></a> <span class="va">$TimeOut</span><span class="op">,</span></span>
<span id="cb134-11"><a href="#cb134-11" aria-hidden="true" tabindex="-1"></a> <span class="va">$WalkMode</span></span>
<span id="cb134-12"><a href="#cb134-12" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
<span id="cb134-13"><a href="#cb134-13" aria-hidden="true" tabindex="-1"></a><span class="va">$results</span></span>
<span id="cb134-14"><a href="#cb134-14" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb134-15"><a href="#cb134-15" aria-hidden="true" tabindex="-1"></a><span class="va">$results2</span> <span class="op">=</span> <span class="op">@()</span></span>
<span id="cb134-16"><a href="#cb134-16" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$d</span> <span class="kw">in</span> <span class="va">$results</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb134-17"><a href="#cb134-17" aria-hidden="true" tabindex="-1"></a><span class="va">$results2</span> <span class="op">+=[</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span><span class="st">&#39;ID&#39;</span><span class="op">=</span><span class="va">$d</span><span class="op">.</span><span class="fu">id</span><span class="op">.</span><span class="fu">ToString</span><span class="op">();</span><span class="st">&#39;Data&#39;</span><span class="op">=</span><span class="va">$d</span><span class="op">.</span><span class="fu">Data</span><span class="op">.</span><span class="fu">ToString</span><span class="op">()}</span> <span class="co"># перекодировать вывод построчно в строку</span></span>
<span id="cb134-18"><a href="#cb134-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb134-19"><a href="#cb134-19" aria-hidden="true" tabindex="-1"></a><span class="va">$results2</span></span></code></pre></div>
<h1 id="zabbix">Zabbix</h1>
<h3 id="zabbix-agent-deploy">Zabbix Agent Deploy</h3>
<div class="sourceCode" id="cb135"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb135-1"><a href="#cb135-1" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="st">&quot;https://cdn.zabbix.com/zabbix/binaries/stable/6.4/6.4.5/zabbix_agent2-6.4.5-windows-amd64-static.zip&quot;</span></span>
<span id="cb135-2"><a href="#cb135-2" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Downloads\zabbix-agent2-6.4.5.zip&quot;</span></span>
<span id="cb135-3"><a href="#cb135-3" aria-hidden="true" tabindex="-1"></a><span class="va">$WebClient</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">WebClient</span></span>
<span id="cb135-4"><a href="#cb135-4" aria-hidden="true" tabindex="-1"></a><span class="va">$WebClient</span><span class="op">.</span><span class="fu">DownloadFile</span><span class="op">(</span><span class="va">$url</span><span class="op">,</span> <span class="va">$path</span><span class="op">)</span><span class="ch">` </span>скачать файл</span>
<span id="cb135-5"><a href="#cb135-5" aria-hidden="true" tabindex="-1"></a>Expand-Archive <span class="va">$path</span> <span class="op">-</span>DestinationPath <span class="st">&quot;C:\zabbix-agent2-6.4.5\&quot;</span><span class="ch">` </span>разархивировать</span>
<span id="cb135-6"><a href="#cb135-6" aria-hidden="true" tabindex="-1"></a><span class="fu">Remove-Item</span> <span class="va">$path</span><span class="ch">` </span>удалить архив</span>
<span id="cb135-7"><a href="#cb135-7" aria-hidden="true" tabindex="-1"></a>New-NetFirewallRule <span class="op">-</span>DisplayName <span class="st">&quot;Zabbix-Agent&quot;</span> <span class="op">-</span>Profile Any <span class="op">-</span>Direction Inbound <span class="op">-</span>Action Allow <span class="op">-</span>Protocol TCP <span class="op">-</span>LocalPort <span class="dv">10050</span><span class="op">,</span><span class="dv">10051</span><span class="ch">` </span>открыть порты в <span class="fu">FW</span></span>
<span id="cb135-8"><a href="#cb135-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb135-9"><a href="#cb135-9" aria-hidden="true" tabindex="-1"></a><span class="va">$Zabbix_Server</span> <span class="op">=</span> <span class="st">&quot;192.168.3.102&quot;</span></span>
<span id="cb135-10"><a href="#cb135-10" aria-hidden="true" tabindex="-1"></a><span class="va">$conf</span> <span class="op">=</span> <span class="st">&quot;C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.conf&quot;</span></span>
<span id="cb135-11"><a href="#cb135-11" aria-hidden="true" tabindex="-1"></a><span class="va">$cat</span> <span class="op">=</span> <span class="fu">cat</span> <span class="va">$conf</span></span>
<span id="cb135-12"><a href="#cb135-12" aria-hidden="true" tabindex="-1"></a><span class="va">$rep</span> <span class="op">=</span> <span class="va">$cat</span> <span class="op">-replace</span> <span class="st">&quot;Server=.+&quot;</span><span class="op">,</span><span class="st">&quot;Server=</span><span class="va">$Zabbix_Server</span><span class="st">&quot;</span></span>
<span id="cb135-13"><a href="#cb135-13" aria-hidden="true" tabindex="-1"></a><span class="va">$rep</span> <span class="op">|</span> <span class="fu">Select-String</span> Server<span class="op">=</span></span>
<span id="cb135-14"><a href="#cb135-14" aria-hidden="true" tabindex="-1"></a><span class="va">$rep</span> <span class="op">&gt;</span> <span class="va">$conf</span></span>
<span id="cb135-15"><a href="#cb135-15" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb135-16"><a href="#cb135-16" aria-hidden="true" tabindex="-1"></a><span class="va">$exe</span> <span class="op">=</span> <span class="st">&quot;C:\zabbix-agent2-6.4.5\bin\zabbix_agent2.exe&quot;</span></span>
<span id="cb135-17"><a href="#cb135-17" aria-hidden="true" tabindex="-1"></a><span class="op">.</span><span class="va">$exe</span> <span class="op">--</span>config <span class="va">$conf</span> <span class="op">--</span>install<span class="ch">` </span>установить службу</span>
<span id="cb135-18"><a href="#cb135-18" aria-hidden="true" tabindex="-1"></a><span class="fu">Get-Service</span> <span class="op">*</span>Zabbix<span class="op">*</span>Agent<span class="op">*</span> <span class="op">|</span> Start-Service<span class="ch">` </span>запустить службу</span>
<span id="cb135-19"><a href="#cb135-19" aria-hidden="true" tabindex="-1"></a><span class="co">#.$exe --config $conf --uninstall` удалить службу</span></span></code></pre></div>
<h3 id="zabbix_sender">zabbix_sender</h3>
<p>Создать host - задать произвольное имя (powershell-host) и добавить в
группу<br />
Создать Items:<br />
Name: Service Count<br />
Type: Zabbix trapper<br />
Key: service.count<br />
Type of Information: Numeric</p>
<div class="sourceCode" id="cb136"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb136-1"><a href="#cb136-1" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span> <span class="op">=</span> <span class="st">&quot;C:\zabbix-agent2-6.4.5\bin&quot;</span></span>
<span id="cb136-2"><a href="#cb136-2" aria-hidden="true" tabindex="-1"></a><span class="va">$scount</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Get-Service</span><span class="op">).</span><span class="fu">Count</span></span>
<span id="cb136-3"><a href="#cb136-3" aria-hidden="true" tabindex="-1"></a><span class="op">.</span><span class="va">$path</span>\zabbix_sender<span class="op">.</span><span class="fu">exe</span> <span class="op">-</span>z <span class="dv">192.168</span><span class="op">.</span><span class="dv">3.102</span> <span class="op">-</span>s <span class="st">&quot;powershell-host&quot;</span> <span class="op">-</span>k service<span class="op">.</span><span class="fu">count</span> <span class="op">-</span>o <span class="va">$scount</span></span></code></pre></div>
<h3 id="zabbix_get">zabbix_get</h3>
<p><code>apt install zabbix-get</code><br />
<code>nano /etc/zabbix/zabbix_agentd.conf</code><br />
<code>Server=127.0.0.1,192.168.3.102,192.168.3.99</code> добавить
сервера для получения данных zabbix_get с агента (как их запрашивает
сервер)</p>
<p><code>.$path\zabbix_get -s 192.168.3.101 -p 10050 -k agent.version</code>
проверить версию агента<br />
<code>.$path\zabbix_get -s 192.168.3.101 -p 10050 -k agent.ping</code> 1
- ok<br />
<code>.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.discovery</code>
список сетевых интерфейсов<br />
<code>.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.in["ens33"]</code><br />
<code>.$path\zabbix_get -s 192.168.3.101 -p 10050 -k net.if.out["ens33"]</code></p>
<h3 id="userparameter">UserParameter</h3>
<p><code>UserParameter=process.count,powershell -Command "(Get-Process).Count"</code><br />
<code>UserParameter=process.vm[*],powershell -Command "(Get-Process $1).ws"</code></p>
<p>Test:<br />
<code>C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.count</code><br />
<code>C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.vm[zabbix_agent2]</code><br />
<code>C:\zabbix-agent2-6.4.5\bin\zabbix_get.exe -s 127.0.0.1 -p 10050 -k process.vm[powershell]</code></p>
<p>Создать новые Items:<br />
key: <code>process.count</code><br />
key: <code>process.vm[zabbix_agent2]</code></p>
<h3 id="include">Include</h3>
<ul>
<li><p>Добавить параметр Include для включения конфигурационных файлов
подключаемых плагинов
<code>'Include=.\zabbix_agent2.d\plugins.d\*.conf' &gt;&gt; C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.conf</code></p></li>
<li><p>Создать конфигурационный файл с пользовательскими параметрами в
каталоге, путь к которому указан в zabbix_agentd.conf<br />
<code>'UserParameter=Get-Query-Param[*],powershell.exe -noprofile -executionpolicy bypass -File C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\scripts\User-Sessions\Get-Query-Param.ps1 $1' &gt; C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\plugins.d\User-Sessions.conf</code></p></li>
<li><p>Поместить скрипт Get-Query-Param.ps1 в каталог, путь к которому
указан в User-Sessions.conf. Скрипт содержим пользовательские параметры,
которые он принимает от Zabbix сервера для передачи их в функции
скрипта.</p></li>
</ul>
<div class="sourceCode" id="cb137"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb137-1"><a href="#cb137-1" aria-hidden="true" tabindex="-1"></a><span class="kw">Param</span><span class="op">([</span><span class="dt">string</span><span class="op">]</span><span class="va">$select</span><span class="op">)</span></span>
<span id="cb137-2"><a href="#cb137-2" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$select</span> <span class="op">-eq</span> <span class="st">&quot;ACTIVEUSER&quot;</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb137-3"><a href="#cb137-3" aria-hidden="true" tabindex="-1"></a><span class="op">(</span>Get-Query <span class="op">|</span> <span class="fu">where</span> status <span class="op">-match</span> <span class="st">&quot;Active&quot;</span><span class="op">).</span><span class="fu">User</span></span>
<span id="cb137-4"><a href="#cb137-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb137-5"><a href="#cb137-5" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$select</span> <span class="op">-eq</span> <span class="st">&quot;INACTIVEUSER&quot;</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb137-6"><a href="#cb137-6" aria-hidden="true" tabindex="-1"></a><span class="op">(</span>Get-Query <span class="op">|</span> <span class="fu">where</span> status <span class="op">-match</span> <span class="st">&quot;Disconnect&quot;</span><span class="op">).</span><span class="fu">User</span></span>
<span id="cb137-7"><a href="#cb137-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb137-8"><a href="#cb137-8" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$select</span> <span class="op">-eq</span> <span class="st">&quot;ACTIVECOUNT&quot;</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb137-9"><a href="#cb137-9" aria-hidden="true" tabindex="-1"></a><span class="op">(</span>Get-Query <span class="op">|</span> <span class="fu">where</span> status <span class="op">-match</span> <span class="st">&quot;Active&quot;</span><span class="op">).</span><span class="fu">Status</span><span class="op">.</span><span class="fu">Count</span></span>
<span id="cb137-10"><a href="#cb137-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb137-11"><a href="#cb137-11" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="op">(</span><span class="va">$select</span> <span class="op">-eq</span> <span class="st">&quot;INACTIVECOUNT&quot;</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb137-12"><a href="#cb137-12" aria-hidden="true" tabindex="-1"></a><span class="op">(</span>Get-Query <span class="op">|</span> <span class="fu">where</span> status <span class="op">-match</span> <span class="st">&quot;Disconnect&quot;</span><span class="op">).</span><span class="fu">Status</span><span class="op">.</span><span class="fu">Count</span></span>
<span id="cb137-13"><a href="#cb137-13" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<ul>
<li>Проверить работу скрипта:</li>
</ul>
<p><code>$path = "C:\zabbix-agent2-6.4.5\conf\zabbix_agent2.d\scripts\User-Sessions"</code><br />
<code>.$path\Get-Query-Param.ps1 ACTIVEUSER</code><br />
<code>.$path\Get-Query-Param.ps1 INACTIVEUSER</code><br />
<code>.$path\Get-Query-Param.ps1 ACTIVECOUNT</code><br />
<code>.$path\Get-Query-Param.ps1 INACTIVECOUNT</code></p>
<ul>
<li>Создать Items с ключами:</li>
</ul>
<p><code>Get-Query-Param[ACTIVEUSER]</code> Type: Text<br />
<code>Get-Query-Param[INACTIVEUSER]</code> Type: Text<br />
<code>Get-Query-Param[ACTIVECOUNT]</code> Type: Int<br />
<code>Get-Query-Param[INACTIVECOUNT]</code> Type: Int</p>
<ul>
<li>Макросы:</li>
</ul>
<p><code>{$ACTIVEMAX} = 16</code><br />
<code>{$ACTIVEMIN} = 0</code></p>
<ul>
<li>Триггеры:</li>
</ul>
<p><code>last(/Windows-User-Sessions/Get-Query-Param[ACTIVECOUNT])&gt;{$ACTIVEMAX}</code><br />
<code>min(/Windows-User-Sessions/Get-Query-Param[ACTIVECOUNT],24h)={$ACTIVEMIN}</code></p>
<h3 id="zabbix_agent2.conf">zabbix_agent2.conf</h3>
<pre><code># Агент может работать в пассивном (сервер забирает сам информацию) и активном режиме (агент сам отправляет):
Server=192.168.3.102
ServerActive=192.168.3.102
# Требуется указать hostname для ServerActive:
Hostname=huawei-book-01
# Если не указано, используется для генерации имени хоста (игнорируется, если имя хоста определено):
# HostnameItem=system.hostname
# Как часто обновляется список активных проверок, в секундах (Range: 60-3600):
RefreshActiveChecks=120
# IP-адрес источника для исходящих соединений:
# SourceIP=
# Агент будет слушать на этом порту соединения с сервером (Range: 1024-32767):
# ListenPort=10050
# Список IP-адресов, которые агент должен прослушивать через запятую
# ListenIP=0.0.0.0
# Агент будет прослушивать этот порт для запросов статуса HTTP (Range: 1024-32767):
# StatusPort=
ControlSocket=\\.\pipe\agent.sock
# Куда вести журнал (file/syslog/console):
LogType=file
LogFile=C:\zabbix-agent2-6.4.5\zabbix_agent2.log
# Размер лога от 0-1024 MB (0 - отключить автоматическую ротацию логов)
LogFileSize=100
# Уровень логирования. 4 - для отладки (выдает много информации)
DebugLevel=4</code></pre>
<h3 id="api-token">API Token</h3>
<p>https://www.zabbix.com/documentation/current/en/manual/api/reference</p>
<p><code>$ip = "192.168.3.102"</code><br />
<code>$url = "http://$ip/zabbix/api_jsonrpc.php"</code></p>
<div class="sourceCode" id="cb139"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb139-1"><a href="#cb139-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb139-2"><a href="#cb139-2" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;jsonrpc&quot;</span><span class="op">=</span><span class="st">&quot;2.0&quot;</span><span class="op">;</span></span>
<span id="cb139-3"><a href="#cb139-3" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;method&quot;</span><span class="op">=</span><span class="st">&quot;user.login&quot;</span><span class="op">;</span></span>
<span id="cb139-4"><a href="#cb139-4" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;params&quot;</span><span class="op">=</span>@<span class="op">{</span></span>
<span id="cb139-5"><a href="#cb139-5" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;username&quot;</span><span class="op">=</span><span class="st">&quot;Admin&quot;</span><span class="op">;</span><span class="ch">` </span>в версии до <span class="dv">6.4</span> параметр <span class="st">&quot;user&quot;</span></span>
<span id="cb139-6"><a href="#cb139-6" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;password&quot;</span><span class="op">=</span><span class="st">&quot;zabbix&quot;</span><span class="op">;</span></span>
<span id="cb139-7"><a href="#cb139-7" aria-hidden="true" tabindex="-1"></a> <span class="op">};</span></span>
<span id="cb139-8"><a href="#cb139-8" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;id&quot;</span><span class="op">=</span><span class="dv">1</span><span class="op">;</span></span>
<span id="cb139-9"><a href="#cb139-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb139-10"><a href="#cb139-10" aria-hidden="true" tabindex="-1"></a><span class="va">$token</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Body <span class="op">(</span><span class="va">$data</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)</span> <span class="op">-</span>ContentType <span class="st">&quot;application/json&quot;</span><span class="op">).</span><span class="fu">Result</span></span></code></pre></div>
<p><code>$token = "2eefd25fdf1590ebcdb7978b5bcea1fff755c65b255da8cbd723181b639bb789"</code>
сгенерировать токен в UI
(http://192.168.3.102/zabbix/zabbix.php?action=token.list)</p>
<h3 id="user.get">user.get</h3>
<div class="sourceCode" id="cb140"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb140-1"><a href="#cb140-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb140-2"><a href="#cb140-2" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;jsonrpc&quot;</span><span class="op">=</span><span class="st">&quot;2.0&quot;</span><span class="op">;</span></span>
<span id="cb140-3"><a href="#cb140-3" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;method&quot;</span><span class="op">=</span><span class="st">&quot;user.get&quot;</span><span class="op">;</span></span>
<span id="cb140-4"><a href="#cb140-4" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;params&quot;</span><span class="op">=</span>@<span class="op">{</span></span>
<span id="cb140-5"><a href="#cb140-5" aria-hidden="true" tabindex="-1"></a> <span class="op">};</span></span>
<span id="cb140-6"><a href="#cb140-6" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;auth&quot;</span><span class="op">=</span><span class="va">$token</span><span class="op">;</span></span>
<span id="cb140-7"><a href="#cb140-7" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;id&quot;</span><span class="op">=</span><span class="dv">1</span><span class="op">;</span></span>
<span id="cb140-8"><a href="#cb140-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb140-9"><a href="#cb140-9" aria-hidden="true" tabindex="-1"></a><span class="va">$users</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Body <span class="op">(</span><span class="va">$data</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)</span> <span class="op">-</span>ContentType <span class="st">&quot;application/json&quot;</span><span class="op">).</span><span class="fu">Result</span></span></code></pre></div>
<h3 id="problem.get">problem.get</h3>
<div class="sourceCode" id="cb141"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb141-1"><a href="#cb141-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb141-2"><a href="#cb141-2" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;jsonrpc&quot;</span><span class="op">=</span><span class="st">&quot;2.0&quot;</span><span class="op">;</span></span>
<span id="cb141-3"><a href="#cb141-3" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;method&quot;</span><span class="op">=</span><span class="st">&quot;problem.get&quot;</span><span class="op">;</span></span>
<span id="cb141-4"><a href="#cb141-4" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;params&quot;</span><span class="op">=</span>@<span class="op">{</span></span>
<span id="cb141-5"><a href="#cb141-5" aria-hidden="true" tabindex="-1"></a> <span class="op">};</span></span>
<span id="cb141-6"><a href="#cb141-6" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;auth&quot;</span><span class="op">=</span><span class="va">$token</span><span class="op">;</span></span>
<span id="cb141-7"><a href="#cb141-7" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;id&quot;</span><span class="op">=</span><span class="dv">1</span><span class="op">;</span></span>
<span id="cb141-8"><a href="#cb141-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb141-9"><a href="#cb141-9" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Body <span class="op">(</span><span class="va">$data</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)</span> <span class="op">-</span>ContentType <span class="st">&quot;application/json&quot;</span><span class="op">).</span><span class="fu">Result</span></span></code></pre></div>
<h3 id="host.get">host.get</h3>
<p>Получить список всех хостов (имя и id)</p>
<p>https://www.zabbix.com/documentation/current/en/manual/api/reference/host</p>
<p>host.create - creating new hosts<br />
host.delete - deleting hosts<br />
host.get - retrieving hosts<br />
host.massadd - adding related objects to hosts<br />
host.massremove - removing related objects from hosts<br />
host.massupdate - replacing or removing related objects from hosts<br />
host.update - updating hosts</p>
<div class="sourceCode" id="cb142"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb142-1"><a href="#cb142-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb142-2"><a href="#cb142-2" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;jsonrpc&quot;</span><span class="op">=</span><span class="st">&quot;2.0&quot;</span><span class="op">;</span></span>
<span id="cb142-3"><a href="#cb142-3" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;method&quot;</span><span class="op">=</span><span class="st">&quot;host.get&quot;</span><span class="op">;</span></span>
<span id="cb142-4"><a href="#cb142-4" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;params&quot;</span><span class="op">=</span>@<span class="op">{</span></span>
<span id="cb142-5"><a href="#cb142-5" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;output&quot;</span><span class="op">=@(</span><span class="ch">` </span>отфильтровать вывод</span>
<span id="cb142-6"><a href="#cb142-6" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;hostid&quot;</span><span class="op">;</span></span>
<span id="cb142-7"><a href="#cb142-7" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;host&quot;</span><span class="op">;</span></span>
<span id="cb142-8"><a href="#cb142-8" aria-hidden="true" tabindex="-1"></a> <span class="op">);</span></span>
<span id="cb142-9"><a href="#cb142-9" aria-hidden="true" tabindex="-1"></a> <span class="op">};</span></span>
<span id="cb142-10"><a href="#cb142-10" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;id&quot;</span><span class="op">=</span><span class="dv">2</span><span class="op">;</span></span>
<span id="cb142-11"><a href="#cb142-11" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;auth&quot;</span><span class="op">=</span><span class="va">$token</span><span class="op">;</span></span>
<span id="cb142-12"><a href="#cb142-12" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb142-13"><a href="#cb142-13" aria-hidden="true" tabindex="-1"></a><span class="va">$hosts</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Body <span class="op">(</span><span class="va">$data</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)</span> <span class="op">-</span>ContentType <span class="st">&quot;application/json&quot;</span><span class="op">).</span><span class="fu">Result</span></span>
<span id="cb142-14"><a href="#cb142-14" aria-hidden="true" tabindex="-1"></a><span class="va">$host_id</span> <span class="op">=</span> <span class="va">$hosts</span><span class="op">[</span><span class="dv">3</span><span class="op">].</span><span class="fu">hostid</span><span class="ch">` </span>забрать id хоста по индексу</span></code></pre></div>
<h3 id="item.get">item.get</h3>
<p>Получить id элементов данных по наименованию ключа для конкретного
хоста</p>
<div class="sourceCode" id="cb143"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb143-1"><a href="#cb143-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb143-2"><a href="#cb143-2" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;jsonrpc&quot;</span><span class="op">=</span><span class="st">&quot;2.0&quot;</span><span class="op">;</span></span>
<span id="cb143-3"><a href="#cb143-3" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;method&quot;</span><span class="op">=</span><span class="st">&quot;item.get&quot;</span><span class="op">;</span></span>
<span id="cb143-4"><a href="#cb143-4" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;params&quot;</span><span class="op">=</span>@<span class="op">{</span></span>
<span id="cb143-5"><a href="#cb143-5" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;hostids&quot;</span><span class="op">=@(</span><span class="va">$host_id</span><span class="op">);</span><span class="ch">` </span>отфильтровать по хосту</span>
<span id="cb143-6"><a href="#cb143-6" aria-hidden="true" tabindex="-1"></a> <span class="op">};</span></span>
<span id="cb143-7"><a href="#cb143-7" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;auth&quot;</span><span class="op">=</span><span class="va">$token</span><span class="op">;</span></span>
<span id="cb143-8"><a href="#cb143-8" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;id&quot;</span><span class="op">=</span><span class="dv">1</span><span class="op">;</span></span>
<span id="cb143-9"><a href="#cb143-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb143-10"><a href="#cb143-10" aria-hidden="true" tabindex="-1"></a><span class="va">$items</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Body <span class="op">(</span><span class="va">$data</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)</span> <span class="op">-</span>ContentType <span class="st">&quot;application/json&quot;</span><span class="op">).</span><span class="fu">Result</span></span>
<span id="cb143-11"><a href="#cb143-11" aria-hidden="true" tabindex="-1"></a><span class="va">$items_id</span> <span class="op">=</span> <span class="op">(</span><span class="va">$items</span> <span class="op">|</span> <span class="fu">where</span> key_ <span class="op">-match</span> system<span class="op">.</span><span class="fu">uptime</span><span class="op">).</span><span class="fu">itemid</span><span class="ch">` </span>забрать id элемента данных</span></code></pre></div>
<h3 id="history.get">history.get</h3>
<p>Получить всю историю элемента данных по его id</p>
<div class="sourceCode" id="cb144"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb144-1"><a href="#cb144-1" aria-hidden="true" tabindex="-1"></a><span class="va">$data</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb144-2"><a href="#cb144-2" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;jsonrpc&quot;</span><span class="op">=</span><span class="st">&quot;2.0&quot;</span><span class="op">;</span></span>
<span id="cb144-3"><a href="#cb144-3" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;method&quot;</span><span class="op">=</span><span class="st">&quot;history.get&quot;</span><span class="op">;</span></span>
<span id="cb144-4"><a href="#cb144-4" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;params&quot;</span><span class="op">=</span>@<span class="op">{</span></span>
<span id="cb144-5"><a href="#cb144-5" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;hostids&quot;</span><span class="op">=@(</span><span class="va">$host_id</span><span class="op">);</span> <span class="ch">` </span>фильтрация по хосту</span>
<span id="cb144-6"><a href="#cb144-6" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;itemids&quot;</span><span class="op">=@(</span><span class="va">$items_id</span><span class="op">);</span><span class="ch">` </span>фильтрация по элементу данных</span>
<span id="cb144-7"><a href="#cb144-7" aria-hidden="true" tabindex="-1"></a> <span class="op">};</span></span>
<span id="cb144-8"><a href="#cb144-8" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;auth&quot;</span><span class="op">=</span><span class="va">$token</span><span class="op">;</span></span>
<span id="cb144-9"><a href="#cb144-9" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;id&quot;</span><span class="op">=</span><span class="dv">1</span><span class="op">;</span></span>
<span id="cb144-10"><a href="#cb144-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb144-11"><a href="#cb144-11" aria-hidden="true" tabindex="-1"></a><span class="va">$items_data_uptime</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Body <span class="op">(</span><span class="va">$data</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)</span> <span class="op">-</span>ContentType <span class="st">&quot;application/json&quot;</span><span class="op">).</span><span class="fu">Result</span><span class="ch">` </span>получить все данные по ключу у конкретного хоста</span></code></pre></div>
<h3 id="convert-secconds-to-timespan-and-datetime">Convert Secconds To
TimeSpan and DateTime</h3>
<p><code>$sec = $items_data_uptime.value</code></p>
<div class="sourceCode" id="cb145"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb145-1"><a href="#cb145-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> ConvertSecondsTo-TimeSpan <span class="op">{</span></span>
<span id="cb145-2"><a href="#cb145-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">param</span> <span class="op">(</span></span>
<span id="cb145-3"><a href="#cb145-3" aria-hidden="true" tabindex="-1"></a> <span class="va">$insec</span></span>
<span id="cb145-4"><a href="#cb145-4" aria-hidden="true" tabindex="-1"></a> <span class="op">)</span></span>
<span id="cb145-5"><a href="#cb145-5" aria-hidden="true" tabindex="-1"></a> <span class="va">$TimeSpan</span> <span class="op">=</span> <span class="op">[</span>TimeSpan<span class="op">]::</span>fromseconds<span class="op">(</span><span class="va">$insec</span><span class="op">)</span></span>
<span id="cb145-6"><a href="#cb145-6" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;{0:dd&#39; day &#39;hh\:mm\:ss}&quot;</span> <span class="op">-</span>f <span class="va">$TimeSpan</span></span>
<span id="cb145-7"><a href="#cb145-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>$UpTime = ConvertSecondsTo-TimeSpan $sec[-1]</code></p>
<h3 id="convert-from-unix-time">Convert From Unix Time</h3>
<p><code>$time = $items_data_uptime.clock</code></p>
<div class="sourceCode" id="cb146"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb146-1"><a href="#cb146-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> ConvertFrom-UnixTime <span class="op">{</span></span>
<span id="cb146-2"><a href="#cb146-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">param</span> <span class="op">(</span></span>
<span id="cb146-3"><a href="#cb146-3" aria-hidden="true" tabindex="-1"></a> <span class="va">$intime</span></span>
<span id="cb146-4"><a href="#cb146-4" aria-hidden="true" tabindex="-1"></a> <span class="op">)</span></span>
<span id="cb146-5"><a href="#cb146-5" aria-hidden="true" tabindex="-1"></a> <span class="va">$EpochTime</span> <span class="op">=</span> <span class="op">[</span>DateTime<span class="op">]</span><span class="st">&quot;1/1/1970&quot;</span></span>
<span id="cb146-6"><a href="#cb146-6" aria-hidden="true" tabindex="-1"></a> <span class="va">$TimeZone</span> <span class="op">=</span> Get-TimeZone</span>
<span id="cb146-7"><a href="#cb146-7" aria-hidden="true" tabindex="-1"></a> <span class="va">$UTCTime</span> <span class="op">=</span> <span class="va">$EpochTime</span><span class="op">.</span><span class="fu">AddSeconds</span><span class="op">(</span><span class="va">$intime</span><span class="op">)</span></span>
<span id="cb146-8"><a href="#cb146-8" aria-hidden="true" tabindex="-1"></a> <span class="va">$UTCTime</span><span class="op">.</span><span class="fu">AddMinutes</span><span class="op">(</span><span class="va">$TimeZone</span><span class="op">.</span><span class="fu">BaseUtcOffset</span><span class="op">.</span><span class="fu">TotalMinutes</span><span class="op">)</span></span>
<span id="cb146-9"><a href="#cb146-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>$GetDataTime = ConvertFrom-UnixTime $time[-1]</code></p>
<p><code>($hosts | where hostid -eq $host_id).host</code> получить имя
хоста<br />
<code>$UpTime</code> последнее полученное значение времени работы
хоста<br />
<code>$GetDataTime</code> время последнего полученного значения</p>
<h1 id="pki">pki</h1>
<p><code>New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "$env:computername" -FriendlyName "Test Certificate" -NotAfter (Get-Date).AddYears(5)</code>
создать самоподписанный сертификат (в LocalMachine- Сертификаты
компьютера) с сроком действия 5 лет</p>
<p><code>Get-ChildItem -Path Cert:\CurrentUser\Root\</code> список всех
установленных сертификатов в хранилище Доверенные корневые ЦС Текущего
пользователя<br />
<code>Get-ChildItem -Path Cert:\CurrentUser\My\</code> список
самозаверяющих сертификатов в Личное хранилище Текущего
пользователя<br />
<code>Get-ChildItem -Path Cert:\LocalMachine\My\</code> список
самозаверяющих сертификатов в Личное хранилище Локального
компьютера<br />
<code>Get-ChildItem -Path Cert:\LocalMachine\My\ | select NotBefore,NotAfter,Thumbprint,Subject</code>
срок действия сертификата<br />
<code>Get-ChildItem -Path Cert:\LocalMachine\My\ | where Thumbprint -eq D9356FB774EE0E6206B7D5B59B99102CA5B17BDA</code>
поиск сертификат по отпечатку</p>
<p><code>Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Certificates\</code>
сертификаты в файловой системе, каждый файл соответствует сертификату,
установленному в личном хранилище текущего пользователя<br />
<code>Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Keys\</code>
ссылки на объекты закрытых ключей, созданных поставщиком хранилища
ключей (KSP)<br />
<code>Get-ChildItem -Path HKCU:\Software\Microsoft\SystemCertificates\CA\Certificates | ft -AutoSize</code>
список сертификатов в реестре вошедшего в систему пользователя</p>
<p><code>$cert = (Get-ChildItem -Path Cert:\CurrentUser\My\)[1]</code>
выбрать сертификат<br />
<code>$cert | Remove-Item</code> удалить сертификат</p>
<p><code>Export-Certificate -FilePath $home\Desktop\certificate.cer -Cert $cert</code>
экспортировать сертификат<br />
<code>$cert.HasPrivateKey</code> проверить наличие закрытого ключа<br />
<code>$pass = "password" | ConvertTo-SecureString -AsPlainText -Force</code>
создать пароль для шифрования закрытого ключа<br />
<code>Export-PfxCertificate -FilePath $home\Desktop\certificate.pfx -Password $pass -Cert $certificate</code>
экспортировать сертификат с закрытым ключем</p>
<p><code>Import-Certificate -FilePath $home\Desktop\certificate.cer -CertStoreLocation Cert:\CurrentUser\My</code>
импортировать сертификат<br />
<code>Import-PfxCertificate -Exportable -Password $pass -CertStoreLocation Cert:\CurrentUser\My -FilePath $home\Desktop\certificate.pfx</code></p>
<h1 id="openssl">OpenSSL</h1>
<div class="sourceCode" id="cb147"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb147-1"><a href="#cb147-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-WebRequest</span> <span class="op">-</span>Uri https<span class="op">://</span>slproweb<span class="op">.</span><span class="fu">com</span><span class="op">/</span>download<span class="op">/</span>Win64OpenSSL_Light-3_1_1<span class="op">.</span><span class="fu">msi</span> <span class="op">-</span>OutFile <span class="va">$home</span>\Downloads\OpenSSL-Light-3<span class="op">.</span><span class="dv">1.1</span><span class="op">.</span><span class="fu">msi</span></span>
<span id="cb147-2"><a href="#cb147-2" aria-hidden="true" tabindex="-1"></a><span class="fu">Start-Process</span> <span class="va">$home</span>\Downloads\OpenSSL-Light-3<span class="op">.</span><span class="dv">1.1</span><span class="op">.</span><span class="fu">msi</span> <span class="op">-</span>ArgumentList <span class="st">&#39;/quiet&#39;</span> <span class="op">-</span>Wait<span class="ch">` </span>установить msi пакет в тихом режиме <span class="op">(</span>запуск от имени Администратора<span class="op">)</span></span>
<span id="cb147-3"><a href="#cb147-3" aria-hidden="true" tabindex="-1"></a><span class="fu">rm</span> <span class="va">$home</span>\Downloads\OpenSSL-Light-3<span class="op">.</span><span class="dv">1.1</span><span class="op">.</span><span class="fu">msi</span></span>
<span id="cb147-4"><a href="#cb147-4" aria-hidden="true" tabindex="-1"></a><span class="fu">cd</span> <span class="st">&quot;C:\Program Files\OpenSSL-Win64\bin&quot;</span></span></code></pre></div>
<ul>
<li><p>Изменить пароль для PFX<br />
<code>openssl pkcs12 -in "C:\Cert\domain.ru.pfx" -out "C:\Cert\domain.ru.pem" -nodes</code>
экспортируем имеющийся сертификат и закрытый ключ в .pem-файл без пароля
с указанием текущего пароля<br />
<code>openssl pkcs12 -export -in "C:\Cert\domain.ru.pem" -out "C:\Cert\domain.ru_password.pfx" -nodes</code>
конвертируем .pem обратно в .pfx c указанием нового пароля</p></li>
<li><p>Конвертация из закрытого и открытого ключа PEM в PFX<br />
<code>openssl pkcs12 -export -in "C:\tmp\vpn\vpn.itproblog.ru-crt.pem" -inkey "C:\tmp\vpn\vpn.itproblog.ru-key.pem" -out "C:\tmp\vpn\vpn.iiproblog.ru.pfx"</code><br />
in путь до файла с открытым ключом<br />
inkey путь до файла с закрытым ключом<br />
out путь до файла, в который будет конвертирован сертификат
(pfx)</p></li>
<li><p>Конвертация PFX в CRT<br />
<code>openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -clcerts -out "C:\OpenSSL-Win64\bin\_.domain.ru.crt"</code>
указывается текущий и 2 раза новый пароль PEM pass phrase (файл содержит
EGIN CERTIFICATE и BEGIN ENCRYPTED PRIVATE KEY)<br />
<code>openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -clcerts -nokeys -out "C:\OpenSSL-Win64\bin\_.domain.ru.crt"</code>
без ключа, получить открытую часть (файл содержит только EGIN
CERTIFICATE)</p></li>
<li><p>Конвертация PFX в KEY<br />
<code>openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -nocerts -out "C:\OpenSSL-Win64\bin\_.domain.ru.key"</code>
файл содержит только BEGIN ENCRYPTED PRIVATE KEY</p></li>
<li><p>Снять пароль к закрытого ключа .key<br />
<code>openssl rsa -in "C:\OpenSSL-Win64\bin\_.domain.ru.key" -out "C:\OpenSSL-Win64\bin\_.domain.ru-decrypted.key"</code></p></li>
<li><p>CRT и KEY в PFX:<br />
<code>openssl pkcs12 -inkey certificate.key -in certificate.crt -export -out certificate.pfx</code></p></li>
</ul>
<h1 id="openvpn">OpenVPN</h1>
<p><code>Invoke-WebRequest -Uri https://swupdate.openvpn.org/community/releases/OpenVPN-2.6.5-I001-amd64.msi -OutFile $home\Downloads\OpenVPN-2.6.5.msi</code><br />
<code>Start-Process $home\Downloads\OpenVPN-2.6.5.msi -ArgumentList '/quiet /SELECT_OPENSSL_UTILITIES=1' -Wait</code><br />
<code>msiexec /i $home\Downloads\OpenVPN-2.6.5.msi ADDLOCAL=EasyRSA /passive /quiet # установить отдельный компонент EasyRSA Certificate Management Scripts</code><br />
<code># msiexec /i $home\Downloads\OpenVPN-2.6.5.msi ADDLOCAL=OpenVPN.Service,Drivers,Drivers.Wintun,OpenVPN,OpenVPN.GUI,OpenVPN.GUI.OnLogon,EasyRSA /passive</code>
выборочная установка<br />
<code># Invoke-WebRequest -Uri https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.5/EasyRSA-3.1.5-win64.zip -OutFile $home\Downloads\EasyRSA-3.1.5.zip</code>
скачать отдельный пакет EasyRSA<br />
<code>rm $home\Downloads\OpenVPN-2.6.5.msi</code></p>
<p><code>cd "C:\Program Files\OpenVPN\easy-rsa"</code><br />
<code>Copy-Item vars.example vars</code> файл конфигурации для
EasyRSA</p>
<pre><code>set_var EASYRSA_TEMP_DIR &quot;$EASYRSA_PKI&quot;
set_var EASYRSA_REQ_COUNTRY &quot;RU&quot;
set_var EASYRSA_REQ_PROVINCE &quot;MSK&quot;
set_var EASYRSA_REQ_CITY &quot;MSK&quot;
set_var EASYRSA_REQ_ORG &quot;FAILON.NET&quot;
set_var EASYRSA_REQ_EMAIL &quot;lifailon@domain.ru&quot;
set_var EASYRSA_REQ_OU &quot;IT&quot;
#set_var EASYRSA_KEY_SIZE 2048
#set_var EASYRSA_CA_EXPIRE 3650
#set_var EASYRSA_CERT_EXPIRE 825</code></pre>
<p><code>.\EasyRSA-Start.bat</code> среда EasyRSA Shell<br />
<code>easyrsa init-pki</code> инициализация PKI, создает директорию:
C:Files-rsaи читает переменные файла -rsa<br />
<code>easyrsa build-ca</code> генерация корневого CA с указанием пароля
и произвольное имя сервера (.crt и .key)<br />
<code>easyrsa gen-req server nopass</code> генерация запроса сертификата
и ключ для сервера OpenVPN - yes (.req и .key)<br />
<code>easyrsa sign-req server server</code> подписать запрос на выпуск
сертификата сервера с помощью CA - yes (.crt)<br />
<code>easyrsa gen-dh</code> создать ключ Диффи-Хеллмана (.pem)<br />
<code>easyrsa gen-req client1</code>
nopass<code>генерация запроса сертификата и ключ для клиента OpenVPN (\pki\reqs\client1.req и \pki\private\client1.key)</code><br />
<code>easyrsa sign-req client client1</code> подписать запрос на выпуск
сертификата клиента с помощью CA - yes (1.crt)<br />
<code>easyrsa revoke client1</code> отозвать сертификат
пользователя<br />
<code>openssl rsa -in "C:\Program Files\OpenVPN\easy-rsa\pki\private\client1.key" -out "C:\Program Files\OpenVPN\easy-rsa\pki\private\client1_nopass.key"</code>
снять защиту паролем для ключа (BEGIN ENCRYPTED PRIVATE KEY -&gt; BEGIN
PRIVATE KEY)<br />
<code>exit</code><br />
<code>cd "C:\Program Files\OpenVPN\bin"</code><br />
<code>.\openvpn --genkey secret ta.key</code> генерация ключа tls-auth
(.key)<br />
<code>Move-Item "C:\Program Files\OpenVPN\bin\ta.key" "C:\Program Files\OpenVPN\easy-rsa\pki\"</code></p>
<h3 id="server.ovpn">server.ovpn</h3>
<p><code># Copy-Item "C:\Program Files\OpenVPN\sample-config\server.ovpn" "C:\Program Files\OpenVPN\config-auto\server.ovpn"</code><br />
<code>New-Item -ItemType File -Path "C:\Program Files\OpenVPN\config-auto\server.ovpn"</code></p>
<pre><code>port 1194
proto udp
# Что именно инкапсулировать в туннеле (ethernet фреймы - tap или ip пакеты - tun)
dev tun
ca &quot;C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\ca.crt&quot;
cert &quot;C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\issued\\server.crt&quot;
key &quot;C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\private\\server.key&quot;
dh &quot;C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\dh.pem&quot;
server 192.168.4.0 255.255.255.0
# Хранит список сопоставления ip для клиентов, что бы назначить тот же адрес при перезапуске сервера
# ifconfig-pool-persist &quot;C:\\Program Files\\OpenVPN\\dhcp-client-list.txt&quot;
# Разрешить клиентам подключаться под одним ключом
# duplicate-cn
# max-clients 30
# Разрешить обмен трафиком между клиентами
client-to-client
# compress
tls-auth &quot;C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\ta.key&quot; 0
cipher AES-256-GCM
keepalive 20 60
# Не перечитавать файлы ключей при перезапуске туннеля
persist-key
# Оставляет без изменения устройства tun/tap при перезапуске OpenVPN
persist-tun
status &quot;C:\\Program Files\\OpenVPN\\log\\status.log&quot;
log &quot;C:\\Program Files\\OpenVPN\\log\\openvpn.log&quot;
verb 3
mute 20
windows-driver wintun
# Открыть доступ к подсети за сервером
push &quot;route 192.168.3.0 255.255.255.0&quot;
push &quot;route 192.168.4.0 255.255.255.0&quot;
# Завернуть все запросы клиента (в том числе Интернет трафик) на OpenVPN сервер
# push &quot;redirect-gateway def1&quot;
# push &quot;dhcp-option DNS 192.168.3.101&quot;
# push &quot;dhcp-option DOMAIN failon.net&quot;</code></pre>
<p><code>New-NetFirewallRule -DisplayName "AllowOpenVPN-In" -Direction Inbound -Protocol UDP LocalPort 1194 -Action Allow</code>
на сервере<br />
<code>New-NetFirewallRule -DisplayName "AllowOpenVPN-Out" -Direction Outbound -Protocol UDP LocalPort 1194 -Action Allow</code>
на клиенте<br />
<code>Get-Service *openvpn* | Restart-Service</code></p>
<h3 id="client.ovpn">client.ovpn</h3>
<p><code># Copy-Item "C:\Program Files\OpenVPN\sample-config\client.ovpn" "C:\Program Files\OpenVPN\config-auto\client.ovpn"</code><br />
<code>New-Item -ItemType File -Path "C:\Program Files\OpenVPN\config-auto\client.ovpn"</code></p>
<pre><code>client
dev tun
proto udp
remote 26.115.154.67 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-GCM
connect-retry-max 25
# Использовать драйвер wintun и полный путь до сертификатов при использовании openvpn gui
windows-driver wintun
verb 3</code></pre>
<h3 id="client">Client</h3>
<p><code>iwr -Uri https://openvpn.net/downloads/openvpn-connect-v3-windows.msi -OutFile "$home\downloads\OpenVPN-Connect-3.msi"</code><br />
Передать конфигурацию и ключи:<br />
<code>client.ovpn</code><br />
<code>ca.crt</code><br />
<code>dh.pem</code><br />
<code>ta.key</code><br />
<code>client1.crt</code><br />
<code>client1.key</code></p>
<h1 id="route">Route</h1>
<p><code>Get-Service RemoteAccess | Stop-Service</code><br />
<code>Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name "IPEnableRouter" -Value 1</code>
включает IP маршрутизацию<br />
<code>(Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters").IPEnableRouter</code><br />
<code>Get-NetIPInterface | select ifIndex,InterfaceAlias,AddressFamily,ConnectionState,Forwarding | ft</code>
отобразить сетевые интерфейсы<br />
<code>Set-NetIPInterface -ifIndex 13 -Forwarding Enabled</code> включить
переадресацию на интерфейсе</p>
<p><code>sysctl net.ipv4.ip_forward=1</code><br />
<code>echo "sysctl net.ipv4.ip_forward = 1" &gt;&gt; /etc/sysctl.conf</code></p>
<p><code>Get-NetRoute</code><br />
<code>New-NetRoute -DestinationPrefix "192.168.3.0/24" -NextHop "192.168.4.1" -InterfaceIndex 8</code><br />
<code>route -p add 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 1</code><br />
<code>route -p change 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 2</code><br />
<code>route -p add 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 1 if 7</code>
указать номер сетевого интерфейса на который необходимо посылать пакет
(Wintun Userspace Tunnel)<br />
<code>route print -4</code><br />
<code>route delete 192.168.3.0</code></p>
<p><code>tracert 192.168.3.101</code> с 192.168.4.6</p>
<pre><code>1 17 ms * 22 ms 192.168.4.1
2 12 ms 13 ms 14 ms 192.168.3.101</code></pre>
<p><code>route add -net 192.168.4.0 netmask 255.255.255.0 gw 192.168.3.100</code><br />
<code>route -e</code></p>
<p><code>traceroute 192.168.4.6</code> с 192.168.3.101</p>
<pre><code>1 192.168.3.100 (192.168.3.100) 0.148 ms 0.110 ms 0.106 ms
2 192.168.4.6 (192.168.4.6) 14.573 ms * *</code></pre>
<p><code>ping 192.168.3.101 -t</code> с 192.168.4.6<br />
<code>tcpdump -n -i ens33 icmp</code> на 192.168.3.101</p>
<pre><code>14:36:34.533771 IP 192.168.4.6 &gt; 192.168.3.101: ICMP echo request, id 1, seq 2962, length 40 # отправил запрос
14:36:34.533806 IP 192.168.3.101 &gt; 192.168.4.6: ICMP echo reply, id 1, seq 2962, length 40 # отправил ответ</code></pre>
<h1 id="nat">NAT</h1>
<p><code>Get-Command -Module NetNat</code><br />
<code>New-NetNat -Name LocalNat -InternalIPInterfaceAddressPrefix "192.168.3.0/24"</code><br />
<code>Add-NetNatStaticMapping -NatName LocalNat -Protocol TCP -ExternalIPAddress 0.0.0.0 -ExternalPort 80 -InternalIPAddress 192.168.3.102 -InternalPort 80</code><br />
<code>Remove-NetNatStaticMapping -StaticMappingID 0</code><br />
<code>Remove-NetNat -Name LocalNat</code></p>
<h1 id="wireguard">WireGuard</h1>
<p><code>Invoke-WebRequest "https://download.wireguard.com/windows-client/wireguard-amd64-0.5.3.msi" -OutFile "$home\Downloads\WireGuard-Client-0.5.3.msi"</code><br />
<code>msiexec.exe /i "$home\Downloads\WireGuard-Client-0.5.3.msi" DO_NOT_LAUNCH=1 /qn</code><br />
<code>Invoke-WebRequest "http://www.wiresock.net/downloads/wiresock-vpn-gateway-x64-1.1.4.1.msi" -OutFile "$home\Downloads\WireSock-VPN-Gateway-1.1.4.1.msi"</code><br />
<code>msiexec.exe /i "http://www.wiresock.net/downloads/wiresock-vpn-gateway-x64-1.1.4.1.msi" /qn</code><br />
<code>$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")</code><br />
<code>wg-quick-config -add -start</code><br />
<code>26.115.154.67:8181</code><br />
<code>192.168.21.4/24</code><br />
<code>Successfully saved client configuration: C:\ProgramData\NT KERNEL\WireSock VPN Gateway\wsclient_1.conf</code><br />
<code>Successfully saved server configuration: C:\ProgramData\NT KERNEL\WireSock VPN Gateway\wiresock.conf</code><br />
<code>get-service *wire*</code><br />
<code>wg show</code><br />
<code>wg-quick-config -add -restart</code> add client</p>
<p>wiresock.conf</p>
<pre><code>[Interface]
PrivateKey = gCHC0g2JPwr6sXPiaOL4/KTkMyjN9TculrJUA/GORV8=
Address = 192.168.21.5/24
ListenPort = 8181
[Peer]
PublicKey = NoSxjew2RCHiUzI6mlahjd4I+0EcLsoYom/H01z91yU=
AllowedIPs = 192.168.21.6/32</code></pre>
<p>wsclient_1.conf (добавить маршруты для клиента в AllowedIPs)</p>
<pre><code>[Interface]
PrivateKey = yIpRQRmaGrrk9Y+49E8JhEpFmKzSeecvUAdeNgf1hUM=
Address = 192.168.21.6/24
DNS = 8.8.8.8, 1.1.1.1
MTU = 1420
[Peer]
PublicKey = Fp7674VSYeGj8CYt6RCKR7Qz1y/IKUXCw8ImOFhX3hk=
AllowedIPs = 192.168.21.0/24, 192.168.3.0/24
Endpoint = 26.115.154.67:8181
PersistentKeepalive = 25</code></pre>
<h1 id="vpnclient">VpnClient</h1>
<p><code>Get-Command -Module VpnClient</code><br />
<code>Add-VpnConnection -Name "vpn-failon" -ServerAddress "26.115.154.67" -TunnelType L2TP -L2tpPsk "123098" -EncryptionLevel "Required" -AuthenticationMethod MSChapv2 -RememberCredential -AllUserConnection PassThru -Force</code><br />
<code>-TunnelType PPTP/L2TP/SSTP/IKEv2/Automatic</code><br />
<code>-L2tpPsk</code> использовать общий ключ для аутентификации (без
параметра, для L2TP аутентификации используется сертификат)<br />
<code>-AuthenticationMethod Pap/Chap/MSChapv2/Eap/MachineCertificate</code><br />
<code>-EncryptionLevel NoEncryption/Optional/Required/Maximum/Custom</code><br />
<code>-SplitTunneling</code> заворачивать весь трафик через VPN-туннель
(включение Use default gateway on remote network в настройках параметра
VPN адаптера)<br />
<code>-UseWinlogonCredential</code> использовать учетные данные текущего
пользователя для аутентификации на VPN сервере<br />
<code>-RememberCredential</code> разрешить сохранять учетные данные для
VPN подключения (учетная запись и пароль сохраняются в диспетчер учетных
данных Windows после первого успешного подключения)<br />
<code>-DnsSuffix domain.local</code><br />
<code>-AllUserConnection</code> разрешить использовать VPN подключение
для всех пользователей компьютера (сохраняется в конфигурационный файл:
C:.pbk)</p>
<p><code>Install-Module -Name VPNCredentialsHelper</code> модуль для
сохранения логина и пароля в Windows Credential Manager для VPN
подключения<br />
<code>Set-VpnConnectionUsernamePassword -connectionname vpn-failon -username user1 -password password</code></p>
<p><code>rasdial "vpn-failon"</code> подключиться<br />
<code>Get-VpnConnection -AllUserConnection | select *</code> список VPN
подключения, доступных для всех пользователей, найстройки и текущий
статус подключения (ConnectionStatus)<br />
<code>Add-VpnConnectionRoute -ConnectionName vpn-failon -DestinationPrefix 192.168.3.0/24 PassThru</code>
динамически добавить в таблицу маршрутизации маршрут, который будет
активен при подключении к VPN<br />
<code>Remove-VpnConnection -Name vpn-failon -AllUserConnection -Force</code>
удалить</p>
<p><code>Set-VpnConnection -Name "vpn-failon" -SplitTunneling $True</code>
включить раздельное тунеллирование<br />
<code>Add-VpnConnectionRoute -ConnectionName "vpn-failon" -DestinationPrefix 172.22.22.0/24</code>
настроить маршрутизацию к указанной подсети через VPN-соединение<br />
<code>(Get-VpnConnection -ConnectionName "vpn-failon").routes</code>
отобразить таблицу маршрутизации для указанного соединения<br />
<code>Remove-VpnConnectionRoute -ConnectionName "vpn-failon" -DestinationPrefix "172.22.23.0/24"</code></p>
<h1 id="proxy">Proxy</h1>
<p><code>$user = "lifailon"</code><br />
<code>$pass = "Proxy"</code><br />
<code>$SecureString = ConvertTo-SecureString $pass -AsPlainText -Force</code><br />
<code>$Credential = New-Object System.Management.Automation.PSCredential($user, $SecureString)</code><br />
<code>[System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy("http://192.168.3.100:9090")</code><br />
<code>[System.Net.Http.HttpClient]::DefaultProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials</code><br />
<code>[System.Net.Http.HttpClient]::DefaultProxy.Credentials = $Credential</code><br />
<code>Invoke-RestMethod http://ifconfig.me/ip</code><br />
<code>Invoke-RestMethod https://kinozal.tv/rss.xml</code></p>
<h1 id="openssh">OpenSSH</h1>
<p><code>Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'</code><br />
<code>Add-WindowsCapability -Online -Name OpenSSH.Client*</code><br />
<code>dism /Online /Add-Capability /CapabilityName:OpenSSH.Client~~~~0.0.1.0</code><br />
<code>iwr https://github.com/PowerShell/Win32-OpenSSH/releases/download/v9.2.2.0p1-Beta/OpenSSH-Win64-v9.2.2.0.msi -OutFile $home\Downloads\OpenSSH-Win64-v9.2.2.0.msi</code>
скачать<br />
<code>msiexec /i $home\Downloads\OpenSSH-Win64-v9.2.2.0.msi</code>
установить msi пакет<br />
<code>Set-Service sshd -StartupType Automatic</code><br />
<code>Get-NetTCPConnection | where LocalPort -eq 22</code><br />
<code>New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22</code><br />
<code>Get-NetFirewallRule -Name *ssh*</code><br />
<code>Start-Process notepad++ C:\Programdata\ssh\sshd_config</code>
конфигурационный файл<br />
<code>GSSAPIAuthentication yes</code> включить Kerberos аутентификацию
(через AD)<br />
<code>SyslogFacility LOCAL0</code> включить локальное ведение журнала в
файл (C:.log)<br />
<code>LogLevel INFO</code><br />
<code>Restart-Service sshd</code><br />
<code>ssh -K $srv</code> выполнить Kerberos аутентификацию<br />
<code>ssh Lifailon@192.168.3.99 -p 22</code><br />
<code>pwsh -command Get-Service</code><br />
<code>ssh -L 3101:192.168.3.101:22 -R 3101:192.168.3.101:22 lifailon@192.168.3.101 -p 22</code>
SSH Tunnel lifailon@localhost:3101 -&gt; 192.168.3.101:3101</p>
<h1 id="winrm">WinRM</h1>
<p><code>Enter-PSSession -ComputerName $srv</code> подключиться к
PowerShell сессии через PSRemoting. Подключение возможно только по
FQDN-имени<br />
<code>Invoke-Command $srv -ScriptBlock {Get-ComputerInfo}</code>
выполнение команды через PSRemoting<br />
<code>$session = New-PSSession $srv</code> открыть сессию<br />
<code>Get-PSSession</code> отобразить активные сессии<br />
<code>icm -Session $session {$srv = $using:srv}</code> передать
переменную текущей сессии ($using) в удаленную<br />
<code>Disconnect-PSSession $session</code> закрыть сессию<br />
<code>Remove-PSSession $session</code> удалить сессию<br />
<code>Import-Module -Name ActiveDirectory -PSSession $srv</code>
импортировать модуль с удаленного компьютера в локальную сессию</p>
<h3 id="windows-remote-management-configuration">Windows Remote
Management Configuration</h3>
<p><code>winrm quickconfig -quiet</code> изменит запуск службы WinRM на
автоматический, задаст стандартные настройки WinRM и добавить исключения
для портов в fw<br />
<code>Enable-PSRemoting Force</code> включить PowerShell Remoting,
работает только для доменного и частного сетевых профилей Windows<br />
<code>Enable-PSRemoting -SkipNetworkProfileCheck -Force</code> для
настройки компьютера в общей (public) сети (работает с версии powershell
6)</p>
<p><code>$NetProfiles = Get-NetConnectionProfile</code> отобразить
профили сетевых подключений<br />
<code>Set-NetConnectionProfile -InterfaceIndex $NetProfiles[1].InterfaceIndex -NetworkCategory Private</code>
изменить тип сети для профиля (DomainAuthenticated/Public)<br />
<code>(Get-CimInstance -ClassName Win32_ComputerSystem).PartOfDomain</code>
проверить, что компьютер добавлен в домен AD<br />
<code>Get-Service WinRM | Set-Service -StartupType AutomaticDelayedStart</code>
отложенный запуск<br />
<code>Get-Service -Name winrm -RequiredServices</code> статус зависимых
служб<br />
<code>New-NetFirewallRule -Profile Any -DisplayName "WinRM HTTP" -Direction Inbound -Protocol TCP -LocalPort 5985,5986</code><br />
<code>Test-NetConnection $srv -port 5895</code> проверить порт<br />
<code>Test-WSMan $srv -ErrorAction Ignore</code> проверить работу WinRM
на удаленном компьютере (игнорировать вывод ошибок для скрипта) или
локально (localhost)</p>
<p><code>$Cert = New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "$env:computername" -FriendlyName "WinRM HTTPS Certificate" -NotAfter (Get-Date).AddYears(5)</code>
создать самоподписанный сертификат<br />
<code>$Thumbprint = $Cert.Thumbprint</code> забрать отпечаток<br />
<code>New-Item -Path WSMan:\Localhost\Listener -Transport HTTPS -Address * -CertificateThumbprint $Thumbprint -Name WinRM_HTTPS_Listener -Force</code>
создать прослушиватель<br />
<code>New-NetFirewallRule -DisplayName 'WinRM HTTPS' -Profile Domain,Private -Direction Inbound -Action Allow -Protocol TCP -LocalPort 5986</code>
открыть порт в fw</p>
<pre><code>$selector_set = @{
Address = &quot;*&quot;
Transport = &quot;HTTPS&quot;
}
$value_set = @{
CertificateThumbprint = &quot;66ABFDA044D8C85135048186E2FDC0DBE6125163&quot;
}
New-WSManInstance -ResourceURI &quot;winrm/config/Listener&quot; -SelectorSet $selector_set -ValueSet $value_set</code></pre>
<p><code>winrm get winrm/config</code> отобразить всю конфигурацию
(Client/Service)<br />
<code>winrm get winrm/config/service/auth</code> конфигурация
авторизации на сервере<br />
<code>winrm enumerate winrm/config/listener</code> текущая конфигурация
прослушивателей WinRM (отображает отпечаток сертификата для HTTPS
5986)<br />
<code>Get-ChildItem -Path Cert:\LocalMachine\My\ | where Thumbprint -eq D9356FB774EE0E6206B7D5B59B99102CA5B17BDA | select *</code>
информация о сертификате</p>
<p><code>ls WSMan:\localhost\Client</code> конфигурацию клиента<br />
<code>ls WSMan:\localhost\Service</code> конфигурация сервера<br />
<code>ls WSMan:\localhost\Service\auth</code> список всех конфигураций
аутентификации WinRM сервера<br />
<code>Set-Item -path WSMan:\localhost\Service\auth\basic -value $true</code>
разрешить локальную аутентификацию к текущему серверу<br />
<code>ls HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN</code>
настройки в реестре (например, для включения аудентификации в _basic =
1)<br />
<code>Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.* -Force</code>
добавить доверенные хосты в конфигурацию на клиенте, чтобы работала
Negotiate аутентификация через NTLM<br />
<code>Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.3.100 -Concatenate -Force</code>
добавить второй компьютер<br />
<code>ls WSMan:\localhost\Client\TrustedHosts</code><br />
<code>Set-Item WSMan:\localhost\Client\AllowUnencrypted $true</code>
включить передача незашифрованных данных конфигурации клиента<br />
<code>Set-Item WSMan:\localhost\Service\AllowUnencrypted $true</code>
включить передача незашифрованных данных конфигурации сервера
(необходимо быть в private сети)</p>
<p><code>Get-PSSessionConfiguration</code> проверить, включен ли
PSremoting и вывести список пользователей и групп, которым разрешено
подключаться через WinRM<br />
<code>Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI</code>
назначить права доступа через дескриптор безопасности текущей сессии (до
перезагруки)<br />
<code>(Get-PSSessionConfiguration -Name "Microsoft.PowerShell").SecurityDescriptorSDDL</code>
получить настройки дескриптора в формате SDDL<br />
<code>Set-PSSessionConfiguration -Name Microsoft.PowerShell -SecurityDescriptorSDDL $SDDL</code>
применить настройки дескриптора на другом компьютере без использования
GUI<br />
</p>
<p><code>New-LocalUser "WinRM-Writer" -Password (ConvertTo-SecureString -AsPlainText "123098")</code>
создать пользователя<br />
<code>Add-LocalGroupMember -Group "Remote Management Users" -Member "WinRM-Writer"</code>
добавить пользователя WinRM-Writer в локальную группу доступа
“Пользователи удаленного управления”<br />
<code>cmdkey /add:192.168.3.99 /user:WinRM-Writer /pass:123098</code>
сохранить пароль в CredentialManager <code>cmdkey /list</code><br />
<code>Import-Module CredentialManager</code><br />
<code>Add-Type -AssemblyName System.Web</code><br />
<code>New-StoredCredential -Target 192.168.3.99 -UserName WinRM-Writer -Password 123098 -Comment WinRM</code>
сохранить пароль в CredentialManager (из PS5)<br />
<code>Get-StoredCredential -AsCredentialObject</code><br />
<code>$cred = Get-StoredCredential -Target 192.168.3.99</code><br />
<code>Enter-PSSession -ComputerName 192.168.3.99 -Credential $cred -Authentication Negotiate</code><br />
<code>Enter-PSSession -ComputerName 192.168.3.99 -Credential $cred -Authentication Basic -Port 5985</code>
работает при отключении allowunencrypted на стороне сервера и
клиента<br />
<code>winrs -r:http://192.168.3.100:5985/wsman -u:WinRM-Writer -p:123098 ipconfig</code>
передать команду через winrs (-?)<br />
<code>winrs -r:https://192.168.3.100:5985/wsman -u:WinRM-Writer -p:123098 -ssl ipconfig</code>
через https<br />
<code>pwsh -Command "Install-Module -Name PSWSMan"</code> установить
модуль для использования в Linux системе</p>
<h3 id="kerberos">Kerberos</h3>
<p><code>.\CheckMaxTokenSize.ps1 -Principals login -OSEmulation $true -Details $true</code>
узнать размер токена пользователя в домене<br />
<code>Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters | select maxtokensize</code>
максимальный размер токена на сервере<br />
<code>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters</code>
изменить размера, если заголовок пакета аутентификации превышает 16 Кб
(из за большого кол-ва групп)<br />
<code>MaxFieldLength увеличить до 0000ffff (65535)</code><br />
<code>MaxRequestBytes увеличить до 0000ffff (65535)</code></p>
<h1 id="packagemanagement">PackageManagement</h1>
<p><code>Import-Module PackageManagement</code> импортировать
модуль<br />
<code>Get-Module PackageManagement</code> информация о модуле<br />
<code>Get-Command -Module PackageManagement</code> отобразить все
командлеты модуля<br />
<code>Get-Package</code> отобразить все установленные пакеты
PowerShellGallery<br />
<code>Get-Package -ProviderName msi,Programs</code> список установленных
программ
<code>[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12</code>
включить использование протокол TLS 1.2 (если не отключены протоколы TLS
1.0 и 1.1)<br />
<code>Find-PackageProvider</code> поиск провайдеров<br />
<code>Install-PackageProvider PSGallery -force</code> установить
источник<br />
<code>Install-PackageProvider NuGet -force</code><br />
<code>Install-PackageProvider Chocolatey -force</code><br />
<code>Get-PackageSource</code> источники установки пакетов<br />
<code>Set-PackageSource -Name PSGallery -Trusted</code> по
умолчанию<br />
<code>Find-Package -Name *Veeam* -Source PSGallery</code> поиск пакетов
с указанием источника<br />
<code>Install-Package -Name VeeamLogParser -ProviderName PSGallery -scope CurrentUser</code><br />
<code>Get-Command *Veeam*</code><br />
<code>Import-Module -Name VeeamLogParser</code> загрузить модуль<br />
<code>Get-Module VeeamLogParser | select -ExpandProperty ExportedCommands</code>
отобразить список функций</p>
<h3 id="winget">winget</h3>
<p><a href="https://github.com/microsoft/winget-cli">Source</a> <a
href="https://winget.run">Web</a></p>
<p><code>winget list</code> список установленных пакетов<br />
<code>winget search VLC</code> найти пакет<br />
<code>winget show VideoLAN.VLC</code> информация о пакете<br />
<code>winget show VideoLAN.VLC --versions</code> список доступных версий
в репозитории<br />
<code>winget install VideoLAN.VLC</code> установить пакет<br />
<code>winget uninstall VideoLAN.VLC</code> удалить пакет<br />
<code>winget download jqlang.jq</code> загрузкить пакет
(https://github.com/jqlang/jq/releases/download/jq-1.7/jq-windows-amd64.exe)<br />
<code>winget install jqlang.jq</code> добавляет в переменную среду и
псевдоним командной строки jq<br />
<code>winget uninstall jqlang.jq</code></p>
<h3 id="jqlang-install">jqlang-install</h3>
<div class="sourceCode" id="cb157"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb157-1"><a href="#cb157-1" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>uri<span class="op">]</span><span class="va">$url</span> <span class="op">=</span> <span class="op">$($(</span><span class="fu">irm</span> https<span class="op">://</span>api<span class="op">.</span><span class="fu">github</span><span class="op">.</span><span class="fu">com</span><span class="op">/</span>repos<span class="op">/</span>jqlang<span class="op">/</span>jq<span class="op">/</span>releases<span class="op">/</span>latest<span class="op">).</span><span class="fu">assets</span><span class="op">.</span><span class="fu">browser_download_url</span> <span class="op">-match</span> <span class="st">&quot;windows-amd64&quot;</span><span class="op">).</span><span class="fu">ToString</span><span class="op">()</span> <span class="co"># получить версию latest на GitHub</span></span>
<span id="cb157-2"><a href="#cb157-2" aria-hidden="true" tabindex="-1"></a><span class="fu">irm</span> <span class="va">$url</span> <span class="op">-</span>OutFile <span class="st">&quot;C:\Windows\System32\jq.exe&quot;</span> <span class="co"># загрузить jq.exe</span></span></code></pre></div>
<h3 id="scoop">Scoop</h3>
<p><code>Set-ExecutionPolicy RemoteSigned -Scope CurrentUser</code><br />
<code>irm get.scoop.sh | iex</code> установка<br />
<code>scoop help</code><br />
<code>scoop search jq</code><br />
<code>scoop info jq</code><br />
<code>(scoop info jq).version</code><br />
<code>scoop cat jq</code><br />
<code>scoop download jq</code> C:<br />
<code>scoop install jq</code> C:\1.7<br />
<code>scoop list</code><br />
<code>(scoop list).version</code><br />
<code>scoop uninstall jq</code></p>
<h3 id="chocolatey">Chocolatey</h3>
<div class="sourceCode" id="cb158"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb158-1"><a href="#cb158-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Set-ExecutionPolicy</span> Bypass <span class="op">-</span>Scope <span class="cf">Process</span> <span class="op">-</span>Force<span class="op">;</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">ServicePointManager</span><span class="op">]::</span>SecurityProtocol <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">ServicePointManager</span><span class="op">]::</span>SecurityProtocol <span class="op">-bor</span> <span class="dv">3072</span><span class="op">;</span> <span class="fu">iex</span> <span class="op">((</span><span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">WebClient</span><span class="op">).</span><span class="fu">DownloadString</span><span class="op">(</span><span class="st">&#39;https://community.chocolatey.org/install.ps1&#39;</span><span class="op">))</span></span></code></pre></div>
<p><code>choco -v</code><br />
<code>choco -help</code><br />
<code>choco list</code><br />
<code>choco install adobereader</code></p>
<h1 id="nuget">NuGet</h1>
<p><code>Invoke-RestMethod https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile "$home\Documents\nuget.exe"</code><br />
<code>Invoke-Expression "$home\Documents\nuget.exe search Selenium.WebDriver"</code><br />
<code>Invoke-Expression "$home\Documents\nuget.exe install Selenium.WebDriver"</code><br />
<code>Get-Item $home\Documents\*Selenium*</code></p>
<p><code>&amp; "$home\Documents\nuget.exe" list console-translate</code><br />
<code>$nuget_api_key = "&lt;API-KEY&gt;"</code><br />
<code>$source = "https://api.nuget.org/v3/index.json"</code><br />
<code>$Name = "Console-Translate"</code><br />
<code>$path = "$home\Documents\$Name"</code><br />
<code>New-Item -Type Directory $path</code><br />
<code>Copy-Item "$home\Documents\Git\$Name\$Name\0.2\*" "$path\"</code><br />
<code>Copy-Item "$home\Documents\Git\$Name\LICENSE" "$path\"</code><br />
<code>Copy-Item "$home\Documents\Git\$Name\README.md" "$path\"</code></p>
<div class="sourceCode" id="cb159"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb159-1"><a href="#cb159-1" aria-hidden="true" tabindex="-1"></a><span class="st">&#39;&lt;?xml version=&quot;1.0&quot;?&gt;</span></span>
<span id="cb159-2"><a href="#cb159-2" aria-hidden="true" tabindex="-1"></a><span class="st">&lt;package &gt;</span></span>
<span id="cb159-3"><a href="#cb159-3" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;metadata&gt;</span></span>
<span id="cb159-4"><a href="#cb159-4" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;id&gt;Console-Translate&lt;/id&gt;</span></span>
<span id="cb159-5"><a href="#cb159-5" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;version&gt;0.2.2&lt;/version&gt;</span></span>
<span id="cb159-6"><a href="#cb159-6" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;authors&gt;Lifailon&lt;/authors&gt;</span></span>
<span id="cb159-7"><a href="#cb159-7" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;owners&gt;Lifailon&lt;/owners&gt;</span></span>
<span id="cb159-8"><a href="#cb159-8" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;description&gt;Cross-platform client for translating text in the console, uses API Google (edded public free token), MyMemory and DeepLX (no token required)&lt;/description&gt;</span></span>
<span id="cb159-9"><a href="#cb159-9" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;tags&gt;PowerShell, Module, Translate, api&lt;/tags&gt;</span></span>
<span id="cb159-10"><a href="#cb159-10" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;projectUrl&gt;https://github.com/Lifailon/Console-Translate&lt;/projectUrl&gt;</span></span>
<span id="cb159-11"><a href="#cb159-11" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;contentFiles&gt;</span></span>
<span id="cb159-12"><a href="#cb159-12" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;files include=&quot;Console-Translate.psm1&quot; buildAction=&quot;Content&quot; /&gt;</span></span>
<span id="cb159-13"><a href="#cb159-13" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;files include=&quot;Console-Translate.psd1&quot; buildAction=&quot;Content&quot; /&gt;</span></span>
<span id="cb159-14"><a href="#cb159-14" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;files include=&quot;lang-iso-639-1.csv&quot; buildAction=&quot;Content&quot; /&gt;</span></span>
<span id="cb159-15"><a href="#cb159-15" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;files include=&quot;README.md&quot; buildAction=&quot;Content&quot; /&gt;</span></span>
<span id="cb159-16"><a href="#cb159-16" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;files include=&quot;LICENSE&quot; buildAction=&quot;Content&quot; /&gt;</span></span>
<span id="cb159-17"><a href="#cb159-17" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;/contentFiles&gt;</span></span>
<span id="cb159-18"><a href="#cb159-18" aria-hidden="true" tabindex="-1"></a><span class="st"> &lt;/metadata&gt;</span></span>
<span id="cb159-19"><a href="#cb159-19" aria-hidden="true" tabindex="-1"></a><span class="st">&lt;/package&gt;&#39;</span> <span class="op">&gt;</span> <span class="st">&quot;</span><span class="va">$path</span><span class="st">\</span><span class="va">$Name</span><span class="st">.nuspec&quot;</span></span></code></pre></div>
<p><code>Set-Location $path</code><br />
<code>&amp; "$home\Documents\nuget.exe" pack "$path\$Name.nuspec"</code><br />
<code>&amp; "$home\Documents\nuget.exe" push "$path\$Name.0.2.2.nupkg" -ApiKey $nuget_api_key -Source $source</code><br />
<code>&amp; "$home\Documents\nuget.exe" push "$path\$Name.0.2.2.nupkg" -ApiKey $nuget_api_key -Source $source -SkipDuplicate</code></p>
<p><code>Install-Package Console-Translate -Source nuget.org</code><br />
<code>Get-Package Console-Translate | select *</code></p>
<p><code>Register-PSRepository -Name "NuGet" -SourceLocation "https://www.nuget.org/api/v2" -InstallationPolicy Trusted</code><br />
<code>Get-PSRepository</code><br />
<code>Find-Module -Name Console-Translate</code><br />
<code>Install-Module Console-Translate -Repository NuGet</code></p>
<p><code>&amp; "$home\Documents\nuget.exe" delete Console-Translate 0.2.0 -Source https://api.nuget.org/v3/index.json -ApiKey $nuget_api_key -NoPrompt</code></p>
<h1 id="git">Git</h1>
<p><code>git --version</code><br />
<code>git config --global user.name "Lifailon"</code> добавить имя для
коммитов<br />
<code>git config --global user.email "lifailon@yandex.ru"</code><br />
<code>git config --global --edit</code><br />
<code>ssh-keygen -t rsa -b 4096</code><br />
<code>Get-Service | where name -match "ssh-agent" | Set-Service -StartupType Automatic</code><br />
<code>Get-Service | where name -match "ssh-agent" | Start-Service</code><br />
<code>Get-Service | where name -match "ssh-agent" | select Name,Status,StartType</code><br />
<code>ssh-agent</code><br />
<code>ssh-add C:\Users\Lifailon\.ssh\id_rsa</code><br />
<code>cat ~\.ssh\id_rsa.pub | Set-Clipboard</code> copy to
https://github.com/settings/keys<br />
<code>cd $home\Documents\Git</code><br />
<code>git clone git@github.com:Lifailon/PowerShell-Commands</code><br />
<code>cd PowerShell-Commands</code><br />
<code>git grep powershell</code> поиск текста в файлах<br />
<code>git pull</code> синхронизировать изменения из хранилища<br />
<code>git status</code> отобразить статус изменений по файлам<br />
<code>git diff</code> отобразить изменения построчно<br />
<code>git add .</code> добавить (проиндексировать) изменения во всех
файлах<br />
<code>git commit -m "added file and changed file"</code> сохранить
изменения с комментарием<br />
<code>git push</code> синхронизировать локальные изменения с
репозиторием<br />
<code>git branch dev</code> создать новую ветку<br />
<code>git switch dev</code> переключиться на другую ветку<br />
<code>git push --set-upstream origin dev</code> добавить ветку<br />
<code>git branch -d dev</code> удалить ветку<br />
<code>git diff rsa</code> сравнить файлы текущей ветки с файлами в
указанной ветки rsa<br />
<code>git merge dev</code> слияние текущей ветки (rsa/master) с
указанной (dev)<br />
<code>git log --oneline --all</code> лог коммитов<br />
<code>git log --graph</code> коммиты и следование веток<br />
<code>git show d01f09dead3a6a8d75dda848162831c58ca0ee13</code>
отобразить подробный лог по номеру коммита<br />
<code>git checkout filename</code> откатить изменения, если не было
команды add<br />
<code>git checkout d01f09dead3a6a8d75dda848162831c58ca0ee13</code>
переключить локальные файлы рабочей копии на указанный коммит (изменить
HEAD на указанный коммит)<br />
<code>git reset HEAD filename</code> откатить изменения последнего
индекса, если был add но не было commit, тем самым вернуться до
последней зафиксированный версии (коммита) и потом выполнить
checkout<br />
<code>git reset --mixed HEAD filename</code> изменения, содержащиеся в
отменяемом коммите, не должны исчезнуть, они будут сохранены в виде
локальных изменений в рабочей копии<br />
<code>git restore filename</code> отменить все локальные изменения в
рабочей копии<br />
<code>git restore --source d01f09dead3a6a8d75dda848162831c58ca0ee13 filename</code>
восстановить файл на указанную версию по хэшу индентификатора
коммита<br />
<code>git revert HEAD --no-edit</code> отменить последний коммит, без
указания комментария (события записываются в git log)<br />
<code>git reset --hard d01f09dead3a6a8d75dda848162831c58ca0ee13</code>
удалить все коммиты до указанного (и откатиться до него)</p>
<h1 id="dsc">DSC</h1>
<p><code>Import-Module PSDesiredStateConfiguration</code><br />
<code>Get-Command -Module PSDesiredStateConfiguration</code><br />
<code>(Get-Module PSDesiredStateConfiguration).ExportedCommands</code><br />
<code>Get-DscLocalConfigurationManager</code></p>
<p><code>Get-DscResource</code><br />
<code>Get-DscResource -Name File -Syntax</code>
https://learn.microsoft.com/ru-ru/powershell/dsc/reference/resources/windows/fileresource?view=dsc-1.1</p>
<p><code>Ensure = Present</code> настройка должна быть включена (каталог
должен присутствовать, процесс должен быть запущен, если нет создать,
запустить)<br />
<code>Ensure = Absent</code> настройка должна быть выключена (каталога
быть не должно, процесс не должен быть запущен, если нет удалить,
остановить)</p>
<div class="sourceCode" id="cb160"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb160-1"><a href="#cb160-1" aria-hidden="true" tabindex="-1"></a>Configuration TestConfiguraion</span>
<span id="cb160-2"><a href="#cb160-2" aria-hidden="true" tabindex="-1"></a><span class="op">{</span></span>
<span id="cb160-3"><a href="#cb160-3" aria-hidden="true" tabindex="-1"></a> Ctrl<span class="op">+</span>Space</span>
<span id="cb160-4"><a href="#cb160-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb160-5"><a href="#cb160-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb160-6"><a href="#cb160-6" aria-hidden="true" tabindex="-1"></a>Configuration DSConfigurationProxy </span>
<span id="cb160-7"><a href="#cb160-7" aria-hidden="true" tabindex="-1"></a><span class="op">{</span></span>
<span id="cb160-8"><a href="#cb160-8" aria-hidden="true" tabindex="-1"></a> Node vproxy-01 </span>
<span id="cb160-9"><a href="#cb160-9" aria-hidden="true" tabindex="-1"></a> <span class="op">{</span></span>
<span id="cb160-10"><a href="#cb160-10" aria-hidden="true" tabindex="-1"></a> File CreateDir</span>
<span id="cb160-11"><a href="#cb160-11" aria-hidden="true" tabindex="-1"></a> <span class="op">{</span></span>
<span id="cb160-12"><a href="#cb160-12" aria-hidden="true" tabindex="-1"></a> Ensure <span class="op">=</span> <span class="st">&quot;Present&quot;</span></span>
<span id="cb160-13"><a href="#cb160-13" aria-hidden="true" tabindex="-1"></a> <span class="fu">Type</span> <span class="op">=</span> <span class="st">&quot;Directory&quot;</span></span>
<span id="cb160-14"><a href="#cb160-14" aria-hidden="true" tabindex="-1"></a> DestinationPath <span class="op">=</span> <span class="st">&quot;C:\Temp&quot;</span></span>
<span id="cb160-15"><a href="#cb160-15" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb160-16"><a href="#cb160-16" aria-hidden="true" tabindex="-1"></a> Service StopW32time</span>
<span id="cb160-17"><a href="#cb160-17" aria-hidden="true" tabindex="-1"></a> <span class="op">{</span></span>
<span id="cb160-18"><a href="#cb160-18" aria-hidden="true" tabindex="-1"></a> Name <span class="op">=</span> <span class="st">&quot;w32time&quot;</span></span>
<span id="cb160-19"><a href="#cb160-19" aria-hidden="true" tabindex="-1"></a> State <span class="op">=</span> <span class="st">&quot;Stopped&quot;</span><span class="ch">` </span>Running</span>
<span id="cb160-20"><a href="#cb160-20" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb160-21"><a href="#cb160-21" aria-hidden="true" tabindex="-1"></a> WindowsProcess RunCalc</span>
<span id="cb160-22"><a href="#cb160-22" aria-hidden="true" tabindex="-1"></a> <span class="op">{</span></span>
<span id="cb160-23"><a href="#cb160-23" aria-hidden="true" tabindex="-1"></a> Ensure <span class="op">=</span> <span class="st">&quot;Present&quot;</span></span>
<span id="cb160-24"><a href="#cb160-24" aria-hidden="true" tabindex="-1"></a> Path <span class="op">=</span> <span class="st">&quot;C:\WINDOWS\system32\calc.exe&quot;</span></span>
<span id="cb160-25"><a href="#cb160-25" aria-hidden="true" tabindex="-1"></a> Arguments <span class="op">=</span> <span class="st">&quot;&quot;</span></span>
<span id="cb160-26"><a href="#cb160-26" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb160-27"><a href="#cb160-27" aria-hidden="true" tabindex="-1"></a> Registry RegSettings</span>
<span id="cb160-28"><a href="#cb160-28" aria-hidden="true" tabindex="-1"></a> <span class="op">{</span></span>
<span id="cb160-29"><a href="#cb160-29" aria-hidden="true" tabindex="-1"></a> Ensure <span class="op">=</span> <span class="st">&quot;Present&quot;</span></span>
<span id="cb160-30"><a href="#cb160-30" aria-hidden="true" tabindex="-1"></a> Key <span class="op">=</span> <span class="st">&quot;HKEY_LOCAL_MACHINE\SOFTWARE\MySoft&quot;</span></span>
<span id="cb160-31"><a href="#cb160-31" aria-hidden="true" tabindex="-1"></a> ValueName <span class="op">=</span> <span class="st">&quot;TestName&quot;</span></span>
<span id="cb160-32"><a href="#cb160-32" aria-hidden="true" tabindex="-1"></a> ValueData <span class="op">=</span> <span class="st">&quot;TestValue&quot;</span></span>
<span id="cb160-33"><a href="#cb160-33" aria-hidden="true" tabindex="-1"></a> ValueType <span class="op">=</span> <span class="st">&quot;String&quot;</span></span>
<span id="cb160-34"><a href="#cb160-34" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb160-35"><a href="#cb160-35" aria-hidden="true" tabindex="-1"></a><span class="co"># WindowsFeature IIS</span></span>
<span id="cb160-36"><a href="#cb160-36" aria-hidden="true" tabindex="-1"></a><span class="co"># {</span></span>
<span id="cb160-37"><a href="#cb160-37" aria-hidden="true" tabindex="-1"></a><span class="co"># Ensure = &quot;Present&quot;</span></span>
<span id="cb160-38"><a href="#cb160-38" aria-hidden="true" tabindex="-1"></a><span class="co"># Name = &quot;Web-Server&quot;</span></span>
<span id="cb160-39"><a href="#cb160-39" aria-hidden="true" tabindex="-1"></a><span class="co"># }</span></span>
<span id="cb160-40"><a href="#cb160-40" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb160-41"><a href="#cb160-41" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>$Path = (DSConfigurationProxy).DirectoryName</code><br />
<code>Test-DscConfiguration -Path $Path | select *</code>
ResourcesInDesiredState - уже настроено, ResourcesNotInDesiredState - не
настроено (не соответствует)<br />
<code>Start-DscConfiguration -Path $Path</code><br />
<code>Get-Job</code><br />
<code>$srv = "vproxy-01"</code><br />
<code>Get-Service -ComputerName $srv | ? name -match w32time # Start-Service</code><br />
<code>icm $srv {Get-Process | ? ProcessName -match calc} | ft # Stop-Process -Force</code><br />
<code>icm $srv {ls C:\ | ? name -match Temp} | ft</code>
rm<code>```PowerShell Configuration InstallPowerShellCore { Import-DscResource -ModuleName PSDesiredStateConfiguration Node localhost { Script InstallPowerShellCore { GetScript = { return @{ GetScript = $GetScript } } SetScript = { [string]$url = $(Invoke-RestMethod https://api.github.com/repos/PowerShell/PowerShell/releases/latest).assets.browser_download_url -match "win-x64.zip" $downloadPath = "$home\Downloads\PowerShell.zip" $installPath = "$env:ProgramFiles\PowerShell\7" Invoke-WebRequest -Uri $url -OutFile $downloadPath Expand-Archive -Path $downloadPath -DestinationPath $installPath -Force } TestScript = { return Test-Path "$env:ProgramFiles\PowerShell\7\pwsh.exe" } } } } ```</code>$Path
=
(InstallPowerShellCore).DirectoryName<code>\</code>Test-DscConfiguration
-Path $Path<code>\</code>Start-DscConfiguration -Path $path -Wait
-Verbose<code>\</code>Get-Job`</p>
<h1 id="ansible">Ansible</h1>
<p><code>apt -y update &amp;&amp; apt -y upgrade</code><br />
<code>apt -y install ansible</code> v2.10.8<br />
<code>apt -y install ansible-core</code> v2.12.0<br />
<code>apt -y install sshpass</code></p>
<p><code>ansible-galaxy collection install ansible.windows</code>
установить коллекцию модулей<br />
<code>ansible-galaxy collection install community.windows</code><br />
<code>ansible-galaxy collection list | grep windows</code><br />
<code>ansible-config dump | grep DEFAULT_MODULE_PATH</code> путь
хранения модулей</p>
<p><code>apt-get -y install python-dev libkrb5-dev krb5-user</code>
пакеты для Kerberos аутентификации<br />
<code>apt install python3-pip</code><br />
<code>pip3 install requests-kerberos</code><br />
<code>nano /etc/krb5.conf</code> настроить [realms] и
[domain_realm]<br />
<code>kinit -C support4@domail.local</code><br />
<code>klist</code></p>
<p><code>ansible --version</code><br />
<code>config file = None</code><br />
<code>nano /etc/ansible/ansible.cfg</code> файл конфигурации</p>
<pre><code>[defaults]
inventory = /etc/ansible/hosts
# uncomment this to disable SSH key host checking
# Отключить проверку ключа ssh (для подключения используя пароль)
host_key_checking = False</code></pre>
<p><code>nano /etc/ansible/hosts</code></p>
<pre><code>[us]
pi-hole-01 ansible_host=192.168.3.101
zabbix-01 ansible_host=192.168.3.102
grafana-01 ansible_host=192.168.3.103
netbox-01 ansible_host=192.168.3.104
[all:vars]
ansible_ssh_port=2121
ansible_user=lifailon
ansible_password=123098
path_user=/home/lifailon
ansible_python_interpreter=/usr/bin/python3
[ws]
huawei-book-01 ansible_host=192.168.3.99
plex-01 ansible_host=192.168.3.100
[ws:vars]
ansible_port=5985
#ansible_port=5986
ansible_user=Lifailon
#ansible_user=support4@DOMAIN.LOCAL
ansible_password=123098
ansible_connection=winrm
ansible_winrm_scheme=http
ansible_winrm_transport=basic
#ansible_winrm_transport=kerberos
ansible_winrm_server_cert_validation=ignore
validate_certs=false
[win_ssh]
huawei-book-01 ansible_host=192.168.3.99
plex-01 ansible_host=192.168.3.100
[win_ssh:vars]
ansible_python_interpreter=C:\Users\Lifailon\AppData\Local\Programs\Python\Python311\` добавить переменную среды интерпритатора Python в Windows
ansible_connection=ssh
#ansible_shell_type=cmd
ansible_shell_type=powershell</code></pre>
<p><code>ansible-inventory --list</code> проверить конфигурацию (читает
в формате JSON) или YAML (-y) с просмотром все применяемых
переменных</p>
<h1 id="modules-1">Modules</h1>
<p><code>ansible us -m ping</code><br />
<code>ansible win_ssh -m ping</code><br />
<code>ansible us -m shell -a "uptime &amp;&amp; df -h | grep lv"</code><br />
<code>ansible us -m setup | grep -iP "mem|proc"</code> информация о
железе<br />
<code>ansible us -m apt -a "name=mc" -b</code> повысить привилегии sudo
(-b)<br />
<code>ansible us -m service -a "name=ssh state=restarted enabled=yes" -b</code>
перезапустить службу<br />
<code>echo "echo test" &gt; test.sh</code><br />
<code>ansible us -m copy -a "src=test.sh dest=/root mode=777" -b</code><br />
<code>ansible us -a "ls /root" -b</code><br />
<code>ansible us -a "cat /root/test.sh" -b</code></p>
<p><code>ansible-doc -l | grep win_</code> список всех модулей Windows
(https://docs.ansible.com/ansible/latest/collections/ansible/windows/)<br />
<code>ansible ws -m win_ping</code> windows модуль<br />
<code>ansible ws -m win_ping -u WinRM-Writer</code> указать логин<br />
<code>ansible ws -m setup</code> собрать подробную информацию о
системе<br />
<code>ansible ws -m win_whoami</code> информация о правах доступах,
группах доступа<br />
<code>ansible ws -m win_shell -a '$PSVersionTable'</code><br />
<code>ansible ws -m win_shell -a 'Get-Service | where name -match "ssh|winrm"'</code><br />
<code>ansible ws -m win_service -a "name=sshd state=stopped"</code><br />
<code>ansible ws -m win_service -a "name=sshd state=started"</code></p>
<h3 id="win_shell-varsdebug">win_shell (vars/debug)</h3>
<p><code>nano /etc/ansible/PowerShell-Vars.yml</code></p>
<pre><code>- hosts: ws
` Указать коллекцию модулей
collections:
- ansible.windows
` Задать переменные
vars:
SearchName: PermitRoot
tasks:
- name: Get port ssh
win_shell: |
Get-Content &quot;C:\Programdata\ssh\sshd_config&quot; | Select-String &quot;{{SearchName}}&quot;
` Передать вывод в переменную
register: command_output
- name: Output port ssh
` Вывести переменную на экран
debug:
var: command_output.stdout_lines</code></pre>
<p><code>ansible-playbook /etc/ansible/PowerShell-Vars.yml</code><br />
<code>ansible-playbook /etc/ansible/PowerShell-Vars.yml --extra-vars "SearchName='LogLevel|Syslog'"</code>
передать переменную</p>
<h3 id="win_powershell">win_powershell</h3>
<p><code>nano /etc/ansible/powershell-param.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Run PowerShell script with parameters
ansible.windows.win_powershell:
parameters:
Path: C:\Temp
Force: true
script: |
[CmdletBinding()]
param (
[String]$Path,
[Switch]$Force
)
New-Item -Path $Path -ItemType Directory -Force:$Force</code></pre>
<p><code>ansible-playbook /etc/ansible/powershell-param.yml</code></p>
<h3 id="win_chocolatey">win_chocolatey</h3>
<p><code>nano /etc/ansible/setup-adobe-acrobat.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Install Acrobat Reader
win_chocolatey:
name: adobereader
state: present</code></pre>
<p><code>ansible-playbook /etc/ansible/setup-adobe-acrobat.yml</code></p>
<p><code>nano /etc/ansible/setup-openssh.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: install the Win32-OpenSSH service
win_chocolatey:
name: openssh
package_params: /SSHServerFeature
state: present</code></pre>
<p><code>ansible-playbook /etc/ansible/setup-openssh.yml</code></p>
<h3 id="win_regedit">win_regedit</h3>
<p><code>nano /etc/ansible/win-set-shell-ssh-ps7.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Set the default shell to PowerShell 7 for Windows OpenSSH
win_regedit:
path: HKLM:\SOFTWARE\OpenSSH
name: DefaultShell
` data: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
data: &#39;C:\Program Files\PowerShell\7\pwsh.exe&#39;
type: string
state: present</code></pre>
<p><code>ansible-playbook /etc/ansible/win-set-shell-ssh-ps7.yml</code></p>
<h3 id="win_service">win_service</h3>
<p><code>nano /etc/ansible/win-service.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Start service
win_service:
name: sshd
state: started
# state: stopped
# state: restarted
# start_mode: auto</code></pre>
<p><code>ansible-playbook /etc/ansible/win-service.yml</code></p>
<h3 id="win_service_info">win_service_info</h3>
<p><code>nano /etc/ansible/get-service.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Get info for a single service
win_service_info:
name: sshd
register: service_info
- name: Print returned information
ansible.builtin.debug:
var: service_info.services</code></pre>
<p><code>ansible-playbook /etc/ansible/get-service.yml</code></p>
<h3 id="fetchslurp">fetch/slurp</h3>
<p><code>nano /etc/ansible/copy-from-win-to-local.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Retrieve remote file on a Windows host
# Скопировать файл из Windows-системы
ansible.builtin.fetch:
# Прочитать файл (передать в память в формате Base64)
# ansible.builtin.slurp:
src: C:\Telegraf\telegraf.conf
dest: /root/telegraf.conf
flat: yes
register: telegraf_conf
- name: Print returned information
ansible.builtin.debug:
msg: &quot;{{ telegraf_conf[&#39;content&#39;] | b64decode }}&quot;</code></pre>
<p><code>ansible-playbook /etc/ansible/copy-from-win-to-local.yml</code></p>
<h3 id="win_copy">win_copy</h3>
<p><code>echo "Get-Service | where name -eq vss | Start-Service" &gt; /home/lifailon/Start-Service-VSS.ps1</code><br />
<code>nano /etc/ansible/copy-file-to-win.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Copy file to win hosts
win_copy:
src: /home/lifailon/Start-Service-VSS.ps1
dest: C:\Users\Lifailon\Desktop\Start-Service-VSS.ps1</code></pre>
<p><code>ansible-playbook /etc/ansible/copy-file-to-win.yml</code></p>
<p><code>curl -OL https://github.com/PowerShell/PowerShell/releases/download/v7.3.6/PowerShell-7.3.6-win-x64.msi</code><br />
<code>nano /etc/ansible/copy-file-to-win.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Copy file to win hosts
win_copy:
src: /home/lifailon/PowerShell-7.3.6-win-x64.msi
dest: C:\Install\PowerShell-7.3.6.msi</code></pre>
<p><code>ansible-playbook /etc/ansible/copy-file-to-win.yml</code></p>
<h3 id="win_command">win_command</h3>
<p><code>nano /etc/ansible/run-script-ps1.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Run PowerShell Script
win_command: powershell -ExecutionPolicy ByPass -File C:\Users\Lifailon\Desktop\Start-Service-VSS.ps1</code></pre>
<p><code>ansible-playbook /etc/ansible/run-script-ps1.yml</code></p>
<h3 id="win_package">win_package</h3>
<p><code>nano /etc/ansible/setup-msi-package.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Install MSI Package
win_package:
# path: C:\Install\7z-23.01.msi
path: C:\Install\PowerShell-7.3.6.msi
arguments:
- /quiet
- /passive
- /norestart</code></pre>
<p><code>ansible-playbook /etc/ansible/setup-msi-package.yml</code></p>
<h3 id="win_firewall_rule">win_firewall_rule</h3>
<p><code>nano /etc/ansible/win-fw-open.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Open RDP port
win_firewall_rule:
name: Open RDP port
localport: 3389
action: allow
direction: in
protocol: tcp
state: present
enabled: yes</code></pre>
<p><code>ansible-playbook /etc/ansible/win-fw-open.yml</code></p>
<h3 id="win_group">win_group</h3>
<p><code>nano /etc/ansible/win-creat-group.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Create a new group
win_group:
name: deploy
description: Deploy Group
state: present</code></pre>
<p><code>ansible-playbook /etc/ansible/win-creat-group.yml</code></p>
<h3 id="win_group_membership">win_group_membership</h3>
<p><code>nano /etc/ansible/add-user-to-group.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Add a local and domain user to a local group
win_group_membership:
name: deploy
members:
- WinRM-Writer
state: present</code></pre>
<p><code>ansible-playbook /etc/ansible/add-user-to-group.yml</code></p>
<h3 id="win_user">win_user</h3>
<p><code>nano /etc/ansible/creat-win-user.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Creat user
win_user:
name: test
password: 123098
state: present
groups:
- deploy</code></pre>
<p><code>ansible-playbook /etc/ansible/creat-win-user.yml</code></p>
<p><code>nano /etc/ansible/delete-win-user.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Delete user
ansible.windows.win_user:
name: test
state: absent</code></pre>
<p><code>ansible-playbook /etc/ansible/delete-win-user.yml</code></p>
<h3 id="win_feature">win_feature</h3>
<p><code>nano /etc/ansible/install-feature.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Install Windows Feature
win_feature:
name: SNMP-Service
state: present</code></pre>
<p><code>ansible-playbook /etc/ansible/install-feature.yml</code></p>
<h3 id="win_reboot">win_reboot</h3>
<p><code>nano /etc/ansible/win-reboot.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Reboot a slow machine that might have lots of updates to apply
win_reboot:
reboot_timeout: 3600</code></pre>
<p><code>ansible-playbook /etc/ansible/win-reboot.yml</code></p>
<h3 id="win_find">win_find</h3>
<p><code>nano /etc/ansible/win-ls.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Find files in multiple paths
ansible.windows.win_find:
paths:
- D:\Install\OpenSource
patterns: [&#39;*.rar&#39;,&#39;*.zip&#39;,&#39;*.msi&#39;]
` Файл созданный менее 7 дней назад
age: -7d
` Размер файла больше 10MB
size: 10485760
` Рекурсивный поиск (в дочерних директориях)
recurse: true
register: command_output
- name: Output
debug:
var: command_output</code></pre>
<p><code>ansible-playbook /etc/ansible/win-ls.yml</code></p>
<h3 id="win_uri">win_uri</h3>
<p><code>nano /etc/ansible/rest-get.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: REST GET request to endpoint github
ansible.windows.win_uri:
url: https://api.github.com/repos/Lifailon/pSyslog/releases/latest
register: http_output
- name: Output
debug:
var: http_output</code></pre>
<p><code>ansible-playbook /etc/ansible/rest-get.yml</code></p>
<h3 id="win_updates">win_updates</h3>
<p><code>nano /etc/ansible/win-update.yml</code></p>
<pre><code>- hosts: ws
tasks:
- name: Install only particular updates based on the KB numbers
ansible.windows.win_updates:
category_names:
- SecurityUpdates
- CriticalUpdates
- UpdateRollups
- Drivers
` Фильтрация
` accept_list:
` - KB2267602
` Поиск обновлений
` state: searched
` Загрузить обновления
` state: downloaded
` Установить обновления
state: installed
log_path: C:\Ansible-Windows-Upadte-Log.txt
reboot: false
register: wu_output
- name: Output
debug:
var: wu_output</code></pre>
<p><code>ansible-playbook /etc/ansible/win-update.yml</code></p>
<h3 id="win_chocolatey-1">win_chocolatey</h3>
<p>https://chocolatey.org/install<br />
https://community.chocolatey.org/api/v2/package/chocolatey<br />
https://docs.chocolatey.org/en-us/guides/organizations/organizational-deployment-guide</p>
<pre><code>- name: Ensure Chocolatey installed from internal repo
win_chocolatey:
name: chocolatey
state: present
# source: URL-адрес внутреннего репозитория
source: https://community.chocolatey.org/api/v2/ChocolateyInstall.ps1</code></pre>
<h1 id="gigachat">GigaChat</h1>
<h3 id="установка-сертификатов">1. Установка сертификатов:</h3>
<p><code>Invoke-WebRequest "https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt" -OutFile "$home\Downloads\russian_trusted_root_ca.cer"</code>
скачать сертификат минцифры<br />
<code>Invoke-WebRequest "https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt" -OutFile "$home\Downloads\russian_trusted_sub_ca.cer"</code><br />
<code>Import-Certificate -FilePath "$home\Downloads\russian_trusted_root_ca.cer" -CertStoreLocation "Cert:\CurrentUser\Root"</code>
установить сертификат минцифры<br />
<code>Import-Certificate -FilePath "$home\Downloads\russian_trusted_sub_ca.cer" -CertStoreLocation "Cert:\CurrentUser\CA"</code></p>
<h3
id="авторизация-по-sber-id-и-генерация-новых-авторизационных-данных-для-получения-токена-httpsdevelopers.sber.rustudio-время-жизни-30-минут">2.
Авторизация по Sber ID и генерация новых авторизационных данных для
получения токена: https://developers.sber.ru/studio (время жизни 30
минут)</h3>
<h3
id="формирование-авторизационных-данных-в-формате-base64-из-client-id-и-client-secret">3.
Формирование авторизационных данных в формате Base64 из Client ID и
Client Secret:</h3>
<div class="sourceCode" id="cb186"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb186-1"><a href="#cb186-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Client_ID</span> <span class="op">=</span> <span class="st">&quot;7e6d2f9f-825e-49b7-98f4-62fbb7506427&quot;</span> <span class="co"># [System.Guid]::Parse(&quot;7e6d2f9f-825e-49b7-98f4-62fbb7506427&quot;)</span></span>
<span id="cb186-2"><a href="#cb186-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Client_Secret</span> <span class="op">=</span> <span class="st">&quot;c35113ee-6757-47ba-9853-ea1d0d9db1ef&quot;</span> <span class="co"># [System.Guid]::Parse(&quot;c35113ee-6757-47ba-9853-ea1d0d9db1ef&quot;)</span></span>
<span id="cb186-3"><a href="#cb186-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Client_Join</span> <span class="op">=</span> <span class="va">$Client_ID</span><span class="op">+</span><span class="st">&quot;:&quot;</span><span class="op">+</span><span class="va">$Client_Secret</span> <span class="co"># объединяем два UUID в одну строку, разделяя их символом &#39;:&#39;</span></span>
<span id="cb186-4"><a href="#cb186-4" aria-hidden="true" tabindex="-1"></a><span class="va">$Bytes</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">Encoding</span><span class="op">]::</span>UTF8<span class="op">.</span><span class="fu">GetBytes</span><span class="op">(</span><span class="va">$Client_Join</span><span class="op">)</span> <span class="co"># преобразуем строку в массив байт</span></span>
<span id="cb186-5"><a href="#cb186-5" aria-hidden="true" tabindex="-1"></a><span class="va">$Cred_Base64</span> <span class="op">=</span> <span class="op">[</span>Convert<span class="op">]::</span>ToBase64String<span class="op">(</span><span class="va">$Bytes</span><span class="op">)</span> <span class="co"># кодируем байты в строку Base64</span></span></code></pre></div>
<h3 id="получение-токена">4. Получение токена:</h3>
<p><code>$Cred_Base64 = "N2U2ZDJmOWYtODI1ZS00OWI3LTk4ZjQtNjJmYmI3NTA2NDI3OmIyYzgwZmZmLTEzOGUtNDg1Mi05MjgwLWE2MGI4NTc0YTM2MQ=="</code><br />
<code>$UUID = [System.Guid]::NewGuid()</code> генерируем UUID для
журналирования входящих вызовов и разбора инцидентов</p>
<div class="sourceCode" id="cb187"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb187-1"><a href="#cb187-1" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="st">&quot;https://ngw.devices.sberbank.ru:9443/api/v2/oauth&quot;</span></span>
<span id="cb187-2"><a href="#cb187-2" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb187-3"><a href="#cb187-3" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;Authorization&quot;</span> <span class="op">=</span> <span class="st">&quot;Basic </span><span class="va">$Cred_Base64</span><span class="st">&quot;</span></span>
<span id="cb187-4"><a href="#cb187-4" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;RqUID&quot;</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$UUID</span><span class="st">&quot;</span></span>
<span id="cb187-5"><a href="#cb187-5" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;Content-Type&quot;</span> <span class="op">=</span> <span class="st">&quot;application/x-www-form-urlencoded&quot;</span></span>
<span id="cb187-6"><a href="#cb187-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb187-7"><a href="#cb187-7" aria-hidden="true" tabindex="-1"></a><span class="va">$body</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb187-8"><a href="#cb187-8" aria-hidden="true" tabindex="-1"></a> scope <span class="op">=</span> <span class="st">&quot;GIGACHAT_API_PERS&quot;</span></span>
<span id="cb187-9"><a href="#cb187-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb187-10"><a href="#cb187-10" aria-hidden="true" tabindex="-1"></a><span class="va">$GIGA_TOKEN</span> <span class="op">=</span> <span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Method POST <span class="op">-</span>Headers <span class="va">$headers</span> <span class="op">-</span>Body <span class="va">$body</span><span class="op">).</span><span class="fu">access_token</span></span></code></pre></div>
<h3 id="параметры">5. Параметры:</h3>
<div class="sourceCode" id="cb188"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb188-1"><a href="#cb188-1" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$content</span> <span class="op">=</span> <span class="st">&quot;Посчитай сумму чисел: 22+33&quot;</span></span>
<span id="cb188-2"><a href="#cb188-2" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">string</span><span class="op">]</span><span class="va">$role</span> <span class="op">=</span> <span class="st">&quot;user&quot;</span> <span class="co"># роль автора сообщения (user/assistant/system)</span></span>
<span id="cb188-3"><a href="#cb188-3" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">float</span><span class="op">]</span><span class="va">$temperature</span> <span class="op">=</span> <span class="dv">0.7</span> <span class="co"># температура выборки в диапазоне от 0 до 2. Чем выше значение, тем более случайным будет ответ модели.</span></span>
<span id="cb188-4"><a href="#cb188-4" aria-hidden="true" tabindex="-1"></a><span class="op">[</span><span class="dt">float</span><span class="op">]</span><span class="va">$top_p</span> <span class="op">=</span> <span class="dv">0.1</span> <span class="co"># используется как альтернатива temperature и изменяется в диапазоне от 0 до 1. Задает вероятностную массу токенов, которые должна учитывать модель. Так, если передать значение 0.1, модель будет учитывать только токены, чья вероятностная масса входит в верхние 10%.</span></span>
<span id="cb188-5"><a href="#cb188-5" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>int64<span class="op">]</span><span class="va">$n</span> <span class="op">=</span> <span class="dv">1</span> <span class="co"># количество вариантов ответов (1..4), которые нужно сгенерировать для каждого входного сообщения</span></span>
<span id="cb188-6"><a href="#cb188-6" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>int64<span class="op">]</span><span class="va">$max_tokens</span> <span class="op">=</span> <span class="dv">512</span> <span class="co"># максимальное количество токенов, которые будут использованы для создания ответов</span></span>
<span id="cb188-7"><a href="#cb188-7" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>boolean<span class="op">]</span><span class="va">$stream</span> <span class="op">=</span> <span class="va">$false</span> <span class="co"># передавать сообщения по частям в потоке</span></span></code></pre></div>
<h3 id="составление-запросов">6. Составление запросов:</h3>
<div class="sourceCode" id="cb189"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb189-1"><a href="#cb189-1" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="st">&quot;https://gigachat.devices.sberbank.ru/api/v1/chat/completions&quot;</span></span>
<span id="cb189-2"><a href="#cb189-2" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb189-3"><a href="#cb189-3" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;Authorization&quot;</span> <span class="op">=</span> <span class="st">&quot;Bearer </span><span class="va">$GIGA_TOKEN</span><span class="st">&quot;</span></span>
<span id="cb189-4"><a href="#cb189-4" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;Content-Type&quot;</span> <span class="op">=</span> <span class="st">&quot;application/json&quot;</span></span>
<span id="cb189-5"><a href="#cb189-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb189-6"><a href="#cb189-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb189-7"><a href="#cb189-7" aria-hidden="true" tabindex="-1"></a><span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="st">&quot;https://gigachat.devices.sberbank.ru/api/v1/models&quot;</span> <span class="op">-</span>Headers <span class="va">$headers</span><span class="op">).</span><span class="fu">data</span> <span class="co"># список доступных моделей</span></span>
<span id="cb189-8"><a href="#cb189-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb189-9"><a href="#cb189-9" aria-hidden="true" tabindex="-1"></a><span class="va">$body</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb189-10"><a href="#cb189-10" aria-hidden="true" tabindex="-1"></a> model <span class="op">=</span> <span class="st">&quot;GigaChat:latest&quot;</span></span>
<span id="cb189-11"><a href="#cb189-11" aria-hidden="true" tabindex="-1"></a> messages <span class="op">=</span> <span class="op">@(</span></span>
<span id="cb189-12"><a href="#cb189-12" aria-hidden="true" tabindex="-1"></a> @<span class="op">{</span></span>
<span id="cb189-13"><a href="#cb189-13" aria-hidden="true" tabindex="-1"></a> role <span class="op">=</span> <span class="va">$role</span></span>
<span id="cb189-14"><a href="#cb189-14" aria-hidden="true" tabindex="-1"></a> content <span class="op">=</span> <span class="va">$content</span></span>
<span id="cb189-15"><a href="#cb189-15" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb189-16"><a href="#cb189-16" aria-hidden="true" tabindex="-1"></a> <span class="op">)</span></span>
<span id="cb189-17"><a href="#cb189-17" aria-hidden="true" tabindex="-1"></a> temperature <span class="op">=</span> <span class="va">$temperature</span></span>
<span id="cb189-18"><a href="#cb189-18" aria-hidden="true" tabindex="-1"></a> n <span class="op">=</span> <span class="va">$n</span></span>
<span id="cb189-19"><a href="#cb189-19" aria-hidden="true" tabindex="-1"></a> max_tokens <span class="op">=</span> <span class="va">$max_tokens</span></span>
<span id="cb189-20"><a href="#cb189-20" aria-hidden="true" tabindex="-1"></a> stream <span class="op">=</span> <span class="va">$stream</span></span>
<span id="cb189-21"><a href="#cb189-21" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span></span>
<span id="cb189-22"><a href="#cb189-22" aria-hidden="true" tabindex="-1"></a><span class="va">$Request</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Headers <span class="va">$headers</span> <span class="op">-</span>Body <span class="va">$body</span></span>
<span id="cb189-23"><a href="#cb189-23" aria-hidden="true" tabindex="-1"></a><span class="va">$Request</span><span class="op">.</span><span class="fu">choices</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">content</span></span></code></pre></div>
<h2 id="curl">Curl</h2>
<h3 id="установка-сертификатов-в-ubuntu">Установка сертификатов в
Ubuntu:</h3>
<p><code>wget https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt</code><br />
<code>wget https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt</code><br />
<code>mkdir /usr/local/share/ca-certificates/russian_trusted</code><br />
<code>cp russian_trusted_root_ca_pem.crt russian_trusted_sub_ca_pem.crt /usr/local/share/ca-certificates/russian_trusted</code><br />
<code>update-ca-certificates -v</code><br />
<code>wget -qS --spider --max-redirect=0 https://www.sberbank.ru</code></p>
<h3 id="получение-токена-1">Получение токена:</h3>
<div class="sourceCode" id="cb190"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb190-1"><a href="#cb190-1" aria-hidden="true" tabindex="-1"></a><span class="va">Cred_Base64</span><span class="op">=</span><span class="st">&quot;N2U2ZDJmOWYtODI1ZS00OWI3LTk4ZjQtNjJmYmI3NTA2NDI3OmIyYzgwZmZmLTEzOGUtNDg1Mi05MjgwLWE2MGI4NTc0YTM2MQ==&quot;</span></span>
<span id="cb190-2"><a href="#cb190-2" aria-hidden="true" tabindex="-1"></a><span class="va">UUID</span><span class="op">=</span><span class="va">$(</span><span class="fu">uuidgen</span><span class="va">)</span></span>
<span id="cb190-3"><a href="#cb190-3" aria-hidden="true" tabindex="-1"></a><span class="va">GIGA_TOKEN</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">--location</span> <span class="at">--request</span> POST <span class="st">&quot;https://ngw.devices.sberbank.ru:9443/api/v2/oauth&quot;</span> <span class="dt">\</span></span>
<span id="cb190-4"><a href="#cb190-4" aria-hidden="true" tabindex="-1"></a>--header <span class="st">&quot;Authorization: Basic </span><span class="va">$Cred_Base64</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb190-5"><a href="#cb190-5" aria-hidden="true" tabindex="-1"></a>--header <span class="st">&quot;RqUID: </span><span class="va">$UUID</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb190-6"><a href="#cb190-6" aria-hidden="true" tabindex="-1"></a>--header <span class="st">&quot;Content-Type: application/x-www-form-urlencoded&quot;</span> <span class="dt">\</span></span>
<span id="cb190-7"><a href="#cb190-7" aria-hidden="true" tabindex="-1"></a>--data-urlencode <span class="st">&#39;scope=GIGACHAT_API_PERS&#39;</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .access_token<span class="va">)</span></span></code></pre></div>
<p><code>curl -s --location "https://gigachat.devices.sberbank.ru/api/v1/models" --header "Authorization: Bearer $GIGA_TOKEN" | jq .</code>
для проверки</p>
<h3 id="составление-запроса">Составление запроса:</h3>
<div class="sourceCode" id="cb191"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb191-1"><a href="#cb191-1" aria-hidden="true" tabindex="-1"></a><span class="va">request</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> https://gigachat.devices.sberbank.ru/api/v1/chat/completions <span class="dt">\</span></span>
<span id="cb191-2"><a href="#cb191-2" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;Content-Type: application/json&quot;</span> <span class="dt">\</span></span>
<span id="cb191-3"><a href="#cb191-3" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;Authorization: Bearer </span><span class="va">$GIGA_TOKEN</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb191-4"><a href="#cb191-4" aria-hidden="true" tabindex="-1"></a> <span class="at">-d</span> <span class="st">&#39;{</span></span>
<span id="cb191-5"><a href="#cb191-5" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;model&quot;: &quot;GigaChat:latest&quot;,</span></span>
<span id="cb191-6"><a href="#cb191-6" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;messages&quot;: [</span></span>
<span id="cb191-7"><a href="#cb191-7" aria-hidden="true" tabindex="-1"></a><span class="st"> {</span></span>
<span id="cb191-8"><a href="#cb191-8" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;role&quot;: &quot;user&quot;,</span></span>
<span id="cb191-9"><a href="#cb191-9" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;content&quot;: &quot;Когда уже ИИ захватит этот мир?&quot;</span></span>
<span id="cb191-10"><a href="#cb191-10" aria-hidden="true" tabindex="-1"></a><span class="st"> }</span></span>
<span id="cb191-11"><a href="#cb191-11" aria-hidden="true" tabindex="-1"></a><span class="st"> ],</span></span>
<span id="cb191-12"><a href="#cb191-12" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;temperature&quot;: 0.7</span></span>
<span id="cb191-13"><a href="#cb191-13" aria-hidden="true" tabindex="-1"></a><span class="st">}&#39;</span><span class="va">)</span></span>
<span id="cb191-14"><a href="#cb191-14" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="va">$request</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .choices[].message.content</span></code></pre></div>
<h1 id="yandexgpt">YandexGPT</h1>
<h2 id="получить-oauth-token">Получить OAuth-Token:</h2>
<p>https://cloud.yandex.ru/ru/docs/iam/operations/iam-token/create время
жизни IAM-токена не больше 12 часов<br />
<code>yandexPassportOauthToken="y0_AgAAAAAGaLFLAATuwQAAAAD3xtRLQE4hvlazQ5euKO43XXXXXXXXXXX"</code>
для bash<br />
<code>$yandexPassportOauthToken = "y0_AgAAAAAGaLFLAATuwQAAAAD3xtRLQE4hvlazQ5euKO43XXXXXXXXXXX"</code>
для PowerShell</p>
<h2 id="обменять-oauth-token-на-iam-token">Обменять OAuth-Token на
IAM-Token:</h2>
<p><code>IAM_TOKEN=$(curl -s -d "{\"yandexPassportOauthToken\":\"$yandexPassportOauthToken\"}" "https://iam.api.cloud.yandex.net/iam/v1/tokens" | jq -r .iamToken)</code><br />
<code>$IAM_TOKEN = $(Invoke-RestMethod -Method POST -Uri "https://iam.api.cloud.yandex.net/iam/v1/tokens" -Body $(@{yandexPassportOauthToken = "$yandexPassportOauthToken"} | ConvertTo-Json -Compress)).iamToken</code></p>
<h2 id="получить-folder_id">Получить FOLDER_ID:</h2>
<div class="sourceCode" id="cb192"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb192-1"><a href="#cb192-1" aria-hidden="true" tabindex="-1"></a><span class="va">CLOUD_ID</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-H</span> <span class="st">&quot;Authorization: Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">&quot;</span> https://resource-manager.api.cloud.yandex.net/resource-manager/v1/clouds <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .clouds[].id<span class="va">)</span> <span class="co"># получить cloud id</span></span>
<span id="cb192-2"><a href="#cb192-2" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="at">--request</span> GET <span class="at">-H</span> <span class="st">&quot;Authorization: Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">&quot;</span> https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders <span class="at">-d</span> <span class="st">&quot;{</span><span class="dt">\&quot;</span><span class="st">cloudId</span><span class="dt">\&quot;</span><span class="st">: </span><span class="dt">\&quot;</span><span class="va">$CLOUD_ID</span><span class="dt">\&quot;</span><span class="st">}&quot;</span> <span class="co"># получить список директорий в облаке</span></span>
<span id="cb192-3"><a href="#cb192-3" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="at">--request</span> POST <span class="at">-H</span> <span class="st">&quot;Authorization: Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">&quot;</span> https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders <span class="at">-d</span> <span class="st">&quot;{</span><span class="dt">\&quot;</span><span class="st">cloudId</span><span class="dt">\&quot;</span><span class="st">: </span><span class="dt">\&quot;</span><span class="va">$CLOUD_ID</span><span class="dt">\&quot;</span><span class="st">, </span><span class="dt">\&quot;</span><span class="st">name</span><span class="dt">\&quot;</span><span class="st">: </span><span class="dt">\&quot;</span><span class="st">test</span><span class="dt">\&quot;</span><span class="st">}&quot;</span> <span class="co"># создать директорию в облаке</span></span>
<span id="cb192-4"><a href="#cb192-4" aria-hidden="true" tabindex="-1"></a><span class="va">FOLDER_ID</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">--request</span> GET <span class="at">-H</span> <span class="st">&quot;Authorization: Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">&quot;</span> https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders <span class="at">-d</span> <span class="st">&#39;{&quot;cloudId&quot;: &quot;b1gf9n6heihqj0pt5piu&quot;}&#39;</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> <span class="st">&#39;.folders[] | select(.name == &quot;test&quot;) | .id&#39;</span><span class="va">)</span> <span class="co"># забрать id директории</span></span></code></pre></div>
<div class="sourceCode" id="cb193"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb193-1"><a href="#cb193-1" aria-hidden="true" tabindex="-1"></a><span class="va">$CLOUD_ID</span> <span class="op">=</span> <span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method Get <span class="op">-</span>Uri <span class="st">&quot;https://resource-manager.api.cloud.yandex.net/resource-manager/v1/clouds&quot;</span> <span class="op">-</span>Headers @<span class="op">{</span><span class="st">&quot;Authorization&quot;</span><span class="op">=</span><span class="st">&quot;Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">&quot;</span><span class="op">;</span> <span class="st">&quot;Content-Type&quot;</span><span class="op">=</span><span class="st">&quot;application/json&quot;</span><span class="op">}).</span><span class="fu">clouds</span><span class="op">.</span><span class="fu">id</span></span>
<span id="cb193-2"><a href="#cb193-2" aria-hidden="true" tabindex="-1"></a><span class="va">$FOLDER_ID</span> <span class="op">=</span> <span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method Get <span class="op">-</span>Uri <span class="st">&quot;https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders&quot;</span> <span class="op">-</span>Headers @<span class="op">{</span><span class="st">&quot;Authorization&quot;</span><span class="op">=</span><span class="st">&quot;Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">&quot;</span><span class="op">;</span> <span class="st">&quot;Content-Type&quot;</span><span class="op">=</span><span class="st">&quot;application/json&quot;</span><span class="op">}</span> <span class="op">-</span>Body <span class="op">(</span>@<span class="op">{</span><span class="st">&quot;cloudId&quot;</span><span class="op">=</span> <span class="va">$CLOUD_ID</span><span class="op">}</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)).</span><span class="fu">folders</span> <span class="op">|</span> <span class="fu">Where-Object</span> name <span class="op">-eq</span> test <span class="op">|</span> <span class="fu">Select-Object</span> <span class="op">-</span>ExpandProperty id</span></code></pre></div>
<h3 id="составление-запроса-1">Составление запроса:</h3>
<div class="sourceCode" id="cb194"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb194-1"><a href="#cb194-1" aria-hidden="true" tabindex="-1"></a><span class="va">model</span><span class="op">=</span><span class="st">&quot;gpt://</span><span class="va">$FOLDER_ID</span><span class="st">/yandexgpt/latest&quot;</span> <span class="co"># https://cloud.yandex.ru/ru/docs/yandexgpt/concepts/models</span></span>
<span id="cb194-2"><a href="#cb194-2" aria-hidden="true" tabindex="-1"></a><span class="va">body</span><span class="op">=</span><span class="va">$(</span><span class="fu">cat</span> <span class="op">&lt;&lt;EOF</span></span>
<span id="cb194-3"><a href="#cb194-3" aria-hidden="true" tabindex="-1"></a><span class="st">{</span></span>
<span id="cb194-4"><a href="#cb194-4" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;modelUri&quot;: &quot;</span><span class="va">$model</span><span class="st">&quot;,</span></span>
<span id="cb194-5"><a href="#cb194-5" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;completionOptions&quot;: {</span></span>
<span id="cb194-6"><a href="#cb194-6" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;stream&quot;: false,</span></span>
<span id="cb194-7"><a href="#cb194-7" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;temperature&quot;: 0.6,</span></span>
<span id="cb194-8"><a href="#cb194-8" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;maxTokens&quot;: 2000</span></span>
<span id="cb194-9"><a href="#cb194-9" aria-hidden="true" tabindex="-1"></a><span class="st"> },</span></span>
<span id="cb194-10"><a href="#cb194-10" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;messages&quot;: [</span></span>
<span id="cb194-11"><a href="#cb194-11" aria-hidden="true" tabindex="-1"></a><span class="st"> {</span></span>
<span id="cb194-12"><a href="#cb194-12" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;role&quot;: &quot;user&quot;,</span></span>
<span id="cb194-13"><a href="#cb194-13" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;text&quot;: &quot;Посчитай сумму 22+33&quot;</span></span>
<span id="cb194-14"><a href="#cb194-14" aria-hidden="true" tabindex="-1"></a><span class="st"> }</span></span>
<span id="cb194-15"><a href="#cb194-15" aria-hidden="true" tabindex="-1"></a><span class="st"> ]</span></span>
<span id="cb194-16"><a href="#cb194-16" aria-hidden="true" tabindex="-1"></a><span class="st">}</span></span>
<span id="cb194-17"><a href="#cb194-17" aria-hidden="true" tabindex="-1"></a><span class="st">EOF)</span></span>
<span id="cb194-18"><a href="#cb194-18" aria-hidden="true" tabindex="-1"></a><span class="st">curl --request POST </span><span class="dt">\</span></span>
<span id="cb194-19"><a href="#cb194-19" aria-hidden="true" tabindex="-1"></a><span class="st"> -H &quot;Content-Type: application/json&quot; </span><span class="dt">\</span></span>
<span id="cb194-20"><a href="#cb194-20" aria-hidden="true" tabindex="-1"></a><span class="st"> -H &quot;Authorization: Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">&quot; </span><span class="dt">\</span></span>
<span id="cb194-21"><a href="#cb194-21" aria-hidden="true" tabindex="-1"></a><span class="st"> -H &quot;x-folder-id: </span><span class="va">$FOLDER_ID</span><span class="st">&quot; </span><span class="dt">\</span></span>
<span id="cb194-22"><a href="#cb194-22" aria-hidden="true" tabindex="-1"></a><span class="st"> -d &quot;</span><span class="va">$body</span><span class="st">&quot; </span><span class="dt">\</span></span>
<span id="cb194-23"><a href="#cb194-23" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;https://llm.api.cloud.yandex.net/foundationModels/v1/completion&quot;</span></span></code></pre></div>
<div class="sourceCode" id="cb195"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb195-1"><a href="#cb195-1" aria-hidden="true" tabindex="-1"></a><span class="va">$model</span> <span class="op">=</span> <span class="st">&quot;gpt://</span><span class="va">$FOLDER_ID</span><span class="st">/yandexgpt/latest&quot;</span></span>
<span id="cb195-2"><a href="#cb195-2" aria-hidden="true" tabindex="-1"></a><span class="va">$body</span> <span class="op">=</span> <span class="vs">@&quot;</span></span>
<span id="cb195-3"><a href="#cb195-3" aria-hidden="true" tabindex="-1"></a><span class="vs">{</span></span>
<span id="cb195-4"><a href="#cb195-4" aria-hidden="true" tabindex="-1"></a><span class="vs"> &quot;modelUri&quot;: &quot;</span><span class="va">$model</span><span class="vs">&quot;,</span></span>
<span id="cb195-5"><a href="#cb195-5" aria-hidden="true" tabindex="-1"></a><span class="vs"> &quot;completionOptions&quot;: {</span></span>
<span id="cb195-6"><a href="#cb195-6" aria-hidden="true" tabindex="-1"></a><span class="vs"> &quot;stream&quot;: false,</span></span>
<span id="cb195-7"><a href="#cb195-7" aria-hidden="true" tabindex="-1"></a><span class="vs"> &quot;temperature&quot;: 0.6,</span></span>
<span id="cb195-8"><a href="#cb195-8" aria-hidden="true" tabindex="-1"></a><span class="vs"> &quot;maxTokens&quot;: 2000</span></span>
<span id="cb195-9"><a href="#cb195-9" aria-hidden="true" tabindex="-1"></a><span class="vs"> },</span></span>
<span id="cb195-10"><a href="#cb195-10" aria-hidden="true" tabindex="-1"></a><span class="vs"> &quot;messages&quot;: [</span></span>
<span id="cb195-11"><a href="#cb195-11" aria-hidden="true" tabindex="-1"></a><span class="vs"> {</span></span>
<span id="cb195-12"><a href="#cb195-12" aria-hidden="true" tabindex="-1"></a><span class="vs"> &quot;role&quot;: &quot;user&quot;,</span></span>
<span id="cb195-13"><a href="#cb195-13" aria-hidden="true" tabindex="-1"></a><span class="vs"> &quot;text&quot;: &quot;Посчитай сумму 22+33&quot;</span></span>
<span id="cb195-14"><a href="#cb195-14" aria-hidden="true" tabindex="-1"></a><span class="vs"> }</span></span>
<span id="cb195-15"><a href="#cb195-15" aria-hidden="true" tabindex="-1"></a><span class="vs"> ]</span></span>
<span id="cb195-16"><a href="#cb195-16" aria-hidden="true" tabindex="-1"></a><span class="vs">}</span></span>
<span id="cb195-17"><a href="#cb195-17" aria-hidden="true" tabindex="-1"></a><span class="vs">&quot;@</span></span>
<span id="cb195-18"><a href="#cb195-18" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method POST <span class="op">-</span>Uri <span class="st">&quot;https://llm.api.cloud.yandex.net/foundationModels/v1/completion&quot;</span> <span class="op">-</span>Headers @<span class="op">{</span><span class="st">&quot;Content-Type&quot;</span><span class="op">=</span><span class="st">&quot;application/json&quot;</span><span class="op">;</span> <span class="st">&quot;Authorization&quot;</span><span class="op">=</span><span class="st">&quot;Bearer </span><span class="va">$IAM_TOKEN</span><span class="st">&quot;</span><span class="op">;</span> <span class="st">&quot;x-folder-id&quot;</span><span class="op">=</span><span class="st">&quot;</span><span class="va">$FOLDER_ID</span><span class="st">&quot;</span><span class="op">}</span> <span class="op">-</span>Body <span class="va">$body</span></span></code></pre></div>
<h1 id="superagi">SuperAGI</h1>
<p>https://github.com/TransformerOptimus/SuperAGI<br />
https://models.superagi.com/playground/generate<br />
https://documenter.getpostman.com/view/30119783/2s9YR3cFJG</p>
<div class="sourceCode" id="cb196"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb196-1"><a href="#cb196-1" aria-hidden="true" tabindex="-1"></a><span class="va">SUPERAGI_API_KEY</span><span class="op">=</span><span class="st">&quot;31f72164129XXXXX&quot;</span></span>
<span id="cb196-2"><a href="#cb196-2" aria-hidden="true" tabindex="-1"></a><span class="va">prompt</span><span class="op">=</span><span class="st">&quot;посчитай сумму 22+33, дай только ответ без лишнего текста&quot;</span></span>
<span id="cb196-3"><a href="#cb196-3" aria-hidden="true" tabindex="-1"></a><span class="va">request</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-X</span> POST <span class="st">&#39;https://api.superagi.com/v1/generate/65437cbf227a4018516ad1ce&#39;</span> <span class="dt">\</span></span>
<span id="cb196-4"><a href="#cb196-4" aria-hidden="true" tabindex="-1"></a>-H <span class="st">&#39;Content-Type: application/json&#39;</span> <span class="dt">\</span></span>
<span id="cb196-5"><a href="#cb196-5" aria-hidden="true" tabindex="-1"></a>-H <span class="st">&quot;Authorization: Bearer </span><span class="va">$SUPERAGI_API_KEY</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb196-6"><a href="#cb196-6" aria-hidden="true" tabindex="-1"></a>-d <span class="st">&#39;{</span></span>
<span id="cb196-7"><a href="#cb196-7" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;prompt&quot;: [&quot;$prompt&quot;],</span></span>
<span id="cb196-8"><a href="#cb196-8" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;max_tokens&quot;: 500,</span></span>
<span id="cb196-9"><a href="#cb196-9" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;temperature&quot;: 0.9,</span></span>
<span id="cb196-10"><a href="#cb196-10" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;top_p&quot;: 0.15,</span></span>
<span id="cb196-11"><a href="#cb196-11" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;repetition_penalty&quot;: 0,</span></span>
<span id="cb196-12"><a href="#cb196-12" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;best_of&quot;: 1.05,</span></span>
<span id="cb196-13"><a href="#cb196-13" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;top_k&quot;: 50,</span></span>
<span id="cb196-14"><a href="#cb196-14" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;stream&quot;: false</span></span>
<span id="cb196-15"><a href="#cb196-15" aria-hidden="true" tabindex="-1"></a><span class="st">}&#39;</span><span class="va">)</span></span>
<span id="cb196-16"><a href="#cb196-16" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="va">$request</span> <span class="kw">|</span> <span class="fu">sed</span> <span class="st">&quot;s/data: //&quot;</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .choices[].text</span></code></pre></div>
<div class="sourceCode" id="cb197"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb197-1"><a href="#cb197-1" aria-hidden="true" tabindex="-1"></a><span class="va">$SUPERAGI_API_KEY</span> <span class="op">=</span> <span class="st">&quot;31f72164129XXXXX&quot;</span></span>
<span id="cb197-2"><a href="#cb197-2" aria-hidden="true" tabindex="-1"></a><span class="va">$prompt</span> <span class="op">=</span> <span class="st">&quot;посчитай сумму 22+33, дай только ответ без лишнего текста&quot;</span></span>
<span id="cb197-3"><a href="#cb197-3" aria-hidden="true" tabindex="-1"></a><span class="va">$request</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Method Post <span class="op">-</span>Uri <span class="st">&#39;https://api.superagi.com/v1/generate/65437cbf227a4018516ad1ce&#39;</span> <span class="op">-</span>Headers @<span class="op">{</span></span>
<span id="cb197-4"><a href="#cb197-4" aria-hidden="true" tabindex="-1"></a> <span class="st">&#39;Content-Type&#39;</span> <span class="op">=</span> <span class="st">&#39;application/json&#39;</span></span>
<span id="cb197-5"><a href="#cb197-5" aria-hidden="true" tabindex="-1"></a> <span class="st">&#39;Authorization&#39;</span> <span class="op">=</span> <span class="st">&quot;Bearer </span><span class="va">$SUPERAGI_API_KEY</span><span class="st">&quot;</span></span>
<span id="cb197-6"><a href="#cb197-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">-</span>Body <span class="op">(</span>@<span class="op">{</span></span>
<span id="cb197-7"><a href="#cb197-7" aria-hidden="true" tabindex="-1"></a> prompt <span class="op">=</span> <span class="op">@(</span><span class="va">$prompt</span><span class="op">)</span></span>
<span id="cb197-8"><a href="#cb197-8" aria-hidden="true" tabindex="-1"></a> max_tokens <span class="op">=</span> <span class="dv">500</span></span>
<span id="cb197-9"><a href="#cb197-9" aria-hidden="true" tabindex="-1"></a> temperature <span class="op">=</span> <span class="dv">0.9</span></span>
<span id="cb197-10"><a href="#cb197-10" aria-hidden="true" tabindex="-1"></a> top_p <span class="op">=</span> <span class="dv">0.15</span></span>
<span id="cb197-11"><a href="#cb197-11" aria-hidden="true" tabindex="-1"></a> repetition_penalty <span class="op">=</span> <span class="dv">0</span></span>
<span id="cb197-12"><a href="#cb197-12" aria-hidden="true" tabindex="-1"></a> best_of <span class="op">=</span> <span class="dv">1.05</span></span>
<span id="cb197-13"><a href="#cb197-13" aria-hidden="true" tabindex="-1"></a> top_k <span class="op">=</span> <span class="dv">50</span></span>
<span id="cb197-14"><a href="#cb197-14" aria-hidden="true" tabindex="-1"></a> stream <span class="op">=</span> <span class="va">$false</span></span>
<span id="cb197-15"><a href="#cb197-15" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span><span class="op">)</span></span>
<span id="cb197-16"><a href="#cb197-16" aria-hidden="true" tabindex="-1"></a><span class="op">$(</span><span class="va">$request</span> <span class="op">-replace</span> <span class="st">&quot;^data: &quot;</span> <span class="op">|</span> <span class="fu">ConvertFrom-Json</span><span class="op">).</span><span class="fu">choices</span><span class="op">.</span><span class="fu">text</span></span></code></pre></div>
<h1 id="replicate">Replicate</h1>
<p>https://replicate.com/stability-ai/stable-diffusion/examples?input=http</p>
<div class="sourceCode" id="cb198"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb198-1"><a href="#cb198-1" aria-hidden="true" tabindex="-1"></a><span class="va">REPLICATE_API_TOKEN</span><span class="op">=</span><span class="st">&quot;r8_STyeUNXiGonkLfxE1FSKaqll26lXXXXXXXXXX&quot;</span></span>
<span id="cb198-2"><a href="#cb198-2" aria-hidden="true" tabindex="-1"></a><span class="va">prompt</span><span class="op">=</span><span class="st">&quot;Жираф в полоску зебры&quot;</span></span>
<span id="cb198-3"><a href="#cb198-3" aria-hidden="true" tabindex="-1"></a><span class="va">request</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-X</span> POST <span class="dt">\</span></span>
<span id="cb198-4"><a href="#cb198-4" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;Authorization: Token </span><span class="va">$REPLICATE_API_TOKEN</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb198-5"><a href="#cb198-5" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;Content-Type: application/json&quot;</span> <span class="dt">\</span></span>
<span id="cb198-6"><a href="#cb198-6" aria-hidden="true" tabindex="-1"></a> <span class="at">-d</span> <span class="st">$&#39;{</span></span>
<span id="cb198-7"><a href="#cb198-7" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;version&quot;: &quot;ac732df83cea7fff18b8472768c88ad041fa750ff7682a21affe81863cbe77e4&quot;,</span></span>
<span id="cb198-8"><a href="#cb198-8" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;input&quot;: {</span></span>
<span id="cb198-9"><a href="#cb198-9" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;prompt&quot;: &quot;$prompt&quot;</span></span>
<span id="cb198-10"><a href="#cb198-10" aria-hidden="true" tabindex="-1"></a><span class="st"> }</span></span>
<span id="cb198-11"><a href="#cb198-11" aria-hidden="true" tabindex="-1"></a><span class="st"> }&#39;</span> <span class="dt">\</span></span>
<span id="cb198-12"><a href="#cb198-12" aria-hidden="true" tabindex="-1"></a> https://api.replicate.com/v1/predictions<span class="va">)</span></span>
<span id="cb198-13"><a href="#cb198-13" aria-hidden="true" tabindex="-1"></a><span class="va">request_url</span><span class="op">=</span><span class="va">$(</span><span class="bu">echo</span> <span class="va">$request</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .urls.get<span class="va">)</span></span>
<span id="cb198-14"><a href="#cb198-14" aria-hidden="true" tabindex="-1"></a><span class="va">response_status</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-H</span> <span class="st">&quot;Authorization: Token </span><span class="va">$REPLICATE_API_TOKEN</span><span class="st">&quot;</span> <span class="va">$request_url</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .status<span class="va">)</span></span>
<span id="cb198-15"><a href="#cb198-15" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="kw">[[</span> <span class="va">$response_status</span> <span class="ot">!=</span> succeeded <span class="kw">]];</span> <span class="cf">do</span></span>
<span id="cb198-16"><a href="#cb198-16" aria-hidden="true" tabindex="-1"></a> <span class="va">response_status</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-H</span> <span class="st">&quot;Authorization: Token </span><span class="va">$REPLICATE_API_TOKEN</span><span class="st">&quot;</span> <span class="va">$request_url</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .status<span class="va">)</span></span>
<span id="cb198-17"><a href="#cb198-17" aria-hidden="true" tabindex="-1"></a><span class="cf">done</span></span>
<span id="cb198-18"><a href="#cb198-18" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-H</span> <span class="st">&quot;Authorization: Token </span><span class="va">$REPLICATE_API_TOKEN</span><span class="st">&quot;</span> <span class="va">$request_url</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .output[]</span></code></pre></div>
<div class="sourceCode" id="cb199"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb199-1"><a href="#cb199-1" aria-hidden="true" tabindex="-1"></a><span class="va">$REPLICATE_API_TOKEN</span> <span class="op">=</span> <span class="st">&quot;r8_STyeUNXiGonkLfxE1FSKaqll26lXXXXXXXXXX&quot;</span></span>
<span id="cb199-2"><a href="#cb199-2" aria-hidden="true" tabindex="-1"></a><span class="va">$prompt</span> <span class="op">=</span> <span class="st">&quot;Жираф в полоску зебры&quot;</span></span>
<span id="cb199-3"><a href="#cb199-3" aria-hidden="true" tabindex="-1"></a><span class="va">$body</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb199-4"><a href="#cb199-4" aria-hidden="true" tabindex="-1"></a> version <span class="op">=</span> <span class="st">&quot;ac732df83cea7fff18b8472768c88ad041fa750ff7682a21affe81863cbe77e4&quot;</span></span>
<span id="cb199-5"><a href="#cb199-5" aria-hidden="true" tabindex="-1"></a> input <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb199-6"><a href="#cb199-6" aria-hidden="true" tabindex="-1"></a> prompt <span class="op">=</span> <span class="va">$prompt</span></span>
<span id="cb199-7"><a href="#cb199-7" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb199-8"><a href="#cb199-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span></span>
<span id="cb199-9"><a href="#cb199-9" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb199-10"><a href="#cb199-10" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;Authorization&quot;</span> <span class="op">=</span> <span class="st">&quot;Token </span><span class="va">$REPLICATE_API_TOKEN</span><span class="st">&quot;</span></span>
<span id="cb199-11"><a href="#cb199-11" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;Content-Type&quot;</span> <span class="op">=</span> <span class="st">&quot;application/json&quot;</span></span>
<span id="cb199-12"><a href="#cb199-12" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb199-13"><a href="#cb199-13" aria-hidden="true" tabindex="-1"></a><span class="va">$request</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="st">&quot;https://api.replicate.com/v1/predictions&quot;</span> <span class="op">-</span>Method POST <span class="op">-</span>Body <span class="va">$body</span> <span class="op">-</span>Headers <span class="va">$headers</span></span>
<span id="cb199-14"><a href="#cb199-14" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">$(</span><span class="va">$request</span><span class="op">.</span><span class="fu">urls</span><span class="op">.</span><span class="fu">get</span><span class="op">)</span> <span class="op">-</span>Headers @<span class="op">{</span><span class="st">&quot;Authorization&quot;</span> <span class="op">=</span> <span class="st">&quot;Token </span><span class="va">$REPLICATE_API_TOKEN</span><span class="st">&quot;</span><span class="op">}</span></span>
<span id="cb199-15"><a href="#cb199-15" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span><span class="va">$response</span><span class="op">.</span><span class="fu">status</span> <span class="op">-ne</span> <span class="st">&quot;succeeded&quot;</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb199-16"><a href="#cb199-16" aria-hidden="true" tabindex="-1"></a> <span class="va">$response</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">$(</span><span class="va">$request</span><span class="op">.</span><span class="fu">urls</span><span class="op">.</span><span class="fu">get</span><span class="op">)</span> <span class="op">-</span>Headers @<span class="op">{</span><span class="st">&quot;Authorization&quot;</span> <span class="op">=</span> <span class="st">&quot;Token </span><span class="va">$REPLICATE_API_TOKEN</span><span class="st">&quot;</span><span class="op">}</span></span>
<span id="cb199-17"><a href="#cb199-17" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb199-18"><a href="#cb199-18" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span><span class="op">.</span><span class="fu">output</span></span></code></pre></div>
<h1 id="google-api">Google-API</h1>
<h3 id="google-translate">Google-Translate</h3>
<div class="sourceCode" id="cb200"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb200-1"><a href="#cb200-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Key</span> <span class="op">=</span> <span class="st">&quot;&lt;TOKEN_API&gt;&quot;</span> <span class="co"># получить токен: https://console.cloud.google.com/apis/credentials</span></span>
<span id="cb200-2"><a href="#cb200-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Text</span> <span class="op">=</span> <span class="st">&quot;You can see in the right corner how long each translation request takes (this does not depend on the amount of text being transferred).&quot;</span></span>
<span id="cb200-3"><a href="#cb200-3" aria-hidden="true" tabindex="-1"></a><span class="va">$LanguageTarget</span> <span class="op">=</span> <span class="st">&quot;RU&quot;</span></span>
<span id="cb200-4"><a href="#cb200-4" aria-hidden="true" tabindex="-1"></a><span class="va">$LanguageSource</span> <span class="op">=</span> <span class="st">&quot;EN&quot;</span></span>
<span id="cb200-5"><a href="#cb200-5" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="st">&quot;https://translation.googleapis.com/language/translate/v2?key=</span><span class="va">$key</span><span class="st">&quot;</span></span>
<span id="cb200-6"><a href="#cb200-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Header</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb200-7"><a href="#cb200-7" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;Content-Type&quot;</span> <span class="op">=</span> <span class="st">&quot;application/json&quot;</span></span>
<span id="cb200-8"><a href="#cb200-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb200-9"><a href="#cb200-9" aria-hidden="true" tabindex="-1"></a><span class="va">$Body</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb200-10"><a href="#cb200-10" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;q&quot;</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$Text</span><span class="st">&quot;</span></span>
<span id="cb200-11"><a href="#cb200-11" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;target&quot;</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$LanguageTarget</span><span class="st">&quot;</span></span>
<span id="cb200-12"><a href="#cb200-12" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;source&quot;</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$LanguageSource</span><span class="st">&quot;</span></span>
<span id="cb200-13"><a href="#cb200-13" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span></span>
<span id="cb200-14"><a href="#cb200-14" aria-hidden="true" tabindex="-1"></a><span class="va">$WebClient</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">WebClient</span></span>
<span id="cb200-15"><a href="#cb200-15" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$key</span> <span class="kw">in</span> <span class="va">$Header</span><span class="op">.</span><span class="fu">Keys</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb200-16"><a href="#cb200-16" aria-hidden="true" tabindex="-1"></a> <span class="va">$WebClient</span><span class="op">.</span><span class="fu">Headers</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="va">$key</span><span class="op">,</span> <span class="va">$Header</span><span class="op">[</span><span class="va">$key</span><span class="op">])</span></span>
<span id="cb200-17"><a href="#cb200-17" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb200-18"><a href="#cb200-18" aria-hidden="true" tabindex="-1"></a><span class="va">$Response</span> <span class="op">=</span> <span class="va">$WebClient</span><span class="op">.</span><span class="fu">UploadString</span><span class="op">(</span><span class="va">$url</span><span class="op">,</span> <span class="st">&quot;POST&quot;</span><span class="op">,</span> <span class="va">$Body</span><span class="op">)</span> <span class="op">|</span> <span class="fu">ConvertFrom-Json</span></span>
<span id="cb200-19"><a href="#cb200-19" aria-hidden="true" tabindex="-1"></a><span class="va">$Response</span><span class="op">.</span><span class="fu">data</span><span class="op">.</span><span class="fu">translations</span><span class="op">.</span><span class="fu">translatedText</span></span></code></pre></div>
<h3 id="google-search">Google-Search</h3>
<div class="sourceCode" id="cb201"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb201-1"><a href="#cb201-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Key</span> <span class="op">=</span> <span class="st">&quot;&lt;TOKEN_API&gt;&quot;</span> <span class="co"># получить токен: https://developers.google.com/custom-search/v1/overview?hl=ru (пользовательский поиск JSON API предоставляет 100 поисковых запросов в день бесплатно)</span></span>
<span id="cb201-2"><a href="#cb201-2" aria-hidden="true" tabindex="-1"></a><span class="va">$cx</span> <span class="op">=</span> <span class="st">&quot;35c78340f49eb474a&quot;</span> <span class="co"># создать поисковую систему https://programmablesearchengine.google.com/controlpanel/all</span></span>
<span id="cb201-3"><a href="#cb201-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Query</span> <span class="op">=</span> <span class="st">&quot;как создать бота discord&quot;</span></span>
<span id="cb201-4"><a href="#cb201-4" aria-hidden="true" tabindex="-1"></a><span class="va">$Lang</span> <span class="op">=</span> <span class="st">&quot;ru&quot;</span></span>
<span id="cb201-5"><a href="#cb201-5" aria-hidden="true" tabindex="-1"></a><span class="va">$Num</span> <span class="op">=</span> <span class="dv">10</span></span>
<span id="cb201-6"><a href="#cb201-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Start</span> <span class="op">=</span> <span class="dv">0</span></span>
<span id="cb201-7"><a href="#cb201-7" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">&quot;https://www.googleapis.com/customsearch/v1?q=</span><span class="va">$Query</span><span class="st">&amp;key=</span><span class="va">$Key</span><span class="st">&amp;cx=</span><span class="va">$cx</span><span class="st">&amp;lr=lang_</span><span class="va">$Lang</span><span class="st">&amp;num=</span><span class="va">$Num</span><span class="st">&amp;</span><span class="va">$start</span><span class="st">=</span><span class="va">$Start</span><span class="st">&quot;</span></span>
<span id="cb201-8"><a href="#cb201-8" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span><span class="op">.</span><span class="fu">items</span> <span class="op">|</span> <span class="fu">Select-Object</span> title<span class="op">,</span>snippet<span class="op">,</span>displayLink<span class="op">,</span>link <span class="op">|</span> <span class="fu">Format-List</span></span></code></pre></div>
<h1 id="rapidapi">RapidAPI</h1>
<p>https://rapidapi.com/ru/neoscrap-net/api/google-search72</p>
<div class="sourceCode" id="cb202"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb202-1"><a href="#cb202-1" aria-hidden="true" tabindex="-1"></a><span class="va">$Key</span> <span class="op">=</span> <span class="st">&quot;&lt;TOKEN_API&gt;&quot;</span></span>
<span id="cb202-2"><a href="#cb202-2" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">=</span>@<span class="op">{}</span></span>
<span id="cb202-3"><a href="#cb202-3" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="st">&quot;X-RapidAPI-Key&quot;</span><span class="op">,</span> <span class="st">&quot;</span><span class="va">$Key</span><span class="st">&quot;</span><span class="op">)</span></span>
<span id="cb202-4"><a href="#cb202-4" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="st">&quot;X-RapidAPI-Host&quot;</span><span class="op">,</span> <span class="st">&quot;google-search72.p.rapidapi.com&quot;</span><span class="op">)</span></span>
<span id="cb202-5"><a href="#cb202-5" aria-hidden="true" tabindex="-1"></a><span class="va">$query</span> <span class="op">=</span> <span class="st">&quot;как создать бота discord&quot;</span></span>
<span id="cb202-6"><a href="#cb202-6" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">&quot;https://google-search72.p.rapidapi.com/search?q=</span><span class="va">$query</span><span class="st">%20gitgub&amp;gl=us&amp;lr=lang_ru&amp;num=20&amp;start=0&quot;</span> <span class="op">-</span>Method GET <span class="op">-</span>Headers <span class="va">$headers</span></span>
<span id="cb202-7"><a href="#cb202-7" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span><span class="op">.</span><span class="fu">items</span> <span class="op">|</span> <span class="fu">Select-Object</span> title<span class="op">,</span>snippet<span class="op">,</span>displayLink<span class="op">,</span>link <span class="op">|</span> <span class="fu">Format-List</span></span></code></pre></div>
<h3 id="imdb">IMDb</h3>
<p>https://rapidapi.com/apidojo/api/imdb8</p>
<div class="sourceCode" id="cb203"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb203-1"><a href="#cb203-1" aria-hidden="true" tabindex="-1"></a><span class="va">$key</span> <span class="op">=</span> <span class="st">&quot;&lt;TOKEN_API&gt;&quot;</span> <span class="co"># 500 запросов в месяц</span></span>
<span id="cb203-2"><a href="#cb203-2" aria-hidden="true" tabindex="-1"></a><span class="va">$query</span><span class="op">=</span><span class="st">&quot;Break&quot;</span></span>
<span id="cb203-3"><a href="#cb203-3" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">=</span>@<span class="op">{}</span></span>
<span id="cb203-4"><a href="#cb203-4" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="st">&quot;X-RapidAPI-Key&quot;</span><span class="op">,</span> <span class="st">&quot;</span><span class="va">$key</span><span class="st">&quot;</span><span class="op">)</span></span>
<span id="cb203-5"><a href="#cb203-5" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="st">&quot;X-RapidAPI-Host&quot;</span><span class="op">,</span> <span class="st">&quot;imdb8.p.rapidapi.com&quot;</span><span class="op">)</span></span>
<span id="cb203-6"><a href="#cb203-6" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">&quot;https://imdb8.p.rapidapi.com/title/find?q=</span><span class="va">$query</span><span class="st">&quot;</span> <span class="op">-</span>Method GET <span class="op">-</span>Headers <span class="va">$headers</span></span>
<span id="cb203-7"><a href="#cb203-7" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span><span class="op">.</span><span class="fu">results</span> <span class="op">|</span> <span class="fu">select</span> title<span class="op">,</span>titletype<span class="op">,</span>year<span class="op">,</span>runningTimeInMinutes<span class="op">,</span>id <span class="op">|</span> <span class="fu">Format-Table</span></span>
<span id="cb203-8"><a href="#cb203-8" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;https://www.imdb.com</span><span class="op">$(</span><span class="va">$response</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">id</span><span class="op">[</span><span class="dv">0</span><span class="op">])</span><span class="st">&quot;</span></span>
<span id="cb203-9"><a href="#cb203-9" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">principals</span> <span class="co"># актеры</span></span>
<span id="cb203-10"><a href="#cb203-10" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span><span class="op">.</span><span class="fu">results</span><span class="op">.</span><span class="fu">image</span></span></code></pre></div>
<h3 id="moviesdatabase">MoviesDatabase</h3>
<p>https://rapidapi.com/SAdrian/api/moviesdatabase</p>
<div class="sourceCode" id="cb204"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb204-1"><a href="#cb204-1" aria-hidden="true" tabindex="-1"></a><span class="va">$key</span> <span class="op">=</span> <span class="st">&quot;&lt;TOKEN_API&gt;&quot;</span></span>
<span id="cb204-2"><a href="#cb204-2" aria-hidden="true" tabindex="-1"></a><span class="va">$imdb_id</span> <span class="op">=</span> <span class="st">&quot;tt0455275&quot;</span></span>
<span id="cb204-3"><a href="#cb204-3" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">=</span>@<span class="op">{}</span></span>
<span id="cb204-4"><a href="#cb204-4" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="st">&quot;X-RapidAPI-Key&quot;</span><span class="op">,</span> <span class="st">&quot;</span><span class="va">$key</span><span class="st">&quot;</span><span class="op">)</span></span>
<span id="cb204-5"><a href="#cb204-5" aria-hidden="true" tabindex="-1"></a><span class="va">$headers</span><span class="op">.</span><span class="fu">Add</span><span class="op">(</span><span class="st">&quot;X-RapidAPI-Host&quot;</span><span class="op">,</span> <span class="st">&quot;moviesdatabase.p.rapidapi.com&quot;</span><span class="op">)</span></span>
<span id="cb204-6"><a href="#cb204-6" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">&quot;https://moviesdatabase.p.rapidapi.com/titles/</span><span class="va">$imdb_id</span><span class="st">&quot;</span> <span class="op">-</span>Method GET <span class="op">-</span>Headers <span class="va">$headers</span></span>
<span id="cb204-7"><a href="#cb204-7" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span><span class="op">.</span><span class="fu">results</span></span></code></pre></div>
<h1 id="tmdb">TMDB</h1>
<p>https://developer.themoviedb.org/reference/intro/getting-started</p>
<div class="sourceCode" id="cb205"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb205-1"><a href="#cb205-1" aria-hidden="true" tabindex="-1"></a><span class="va">$TOKEN</span> <span class="op">=</span> <span class="st">&quot;548e444e7812575caa0a7eXXXXXXXXXX&quot;</span></span>
<span id="cb205-2"><a href="#cb205-2" aria-hidden="true" tabindex="-1"></a><span class="va">$Endpoint</span> <span class="op">=</span> <span class="st">&quot;search/tv&quot;</span> <span class="co"># поиск сериала (tv) и фильма (movie) по названию</span></span>
<span id="cb205-3"><a href="#cb205-3" aria-hidden="true" tabindex="-1"></a><span class="va">$Query</span> <span class="op">=</span> <span class="st">&quot;зимородок&quot;</span></span>
<span id="cb205-4"><a href="#cb205-4" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="op">$(</span><span class="st">&quot;https://api.themoviedb.org/3/</span><span class="va">$Endpoint</span><span class="st">&quot;</span><span class="op">+</span><span class="st">&quot;?api_key=</span><span class="va">$TOKEN</span><span class="st">&amp;query=</span><span class="va">$Query</span><span class="st">&quot;</span><span class="op">)</span></span>
<span id="cb205-5"><a href="#cb205-5" aria-hidden="true" tabindex="-1"></a><span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Method Get<span class="op">).</span><span class="fu">results</span></span>
<span id="cb205-6"><a href="#cb205-6" aria-hidden="true" tabindex="-1"></a><span class="va">$id</span> <span class="op">=</span> <span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Method Get<span class="op">).</span><span class="fu">results</span><span class="op">.</span><span class="fu">id</span> <span class="co"># забрать id сериала (210865) https://www.themoviedb.org/tv/210865</span></span>
<span id="cb205-7"><a href="#cb205-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb205-8"><a href="#cb205-8" aria-hidden="true" tabindex="-1"></a><span class="va">$Endpoint</span> <span class="op">=</span> <span class="st">&quot;tv/</span><span class="va">$id</span><span class="st">&quot;</span> <span class="co"># получение информации о сериале по его ID</span></span>
<span id="cb205-9"><a href="#cb205-9" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="op">$(</span><span class="st">&quot;https://api.themoviedb.org/3/</span><span class="va">$Endpoint</span><span class="st">&quot;</span><span class="op">+</span><span class="st">&quot;?api_key=</span><span class="va">$TOKEN</span><span class="st">&quot;</span><span class="op">)</span></span>
<span id="cb205-10"><a href="#cb205-10" aria-hidden="true" tabindex="-1"></a><span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Method Get<span class="op">)</span> <span class="co"># список сезонов (.seasons), количество эпизодов (.seasons.episode_count)</span></span>
<span id="cb205-11"><a href="#cb205-11" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb205-12"><a href="#cb205-12" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="st">&quot;https://api.themoviedb.org/3/tv/</span><span class="va">$id</span><span class="st">/season/2?api_key=</span><span class="va">$Token</span><span class="st">&quot;</span> <span class="op">-</span>Method Get<span class="op">).</span><span class="fu">episodes</span> <span class="co"># вывести 2 сезон</span></span>
<span id="cb205-13"><a href="#cb205-13" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="st">&quot;https://api.themoviedb.org/3/tv/</span><span class="va">$id</span><span class="st">/season/2/episode/8?api_key=</span><span class="va">$Token</span><span class="st">&quot;</span> <span class="op">-</span>Method Get <span class="co"># вывести 8 эпизод</span></span></code></pre></div>
<h1 id="ivi">ivi</h1>
<p>https://ask.ivi.ru/knowledge-bases/10/articles/51697-dokumentatsiya-dlya-api-ivi</p>
<p><code>Invoke-RestMethod https://api.ivi.ru/mobileapi/categories</code>
список категорий и жанров (genres/meta_genres)<br />
<code>Invoke-RestMethod https://api.ivi.ru/mobileapi/collections</code>
подборки</p>
<p><code>(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons.number</code>
кол-во сезонов<br />
<code>(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons[1].episode_count</code>
кол-во серий во втором сезоне<br />
<code>(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.seasons[1].ivi_release_info.date_interval_min</code>
дата выхода следующей серии<br />
<code>(Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.kp_rating</code>
рейтинг в Кинопоиск (8.04)</p>
<p><code>$id = (Invoke-RestMethod "https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok").result.kp_id</code>
получить id в Кинопоиск (5106881)<br />
<code>id=$(curl -s https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok | jq .result[].kp_id)</code>
получить id в Кинопоиск</p>
<h1 id="kinopoisk">Kinopoisk</h1>
<div class="sourceCode" id="cb206"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb206-1"><a href="#cb206-1" aria-hidden="true" tabindex="-1"></a><span class="va">id</span><span class="op">=</span>5106881</span>
<span id="cb206-2"><a href="#cb206-2" aria-hidden="true" tabindex="-1"></a><span class="va">get</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> https://www.kinopoisk.ru/film/<span class="va">$id</span>/episodes/<span class="va">)</span></span>
<span id="cb206-3"><a href="#cb206-3" aria-hidden="true" tabindex="-1"></a><span class="bu">printf</span> <span class="st">&quot;%s\n&quot;</span> <span class="st">&quot;</span><span class="va">${get</span><span class="op">[@]</span><span class="va">}</span><span class="st">&quot;</span> <span class="kw">|</span> <span class="fu">grep</span> <span class="at">-A</span> 1 <span class="st">&quot;Сезон 2&quot;</span> <span class="kw">|</span> <span class="fu">grep</span> <span class="st">&quot;эпизодов&quot;</span> <span class="kw">|</span> <span class="fu">sed</span> <span class="at">-r</span> <span class="st">&quot;s/^.+\: //&quot;</span> <span class="co"># количество эпиздовод во втором сезоне (8)</span></span></code></pre></div>
<h3 id="kinopoisk.dev">kinopoisk.dev</h3>
<p>https://t.me/kinopoiskdev_bot - получить токен<br />
https://kinopoisk.dev/documentation - документация по API в формате
OpenAPI</p>
<p><code>GET /v1.4/movie/{id}</code> поиск по id</p>
<div class="sourceCode" id="cb207"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb207-1"><a href="#cb207-1" aria-hidden="true" tabindex="-1"></a><span class="va">$id</span> <span class="op">=</span> <span class="dv">5106881</span></span>
<span id="cb207-2"><a href="#cb207-2" aria-hidden="true" tabindex="-1"></a><span class="va">$API_KEY</span> <span class="op">=</span> <span class="st">&quot;ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX&quot;</span></span>
<span id="cb207-3"><a href="#cb207-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb207-4"><a href="#cb207-4" aria-hidden="true" tabindex="-1"></a><span class="va">$Header</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb207-5"><a href="#cb207-5" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;accept&quot;</span> <span class="op">=</span> <span class="st">&quot;application/json&quot;</span></span>
<span id="cb207-6"><a href="#cb207-6" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;X-API-KEY&quot;</span> <span class="op">=</span> <span class="st">&quot;</span><span class="va">$API_KEY</span><span class="st">&quot;</span></span>
<span id="cb207-7"><a href="#cb207-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb207-8"><a href="#cb207-8" aria-hidden="true" tabindex="-1"></a><span class="va">$irm</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">&quot;https://api.kinopoisk.dev/v1.4/movie/</span><span class="va">$id</span><span class="st">&quot;</span> <span class="op">-</span>Method GET <span class="op">-</span>Headers <span class="va">$Header</span></span>
<span id="cb207-9"><a href="#cb207-9" aria-hidden="true" tabindex="-1"></a><span class="va">$irm</span><span class="op">.</span><span class="fu">rating</span><span class="op">.</span><span class="fu">kp</span> <span class="co"># рейтинг в Кинопоиск (8,079)</span></span>
<span id="cb207-10"><a href="#cb207-10" aria-hidden="true" tabindex="-1"></a><span class="va">$irm</span><span class="op">.</span><span class="fu">seasonsInfo</span> <span class="co"># количество сезонов и эпизодов в них</span></span></code></pre></div>
<div class="sourceCode" id="cb208"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb208-1"><a href="#cb208-1" aria-hidden="true" tabindex="-1"></a><span class="va">id</span><span class="op">=</span>5106881</span>
<span id="cb208-2"><a href="#cb208-2" aria-hidden="true" tabindex="-1"></a><span class="va">API_KEY</span><span class="op">=</span><span class="st">&quot;ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX&quot;</span></span>
<span id="cb208-3"><a href="#cb208-3" aria-hidden="true" tabindex="-1"></a><span class="va">get</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-X</span> GET <span class="dt">\</span></span>
<span id="cb208-4"><a href="#cb208-4" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;https://api.kinopoisk.dev/v1.4/movie/</span><span class="va">$id</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb208-5"><a href="#cb208-5" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;accept: application/json&quot;</span> <span class="dt">\</span></span>
<span id="cb208-6"><a href="#cb208-6" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;X-API-KEY: </span><span class="va">$API_KEY</span><span class="st">&quot;</span><span class="va">)</span></span>
<span id="cb208-7"><a href="#cb208-7" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="va">$get</span> <span class="kw">|</span> <span class="ex">jq</span> .rating.kp <span class="co"># рейтинг в Кинопоиск (8,079)</span></span>
<span id="cb208-8"><a href="#cb208-8" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="va">$get</span> <span class="kw">|</span> <span class="ex">jq</span> .seasonsInfo<span class="pp">[</span><span class="ss">1</span><span class="pp">]</span>.episodesCount <span class="co"># количество эпизодов во втором [1] сезоне (6)</span></span></code></pre></div>
<p><code>GET /v1.4/movie/search</code></p>
<div class="sourceCode" id="cb209"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb209-1"><a href="#cb209-1" aria-hidden="true" tabindex="-1"></a><span class="va">query</span><span class="op">=</span><span class="st">&quot;zimorodok&quot;</span></span>
<span id="cb209-2"><a href="#cb209-2" aria-hidden="true" tabindex="-1"></a><span class="va">page</span><span class="op">=</span>1 <span class="co"># кол-во страниц для выборки</span></span>
<span id="cb209-3"><a href="#cb209-3" aria-hidden="true" tabindex="-1"></a><span class="va">limit</span><span class="op">=</span>1 <span class="co"># кол-во элементов на странице</span></span>
<span id="cb209-4"><a href="#cb209-4" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-X</span> GET <span class="dt">\</span></span>
<span id="cb209-5"><a href="#cb209-5" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;https://api.kinopoisk.dev/v1.4/movie/search?page=</span><span class="va">$page</span><span class="st">&amp;limit=</span><span class="va">$limit</span><span class="st">&amp;query=</span><span class="va">$query</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb209-6"><a href="#cb209-6" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;accept: application/json&quot;</span> <span class="dt">\</span></span>
<span id="cb209-7"><a href="#cb209-7" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;X-API-KEY: </span><span class="va">$API_KEY</span><span class="st">&quot;</span> <span class="kw">|</span> <span class="ex">jq</span> .</span>
<span id="cb209-8"><a href="#cb209-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb209-9"><a href="#cb209-9" aria-hidden="true" tabindex="-1"></a><span class="va">limit</span><span class="op">=</span>5</span>
<span id="cb209-10"><a href="#cb209-10" aria-hidden="true" tabindex="-1"></a><span class="va">request</span><span class="op">=</span><span class="va">$(</span><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-X</span> GET <span class="dt">\</span></span>
<span id="cb209-11"><a href="#cb209-11" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;https://api.kinopoisk.dev/v1.4/movie/search?page=</span><span class="va">$page</span><span class="st">&amp;limit=</span><span class="va">$limit</span><span class="st">&amp;query=%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA&quot;</span> <span class="dt">\</span></span>
<span id="cb209-12"><a href="#cb209-12" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;accept: application/json&quot;</span> <span class="dt">\</span></span>
<span id="cb209-13"><a href="#cb209-13" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;X-API-KEY: </span><span class="va">$API_KEY</span><span class="st">&quot;</span> <span class="kw">|</span> <span class="ex">jq</span> .<span class="va">)</span></span>
<span id="cb209-14"><a href="#cb209-14" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="va">$request</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="st">&#39;.docs[] | select(.year == 2022)&#39;</span> <span class="co"># отфильтровать вывод по году выхода</span></span></code></pre></div>
<div class="sourceCode" id="cb210"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb210-1"><a href="#cb210-1" aria-hidden="true" tabindex="-1"></a><span class="va">$API_KEY</span> <span class="op">=</span> <span class="st">&quot;ZYMNJJA-0J8MNPN-PB4N7R7-XXXXXXX&quot;</span></span>
<span id="cb210-2"><a href="#cb210-2" aria-hidden="true" tabindex="-1"></a><span class="va">$page</span> <span class="op">=</span> <span class="dv">1</span></span>
<span id="cb210-3"><a href="#cb210-3" aria-hidden="true" tabindex="-1"></a><span class="va">$limit</span> <span class="op">=</span> <span class="dv">5</span></span>
<span id="cb210-4"><a href="#cb210-4" aria-hidden="true" tabindex="-1"></a><span class="va">$query</span> <span class="op">=</span> <span class="st">&quot;%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA&quot;</span></span>
<span id="cb210-5"><a href="#cb210-5" aria-hidden="true" tabindex="-1"></a><span class="va">$request</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="st">&quot;https://api.kinopoisk.dev/v1.4/movie/search?page=</span><span class="va">$page</span><span class="st">&amp;limit=</span><span class="va">$limit</span><span class="st">&amp;query=</span><span class="va">$query</span><span class="st">&quot;</span> <span class="op">-</span>Headers @<span class="op">{</span><span class="st">&quot;accept&quot;</span><span class="op">=</span><span class="st">&quot;application/json&quot;</span><span class="op">;</span> <span class="st">&quot;X-API-KEY&quot;</span><span class="op">=</span><span class="st">&quot;</span><span class="va">$API_KEY</span><span class="st">&quot;</span><span class="op">}</span></span>
<span id="cb210-6"><a href="#cb210-6" aria-hidden="true" tabindex="-1"></a><span class="va">$request</span><span class="op">.</span><span class="fu">docs</span> <span class="op">|</span> <span class="fu">Where-Object</span> year <span class="op">-eq</span> <span class="dv">2022</span></span></code></pre></div>
<h3 id="urlcode">UrlCode</h3>
<div class="sourceCode" id="cb211"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb211-1"><a href="#cb211-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-PercentEncode <span class="op">(</span><span class="va">$str</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb211-2"><a href="#cb211-2" aria-hidden="true" tabindex="-1"></a> <span class="va">$bytes</span> <span class="op">=</span> <span class="op">[</span>System<span class="op">.</span><span class="fu">Text</span><span class="op">.</span><span class="fu">Encoding</span><span class="op">]::</span>UTF8<span class="op">.</span><span class="fu">GetBytes</span><span class="op">(</span><span class="va">$str</span><span class="op">)</span></span>
<span id="cb211-3"><a href="#cb211-3" aria-hidden="true" tabindex="-1"></a> <span class="op">(</span><span class="va">$bytes</span> <span class="op">|</span> <span class="fu">ForEach-Object</span> <span class="op">{</span> <span class="st">&quot;{0:X2}&quot;</span> <span class="op">-</span>f <span class="va">$_</span> <span class="op">})</span> <span class="op">-join</span> <span class="st">&#39;%&#39;</span> <span class="op">-replace</span> <span class="st">&quot;^&quot;</span><span class="op">,</span><span class="st">&quot;%&quot;</span></span>
<span id="cb211-4"><a href="#cb211-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb211-5"><a href="#cb211-5" aria-hidden="true" tabindex="-1"></a>Get-PercentEncode <span class="st">&quot;зимородок&quot;</span></span></code></pre></div>
<div class="sourceCode" id="cb212"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb212-1"><a href="#cb212-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-UrlEncode<span class="op">(</span><span class="va">$str</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb212-2"><a href="#cb212-2" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span>System<span class="op">.</span><span class="fu">Web</span><span class="op">.</span><span class="fu">HttpUtility</span><span class="op">]::</span>UrlEncode<span class="op">(</span><span class="va">$str</span><span class="op">)</span></span>
<span id="cb212-3"><a href="#cb212-3" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb212-4"><a href="#cb212-4" aria-hidden="true" tabindex="-1"></a>UrlEncode <span class="st">&quot;зимородок&quot;</span></span></code></pre></div>
<div class="sourceCode" id="cb213"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb213-1"><a href="#cb213-1" aria-hidden="true" tabindex="-1"></a><span class="fu">percent-encode()</span> <span class="kw">{</span></span>
<span id="cb213-2"><a href="#cb213-2" aria-hidden="true" tabindex="-1"></a> <span class="va">str</span><span class="op">=</span><span class="va">$1</span></span>
<span id="cb213-3"><a href="#cb213-3" aria-hidden="true" tabindex="-1"></a> <span class="bu">echo</span> <span class="at">-n</span> <span class="st">&quot;</span><span class="va">$1</span><span class="st">&quot;</span> <span class="kw">|</span> <span class="fu">iconv</span> <span class="at">-t</span> utf8 <span class="kw">|</span> <span class="fu">od</span> <span class="at">-An</span> <span class="at">-tx1</span> <span class="kw">|</span> <span class="fu">tr</span> <span class="st">&#39; &#39;</span> % <span class="kw">|</span> <span class="fu">tr</span> <span class="at">-d</span> <span class="st">&#39;\n&#39;</span></span>
<span id="cb213-4"><a href="#cb213-4" aria-hidden="true" tabindex="-1"></a><span class="kw">}</span></span>
<span id="cb213-5"><a href="#cb213-5" aria-hidden="true" tabindex="-1"></a><span class="ex">percent-encode</span> <span class="st">&quot;зимородок&quot;</span></span></code></pre></div>
<div class="sourceCode" id="cb214"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb214-1"><a href="#cb214-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-UrlDecode<span class="op">(</span><span class="va">$encoded</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb214-2"><a href="#cb214-2" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span>System<span class="op">.</span><span class="fu">Uri</span><span class="op">]::</span>UnescapeDataString<span class="op">(</span><span class="va">$encoded</span><span class="op">)</span></span>
<span id="cb214-3"><a href="#cb214-3" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb214-4"><a href="#cb214-4" aria-hidden="true" tabindex="-1"></a>Get-UrlDecode <span class="st">&quot;%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA&quot;</span></span></code></pre></div>
<div class="sourceCode" id="cb215"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb215-1"><a href="#cb215-1" aria-hidden="true" tabindex="-1"></a><span class="fu">percent-decode()</span> <span class="kw">{</span></span>
<span id="cb215-2"><a href="#cb215-2" aria-hidden="true" tabindex="-1"></a> <span class="va">encoded</span><span class="op">=</span><span class="va">$1</span></span>
<span id="cb215-3"><a href="#cb215-3" aria-hidden="true" tabindex="-1"></a> <span class="bu">local</span> <span class="va">url_encoded</span><span class="op">=</span><span class="st">&quot;</span><span class="va">${1</span><span class="op">//</span><span class="ss">+</span><span class="op">/</span> <span class="va">}</span><span class="st">&quot;</span></span>
<span id="cb215-4"><a href="#cb215-4" aria-hidden="true" tabindex="-1"></a> <span class="bu">printf</span> <span class="st">&#39;%b&#39;</span> <span class="st">&quot;</span><span class="va">${url_encoded</span><span class="op">//</span><span class="ss">%</span><span class="op">/</span><span class="dt">\\</span>x<span class="va">}</span><span class="st">&quot;</span></span>
<span id="cb215-5"><a href="#cb215-5" aria-hidden="true" tabindex="-1"></a><span class="kw">}</span></span>
<span id="cb215-6"><a href="#cb215-6" aria-hidden="true" tabindex="-1"></a><span class="ex">percent-decode</span> <span class="st">&quot;%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA&quot;</span></span></code></pre></div>
<h1 id="videocdn">VideoCDN</h1>
<p>https://github.com/notssh/videocdn-api<br />
https://github.com/API-Movies/videocdn<br />
https://api-movies.github.io/videocdn/index.json</p>
<div class="sourceCode" id="cb216"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb216-1"><a href="#cb216-1" aria-hidden="true" tabindex="-1"></a><span class="va">$kp_id</span> <span class="op">=</span> <span class="dv">5106881</span></span>
<span id="cb216-2"><a href="#cb216-2" aria-hidden="true" tabindex="-1"></a><span class="va">$token</span> <span class="op">=</span> <span class="st">&quot;YfTWH2p3Mai7ziqDoGjS3yXXXXXXXXXX&quot;</span></span>
<span id="cb216-3"><a href="#cb216-3" aria-hidden="true" tabindex="-1"></a><span class="va">$ep</span> <span class="op">=</span> <span class="st">&quot;tv-series&quot;</span></span>
<span id="cb216-4"><a href="#cb216-4" aria-hidden="true" tabindex="-1"></a><span class="op">$(</span><span class="fu">Invoke-RestMethod</span> <span class="op">$(</span><span class="st">&quot;https://videocdn.tv/api/</span><span class="va">$ep</span><span class="st">&quot;</span><span class="op">+</span><span class="st">&quot;?api_token=</span><span class="va">$token</span><span class="st">&amp;field=kinopoisk_id&amp;query=</span><span class="va">$kp_id</span><span class="st">&quot;</span><span class="op">)).</span><span class="fu">data</span><span class="op">.</span><span class="fu">episodes</span> <span class="op">|</span> <span class="fu">Where-Object</span> season_num <span class="op">-eq</span> <span class="dv">2</span> <span class="op">|</span> <span class="fu">Select-Object</span> @<span class="op">{</span>Name<span class="op">=</span><span class="st">&quot;Episode&quot;</span><span class="op">;</span> Expression<span class="op">={</span><span class="va">$_</span><span class="op">.</span><span class="fu">num</span><span class="op">}},</span> @<span class="op">{</span>Name<span class="op">=</span><span class="st">&quot;Voice&quot;</span><span class="op">;</span> Expression<span class="op">={</span><span class="va">$_</span><span class="op">.</span><span class="fu">media</span><span class="op">.</span><span class="fu">translation</span><span class="op">.</span><span class="fu">title</span><span class="op">}}</span> <span class="co"># отфильтровать серии по второму сезону и отобразить все озвучки к сериям</span></span></code></pre></div>
<div class="sourceCode" id="cb217"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb217-1"><a href="#cb217-1" aria-hidden="true" tabindex="-1"></a><span class="va">kp_id</span><span class="op">=</span>5106881</span>
<span id="cb217-2"><a href="#cb217-2" aria-hidden="true" tabindex="-1"></a><span class="va">token</span><span class="op">=</span><span class="st">&quot;YfTWH2p3Mai7ziqDoGjS3yXXXXXXXXXX&quot;</span></span>
<span id="cb217-3"><a href="#cb217-3" aria-hidden="true" tabindex="-1"></a><span class="va">ep</span><span class="op">=</span><span class="st">&quot;tv-series&quot;</span></span>
<span id="cb217-4"><a href="#cb217-4" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="st">&quot;https://videocdn.tv/api/</span><span class="va">$ep</span><span class="st">?api_token=</span><span class="va">$token</span><span class="st">&amp;field=kinopoisk_id&amp;query=</span><span class="va">$kp_id</span><span class="st">&quot;</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="st">&quot;.data[].episodes | length&quot;</span> <span class="co"># количество серий</span></span>
<span id="cb217-5"><a href="#cb217-5" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="st">&quot;https://videocdn.tv/api/</span><span class="va">$ep</span><span class="st">?api_token=</span><span class="va">$token</span><span class="st">&amp;field=kinopoisk_id&amp;query=</span><span class="va">$kp_id</span><span class="st">&quot;</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="st">&quot;.data[].episodes[] | select(.season_num == 2) | {episode: .ru_title, voice: .media[].translation.title}&quot;</span> <span class="co"># отфильтровать параметры вывода</span></span></code></pre></div>
<h1 id="telegram">Telegram</h1>
<p><span class="citation" data-cites="BotFather">@BotFather</span>
(https://t.me/BotFather) /newbot</p>
<p>https://api.telegram.org/bot<token>/<endpoint></p>
<p>https://core.telegram.org/bots/api#getupdates</p>
<div class="sourceCode" id="cb218"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb218-1"><a href="#cb218-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-FromTelegram <span class="op">{</span></span>
<span id="cb218-2"><a href="#cb218-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">param</span> <span class="op">(</span></span>
<span id="cb218-3"><a href="#cb218-3" aria-hidden="true" tabindex="-1"></a> <span class="va">$Token</span> <span class="op">=</span> <span class="st">&quot;687...:AAF...&quot;</span><span class="op">,</span></span>
<span id="cb218-4"><a href="#cb218-4" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="dt">switch</span><span class="op">]</span><span class="va">$Date</span><span class="op">,</span></span>
<span id="cb218-5"><a href="#cb218-5" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="dt">switch</span><span class="op">]</span><span class="va">$Last</span><span class="op">,</span></span>
<span id="cb218-6"><a href="#cb218-6" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="dt">switch</span><span class="op">]</span><span class="va">$ChatID</span></span>
<span id="cb218-7"><a href="#cb218-7" aria-hidden="true" tabindex="-1"></a> <span class="op">)</span></span>
<span id="cb218-8"><a href="#cb218-8" aria-hidden="true" tabindex="-1"></a> <span class="va">$endpoint</span> <span class="op">=</span> <span class="st">&quot;getUpdates&quot;</span></span>
<span id="cb218-9"><a href="#cb218-9" aria-hidden="true" tabindex="-1"></a> <span class="va">$url</span> <span class="op">=</span> <span class="st">&quot;https://api.telegram.org/bot</span><span class="va">$Token</span><span class="st">/</span><span class="va">$endpoint</span><span class="st">&quot;</span></span>
<span id="cb218-10"><a href="#cb218-10" aria-hidden="true" tabindex="-1"></a> <span class="va">$result</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="va">$url</span></span>
<span id="cb218-11"><a href="#cb218-11" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="va">$Date</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb218-12"><a href="#cb218-12" aria-hidden="true" tabindex="-1"></a> <span class="va">$Collections</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Collections</span><span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>System<span class="op">.</span><span class="fu">Object</span><span class="op">]</span></span>
<span id="cb218-13"><a href="#cb218-13" aria-hidden="true" tabindex="-1"></a> <span class="cf">foreach</span> <span class="op">(</span><span class="va">$r</span> <span class="kw">in</span> <span class="op">$(</span><span class="va">$result</span><span class="op">.</span><span class="fu">result</span><span class="op">))</span> <span class="op">{</span></span>
<span id="cb218-14"><a href="#cb218-14" aria-hidden="true" tabindex="-1"></a> <span class="va">$EpochTime</span> <span class="op">=</span> <span class="op">[</span>DateTime<span class="op">]</span><span class="st">&quot;1/1/1970&quot;</span></span>
<span id="cb218-15"><a href="#cb218-15" aria-hidden="true" tabindex="-1"></a> <span class="va">$TimeZone</span> <span class="op">=</span> Get-TimeZone</span>
<span id="cb218-16"><a href="#cb218-16" aria-hidden="true" tabindex="-1"></a> <span class="va">$UTCTime</span> <span class="op">=</span> <span class="va">$EpochTime</span><span class="op">.</span><span class="fu">AddSeconds</span><span class="op">(</span><span class="va">$r</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">date</span><span class="op">)</span></span>
<span id="cb218-17"><a href="#cb218-17" aria-hidden="true" tabindex="-1"></a> <span class="va">$d</span> <span class="op">=</span> <span class="va">$UTCTime</span><span class="op">.</span><span class="fu">AddMinutes</span><span class="op">(</span><span class="va">$TimeZone</span><span class="op">.</span><span class="fu">BaseUtcOffset</span><span class="op">.</span><span class="fu">TotalMinutes</span><span class="op">)</span></span>
<span id="cb218-18"><a href="#cb218-18" aria-hidden="true" tabindex="-1"></a> <span class="va">$Collections</span><span class="op">.</span><span class="fu">Add</span><span class="op">([</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
<span id="cb218-19"><a href="#cb218-19" aria-hidden="true" tabindex="-1"></a> Message <span class="op">=</span> <span class="va">$r</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">text</span><span class="op">;</span></span>
<span id="cb218-20"><a href="#cb218-20" aria-hidden="true" tabindex="-1"></a> Date <span class="op">=</span> <span class="va">$d</span></span>
<span id="cb218-21"><a href="#cb218-21" aria-hidden="true" tabindex="-1"></a> <span class="op">})</span></span>
<span id="cb218-22"><a href="#cb218-22" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb218-23"><a href="#cb218-23" aria-hidden="true" tabindex="-1"></a> <span class="va">$Collections</span></span>
<span id="cb218-24"><a href="#cb218-24" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb218-25"><a href="#cb218-25" aria-hidden="true" tabindex="-1"></a> <span class="cf">else</span> <span class="op">{</span></span>
<span id="cb218-26"><a href="#cb218-26" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="va">$Last</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb218-27"><a href="#cb218-27" aria-hidden="true" tabindex="-1"></a> <span class="va">$result</span><span class="op">.</span><span class="fu">result</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">text</span><span class="op">[</span>-1<span class="op">]</span></span>
<span id="cb218-28"><a href="#cb218-28" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb218-29"><a href="#cb218-29" aria-hidden="true" tabindex="-1"></a> <span class="cf">elseif</span> <span class="op">(</span><span class="va">$ChatID</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb218-30"><a href="#cb218-30" aria-hidden="true" tabindex="-1"></a> <span class="va">$Collections</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Collections</span><span class="op">.</span><span class="fu">Generic</span><span class="op">.</span><span class="fu">List</span><span class="op">[</span>System<span class="op">.</span><span class="fu">Object</span><span class="op">]</span></span>
<span id="cb218-31"><a href="#cb218-31" aria-hidden="true" tabindex="-1"></a> <span class="cf">foreach</span> <span class="op">(</span><span class="va">$r</span> <span class="kw">in</span> <span class="op">$(</span><span class="va">$result</span><span class="op">.</span><span class="fu">result</span><span class="op">))</span> <span class="op">{</span></span>
<span id="cb218-32"><a href="#cb218-32" aria-hidden="true" tabindex="-1"></a> <span class="va">$Collections</span><span class="op">.</span><span class="fu">Add</span><span class="op">([</span>PSCustomObject<span class="op">]</span>@<span class="op">{</span></span>
<span id="cb218-33"><a href="#cb218-33" aria-hidden="true" tabindex="-1"></a> Message <span class="op">=</span> <span class="va">$r</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">text</span><span class="op">;</span></span>
<span id="cb218-34"><a href="#cb218-34" aria-hidden="true" tabindex="-1"></a> UserName <span class="op">=</span> <span class="va">$r</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">chat</span><span class="op">.</span><span class="fu">username</span><span class="op">;</span></span>
<span id="cb218-35"><a href="#cb218-35" aria-hidden="true" tabindex="-1"></a> ChatID <span class="op">=</span> <span class="va">$r</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">chat</span><span class="op">.</span><span class="fu">id</span><span class="op">;</span></span>
<span id="cb218-36"><a href="#cb218-36" aria-hidden="true" tabindex="-1"></a> ChatType <span class="op">=</span> <span class="va">$r</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">chat</span><span class="op">.</span><span class="fu">type</span></span>
<span id="cb218-37"><a href="#cb218-37" aria-hidden="true" tabindex="-1"></a> <span class="op">})</span></span>
<span id="cb218-38"><a href="#cb218-38" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb218-39"><a href="#cb218-39" aria-hidden="true" tabindex="-1"></a> <span class="va">$Collections</span></span>
<span id="cb218-40"><a href="#cb218-40" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb218-41"><a href="#cb218-41" aria-hidden="true" tabindex="-1"></a> <span class="cf">else</span> <span class="op">{</span></span>
<span id="cb218-42"><a href="#cb218-42" aria-hidden="true" tabindex="-1"></a> <span class="va">$result</span><span class="op">.</span><span class="fu">result</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">text</span></span>
<span id="cb218-43"><a href="#cb218-43" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb218-44"><a href="#cb218-44" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb218-45"><a href="#cb218-45" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Get-FromTelegram</code><br />
<code>Get-FromTelegram -Last</code><br />
<code>Get-FromTelegram -Date</code><br />
<code>Get-FromTelegram -ChatID</code></p>
<p>https://core.telegram.org/bots/api#sendmessage</p>
<div class="sourceCode" id="cb219"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb219-1"><a href="#cb219-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Send-ToTelegram <span class="op">{</span></span>
<span id="cb219-2"><a href="#cb219-2" aria-hidden="true" tabindex="-1"></a><span class="kw">param</span> <span class="op">(</span></span>
<span id="cb219-3"><a href="#cb219-3" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span>Parameter<span class="op">(</span>Mandatory <span class="op">=</span> <span class="va">$True</span><span class="op">)]</span><span class="va">$Text</span><span class="op">,</span></span>
<span id="cb219-4"><a href="#cb219-4" aria-hidden="true" tabindex="-1"></a> <span class="va">$Token</span> <span class="op">=</span> <span class="st">&quot;687...:AAF...&quot;</span><span class="op">,</span></span>
<span id="cb219-5"><a href="#cb219-5" aria-hidden="true" tabindex="-1"></a> <span class="va">$Chat</span> <span class="op">=</span> <span class="st">&quot;125468108&quot;</span><span class="op">,</span></span>
<span id="cb219-6"><a href="#cb219-6" aria-hidden="true" tabindex="-1"></a> <span class="va">$Keyboard</span></span>
<span id="cb219-7"><a href="#cb219-7" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
<span id="cb219-8"><a href="#cb219-8" aria-hidden="true" tabindex="-1"></a> <span class="va">$endpoint</span> <span class="op">=</span> <span class="st">&quot;sendMessage&quot;</span></span>
<span id="cb219-9"><a href="#cb219-9" aria-hidden="true" tabindex="-1"></a> <span class="va">$url</span> <span class="op">=</span> <span class="st">&quot;https://api.telegram.org/bot</span><span class="va">$Token</span><span class="st">/</span><span class="va">$endpoint</span><span class="st">&quot;</span></span>
<span id="cb219-10"><a href="#cb219-10" aria-hidden="true" tabindex="-1"></a> <span class="va">$Body</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb219-11"><a href="#cb219-11" aria-hidden="true" tabindex="-1"></a> chat_id <span class="op">=</span> <span class="va">$Chat</span></span>
<span id="cb219-12"><a href="#cb219-12" aria-hidden="true" tabindex="-1"></a> text <span class="op">=</span> <span class="va">$Text</span></span>
<span id="cb219-13"><a href="#cb219-13" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb219-14"><a href="#cb219-14" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="va">$keyboard</span> <span class="op">-ne</span> <span class="va">$null</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb219-15"><a href="#cb219-15" aria-hidden="true" tabindex="-1"></a> <span class="va">$Body</span> <span class="op">+=</span> @<span class="op">{</span>reply_markup <span class="op">=</span> <span class="va">$keyboard</span><span class="op">}</span></span>
<span id="cb219-16"><a href="#cb219-16" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb219-17"><a href="#cb219-17" aria-hidden="true" tabindex="-1"></a> <span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="va">$url</span> <span class="op">-</span>Body <span class="va">$Body</span></span>
<span id="cb219-18"><a href="#cb219-18" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>Send-ToTelegram -Text "Send test from powershell"</code></p>
<div class="sourceCode" id="cb220"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb220-1"><a href="#cb220-1" aria-hidden="true" tabindex="-1"></a><span class="va">$LastDate</span> <span class="op">=</span> <span class="op">(</span>Get-FromTelegram <span class="op">-</span>date<span class="op">)[</span>-1<span class="op">].</span><span class="fu">Date</span></span>
<span id="cb220-2"><a href="#cb220-2" aria-hidden="true" tabindex="-1"></a><span class="cf">while</span> <span class="op">(</span><span class="va">$true</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb220-3"><a href="#cb220-3" aria-hidden="true" tabindex="-1"></a> <span class="va">$LastMessage</span> <span class="op">=</span> <span class="op">(</span>Get-FromTelegram <span class="op">-</span>date<span class="op">)[</span>-1<span class="op">]</span></span>
<span id="cb220-4"><a href="#cb220-4" aria-hidden="true" tabindex="-1"></a> <span class="fu">Start-Sleep</span> <span class="dv">1</span></span>
<span id="cb220-5"><a href="#cb220-5" aria-hidden="true" tabindex="-1"></a> <span class="va">$LastDateTest</span> <span class="op">=</span> <span class="va">$LastMessage</span><span class="op">.</span><span class="fu">Date</span></span>
<span id="cb220-6"><a href="#cb220-6" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">((</span><span class="va">$LastMessage</span><span class="op">.</span><span class="fu">Message</span> <span class="op">-match</span> <span class="st">&quot;/Service&quot;</span><span class="op">)</span> <span class="op">-and</span> <span class="op">(</span><span class="va">$LastDate</span> <span class="op">-ne</span> <span class="va">$LastDateTest</span><span class="op">))</span> <span class="op">{</span></span>
<span id="cb220-7"><a href="#cb220-7" aria-hidden="true" tabindex="-1"></a> <span class="va">$ServiceName</span> <span class="op">=</span> <span class="op">$(</span><span class="va">$LastMessage</span><span class="op">.</span><span class="fu">Message</span> <span class="op">-split</span> <span class="st">&quot; &quot;</span><span class="op">)[</span>-1<span class="op">]</span></span>
<span id="cb220-8"><a href="#cb220-8" aria-hidden="true" tabindex="-1"></a> <span class="va">$Result</span> <span class="op">=</span> <span class="op">$(</span><span class="fu">Get-Service</span> <span class="va">$ServiceName</span> <span class="op">-</span>ErrorAction Ignore<span class="op">).</span><span class="fu">Status</span></span>
<span id="cb220-9"><a href="#cb220-9" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="va">$Result</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb220-10"><a href="#cb220-10" aria-hidden="true" tabindex="-1"></a> Send-ToTelegram <span class="op">-</span>Text <span class="va">$Result</span></span>
<span id="cb220-11"><a href="#cb220-11" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span> <span class="cf">else</span> <span class="op">{</span></span>
<span id="cb220-12"><a href="#cb220-12" aria-hidden="true" tabindex="-1"></a> Send-ToTelegram <span class="op">-</span>Text <span class="st">&quot;Service not found&quot;</span></span>
<span id="cb220-13"><a href="#cb220-13" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb220-14"><a href="#cb220-14" aria-hidden="true" tabindex="-1"></a> <span class="va">$LastDate</span> <span class="op">=</span> <span class="va">$LastDateTest</span></span>
<span id="cb220-15"><a href="#cb220-15" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb220-16"><a href="#cb220-16" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p><code>/Service vpnagent</code><br />
<code>/Service WinRM</code><br />
<code>/Service test</code></p>
<h3 id="button">Button</h3>
<div class="sourceCode" id="cb221"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb221-1"><a href="#cb221-1" aria-hidden="true" tabindex="-1"></a><span class="va">$keyboard</span> <span class="op">=</span> <span class="st">&#39;{</span></span>
<span id="cb221-2"><a href="#cb221-2" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;inline_keyboard&quot;:[[</span></span>
<span id="cb221-3"><a href="#cb221-3" aria-hidden="true" tabindex="-1"></a><span class="st"> {&quot;text&quot;:&quot;Uptime&quot;,&quot;callback_data&quot;:&quot;/Uptime&quot;},</span></span>
<span id="cb221-4"><a href="#cb221-4" aria-hidden="true" tabindex="-1"></a><span class="st"> {&quot;text&quot;:&quot;Test&quot;,&quot;callback_data&quot;:&quot;/Test&quot;}</span></span>
<span id="cb221-5"><a href="#cb221-5" aria-hidden="true" tabindex="-1"></a><span class="st"> ]]</span></span>
<span id="cb221-6"><a href="#cb221-6" aria-hidden="true" tabindex="-1"></a><span class="st">}&#39;</span></span>
<span id="cb221-7"><a href="#cb221-7" aria-hidden="true" tabindex="-1"></a>Send-ToTelegram <span class="op">-</span>Text <span class="st">&quot;Test buttons&quot;</span> <span class="op">-</span>Keyboard <span class="va">$keyboard</span></span>
<span id="cb221-8"><a href="#cb221-8" aria-hidden="true" tabindex="-1"></a><span class="va">$request</span> <span class="op">=</span> <span class="op">(</span><span class="fu">Invoke-RestMethod</span> <span class="op">-</span>Uri <span class="st">&quot;https://api.telegram.org/bot</span><span class="va">$Token</span><span class="st">/getUpdates&quot;</span><span class="op">).</span><span class="fu">result</span><span class="op">.</span><span class="fu">callback_query</span></span>
<span id="cb221-9"><a href="#cb221-9" aria-hidden="true" tabindex="-1"></a><span class="va">$request</span><span class="op">.</span><span class="fu">data</span> <span class="co"># прочитать callback_data нажатой кнопки</span></span>
<span id="cb221-10"><a href="#cb221-10" aria-hidden="true" tabindex="-1"></a><span class="va">$request</span><span class="op">.</span><span class="fu">message</span><span class="op">.</span><span class="fu">date</span></span></code></pre></div>
<h1 id="discord">Discord</h1>
<p>https://discord.com/developers/applications</p>
<p>Создаем Applications (General Information). В Bot привязываем к
Application и копируем токен авторизации. В OAuth2 - URL Generator
выбираем bot и права Administrator и копируем созданный URL для
добавления на канал. Переходим по url и добавляем бота на сервер.
Получаем ID канала на сервере (текстовые каналы, правой кнопкой мыши
копируем ссылку и забираем последний id в url).</p>
<h3 id="send-to-discord">Send to Discord</h3>
<div class="sourceCode" id="cb222"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb222-1"><a href="#cb222-1" aria-hidden="true" tabindex="-1"></a><span class="va">DISCORD_TOKEN</span><span class="op">=</span><span class="st">&quot;MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX&quot;</span></span>
<span id="cb222-2"><a href="#cb222-2" aria-hidden="true" tabindex="-1"></a><span class="va">DISCORD_CHANNEL_ID</span><span class="op">=</span><span class="st">&quot;119403124XXXXXXXXXX&quot;</span></span>
<span id="cb222-3"><a href="#cb222-3" aria-hidden="true" tabindex="-1"></a><span class="va">TEXT</span><span class="op">=</span><span class="st">&quot;test from bash&quot;</span></span>
<span id="cb222-4"><a href="#cb222-4" aria-hidden="true" tabindex="-1"></a><span class="va">URL</span><span class="op">=</span><span class="st">&quot;https://discordapp.com/api/channels/</span><span class="va">$DISCORD_CHANNEL_ID</span><span class="st">/messages&quot;</span></span>
<span id="cb222-5"><a href="#cb222-5" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-X</span> POST <span class="va">$URL</span> <span class="dt">\</span></span>
<span id="cb222-6"><a href="#cb222-6" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;Authorization: Bot </span><span class="va">$DISCORD_TOKEN</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb222-7"><a href="#cb222-7" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;Content-Type: application/json&quot;</span> <span class="dt">\</span></span>
<span id="cb222-8"><a href="#cb222-8" aria-hidden="true" tabindex="-1"></a> <span class="at">-d</span> <span class="st">&quot;{</span><span class="dt">\&quot;</span><span class="st">content</span><span class="dt">\&quot;</span><span class="st">: </span><span class="dt">\&quot;</span><span class="va">$TEXT</span><span class="dt">\&quot;</span><span class="st">}&quot;</span></span></code></pre></div>
<div class="sourceCode" id="cb223"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb223-1"><a href="#cb223-1" aria-hidden="true" tabindex="-1"></a><span class="va">$DISCORD_TOKEN</span> <span class="op">=</span> <span class="st">&quot;MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX&quot;</span></span>
<span id="cb223-2"><a href="#cb223-2" aria-hidden="true" tabindex="-1"></a><span class="va">$DISCORD_CHANNEL_ID</span> <span class="op">=</span> <span class="st">&quot;119403124XXXXXXXXXX&quot;</span></span>
<span id="cb223-3"><a href="#cb223-3" aria-hidden="true" tabindex="-1"></a><span class="va">$TEXT</span> <span class="op">=</span> <span class="st">&quot;test from PowerShell&quot;</span></span>
<span id="cb223-4"><a href="#cb223-4" aria-hidden="true" tabindex="-1"></a><span class="va">$URL</span> <span class="op">=</span> <span class="st">&quot;https://discordapp.com/api/channels/</span><span class="va">$DISCORD_CHANNEL_ID</span><span class="st">/messages&quot;</span></span>
<span id="cb223-5"><a href="#cb223-5" aria-hidden="true" tabindex="-1"></a><span class="va">$Body</span> <span class="op">=</span> @<span class="op">{</span></span>
<span id="cb223-6"><a href="#cb223-6" aria-hidden="true" tabindex="-1"></a> content <span class="op">=</span> <span class="va">$TEXT</span></span>
<span id="cb223-7"><a href="#cb223-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span> <span class="op">|</span> <span class="fu">ConvertTo-Json</span></span>
<span id="cb223-8"><a href="#cb223-8" aria-hidden="true" tabindex="-1"></a><span class="fu">curl</span> <span class="op">-</span>s <span class="va">$URL</span> <span class="op">-</span>X POST <span class="op">-</span>H <span class="st">&quot;Authorization: Bot </span><span class="va">$DISCORD_TOKEN</span><span class="st">&quot;</span> <span class="op">-</span>H <span class="st">&quot;Content-Type: application/json&quot;</span> <span class="op">-</span>d <span class="va">$Body</span></span></code></pre></div>
<h3 id="read-from-discord">Read from Discord</h3>
<div class="sourceCode" id="cb224"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb224-1"><a href="#cb224-1" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-s</span> <span class="at">-X</span> GET <span class="va">$URL</span> <span class="dt">\</span></span>
<span id="cb224-2"><a href="#cb224-2" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;Authorization: Bot </span><span class="va">$DISCORD_TOKEN</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb224-3"><a href="#cb224-3" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;Content-Type: application/json&quot;</span> <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .<span class="pp">[</span><span class="ss">0</span><span class="pp">]</span>.content</span></code></pre></div>
<div class="sourceCode" id="cb225"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb225-1"><a href="#cb225-1" aria-hidden="true" tabindex="-1"></a><span class="va">$messages</span> <span class="op">=</span> <span class="op">(</span><span class="fu">curl</span> <span class="op">-</span>s <span class="op">-</span>X GET <span class="va">$URL</span> <span class="op">-</span>H <span class="st">&quot;Authorization: Bot </span><span class="va">$DISCORD_TOKEN</span><span class="st">&quot;</span> <span class="op">-</span>H <span class="st">&quot;Content-Type: application/json&quot;</span> <span class="op">|</span> <span class="fu">ConvertFrom-Json</span><span class="op">)</span></span>
<span id="cb225-2"><a href="#cb225-2" aria-hidden="true" tabindex="-1"></a><span class="va">$messages</span> <span class="op">|</span> <span class="fu">Select-Object</span> content<span class="op">,</span>timestamp<span class="op">,{</span><span class="va">$_</span><span class="op">.</span><span class="fu">author</span><span class="op">.</span><span class="fu">username</span><span class="op">}</span></span></code></pre></div>
<h3 id="httpclient">HttpClient</h3>
<div class="sourceCode" id="cb226"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb226-1"><a href="#cb226-1" aria-hidden="true" tabindex="-1"></a><span class="va">$DISCORD_TOKEN</span> <span class="op">=</span> <span class="st">&quot;MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX&quot;</span></span>
<span id="cb226-2"><a href="#cb226-2" aria-hidden="true" tabindex="-1"></a><span class="va">$DISCORD_CHANNEL_ID</span> <span class="op">=</span> <span class="st">&quot;119403124XXXXXXXXXX&quot;</span></span>
<span id="cb226-3"><a href="#cb226-3" aria-hidden="true" tabindex="-1"></a><span class="va">$URL</span> <span class="op">=</span> <span class="st">&quot;https://discordapp.com/api/channels/</span><span class="va">$DISCORD_CHANNEL_ID</span><span class="st">/messages&quot;</span></span>
<span id="cb226-4"><a href="#cb226-4" aria-hidden="true" tabindex="-1"></a><span class="va">$HttpClient</span> <span class="op">=</span> <span class="fu">New-Object</span> System<span class="op">.</span><span class="fu">Net</span><span class="op">.</span><span class="fu">Http</span><span class="op">.</span><span class="fu">HttpClient</span></span>
<span id="cb226-5"><a href="#cb226-5" aria-hidden="true" tabindex="-1"></a><span class="va">$HttpClient</span><span class="op">.</span><span class="fu">DefaultRequestHeaders</span><span class="op">.</span><span class="fu">Authorization</span> <span class="op">=</span> <span class="st">&quot;Bot </span><span class="va">$DISCORD_TOKEN</span><span class="st">&quot;</span></span>
<span id="cb226-6"><a href="#cb226-6" aria-hidden="true" tabindex="-1"></a><span class="va">$response</span> <span class="op">=</span> <span class="va">$HttpClient</span><span class="op">.</span><span class="fu">GetAsync</span><span class="op">(</span><span class="va">$URL</span><span class="op">).</span><span class="fu">Result</span></span>
<span id="cb226-7"><a href="#cb226-7" aria-hidden="true" tabindex="-1"></a><span class="va">$messages</span> <span class="op">=</span> <span class="va">$response</span><span class="op">.</span><span class="fu">Content</span><span class="op">.</span><span class="fu">ReadAsStringAsync</span><span class="op">().</span><span class="fu">Result</span></span>
<span id="cb226-8"><a href="#cb226-8" aria-hidden="true" tabindex="-1"></a><span class="op">(</span><span class="va">$messages</span> <span class="op">|</span> <span class="fu">ConvertFrom-Json</span><span class="op">).</span><span class="fu">content</span></span></code></pre></div>
<h3 id="button-1">Button</h3>
<div class="sourceCode" id="cb227"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb227-1"><a href="#cb227-1" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-X</span> POST <span class="va">$URL</span> <span class="dt">\</span></span>
<span id="cb227-2"><a href="#cb227-2" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;Content-Type: application/json&quot;</span> <span class="dt">\</span></span>
<span id="cb227-3"><a href="#cb227-3" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;Authorization: Bot </span><span class="va">$DISCORD_TOKEN</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb227-4"><a href="#cb227-4" aria-hidden="true" tabindex="-1"></a> <span class="at">-d</span> <span class="st">&#39;</span></span>
<span id="cb227-5"><a href="#cb227-5" aria-hidden="true" tabindex="-1"></a><span class="st"> {</span></span>
<span id="cb227-6"><a href="#cb227-6" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;content&quot;: &quot;Test text for button&quot;,</span></span>
<span id="cb227-7"><a href="#cb227-7" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;components&quot;: [</span></span>
<span id="cb227-8"><a href="#cb227-8" aria-hidden="true" tabindex="-1"></a><span class="st"> {</span></span>
<span id="cb227-9"><a href="#cb227-9" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;type&quot;: 1,</span></span>
<span id="cb227-10"><a href="#cb227-10" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;components&quot;: [</span></span>
<span id="cb227-11"><a href="#cb227-11" aria-hidden="true" tabindex="-1"></a><span class="st"> {</span></span>
<span id="cb227-12"><a href="#cb227-12" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;type&quot;: 2,</span></span>
<span id="cb227-13"><a href="#cb227-13" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;label&quot;: &quot;Button&quot;,</span></span>
<span id="cb227-14"><a href="#cb227-14" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;style&quot;: 1,</span></span>
<span id="cb227-15"><a href="#cb227-15" aria-hidden="true" tabindex="-1"></a><span class="st"> &quot;custom_id&quot;: &quot;button_click&quot;</span></span>
<span id="cb227-16"><a href="#cb227-16" aria-hidden="true" tabindex="-1"></a><span class="st"> }</span></span>
<span id="cb227-17"><a href="#cb227-17" aria-hidden="true" tabindex="-1"></a><span class="st"> ]</span></span>
<span id="cb227-18"><a href="#cb227-18" aria-hidden="true" tabindex="-1"></a><span class="st"> }</span></span>
<span id="cb227-19"><a href="#cb227-19" aria-hidden="true" tabindex="-1"></a><span class="st"> ]</span></span>
<span id="cb227-20"><a href="#cb227-20" aria-hidden="true" tabindex="-1"></a><span class="st"> }&#39;</span></span></code></pre></div>
<h3 id="discord.net.webhook">Discord.Net.Webhook</h3>
<div class="sourceCode" id="cb228"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb228-1"><a href="#cb228-1" aria-hidden="true" tabindex="-1"></a><span class="fu">Add-Type</span> <span class="op">-</span>Path <span class="op">$(</span><span class="fu">ls</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Documents\Discord.NET\*.dll&quot;</span><span class="op">).</span><span class="fu">FullName</span></span>
<span id="cb228-2"><a href="#cb228-2" aria-hidden="true" tabindex="-1"></a><span class="co"># https://discordapp.com/api/webhooks/&lt;webhook_id&gt;/&lt;webhook_token&gt; (Настроить канал - Интеграция)</span></span>
<span id="cb228-3"><a href="#cb228-3" aria-hidden="true" tabindex="-1"></a><span class="va">$webhookId</span> <span class="op">=</span> <span class="dv">1197577280000000000</span></span>
<span id="cb228-4"><a href="#cb228-4" aria-hidden="true" tabindex="-1"></a><span class="va">$webhookToken</span> <span class="op">=</span> <span class="st">&quot;rs8AA-XXXXXXXXXXX_Vk5RUI4A6HuSGhpCCTepq25duwCwLXasfv6u23a7XXXXXXXXXX&quot;</span></span>
<span id="cb228-5"><a href="#cb228-5" aria-hidden="true" tabindex="-1"></a><span class="va">$messageContent</span> <span class="op">=</span> <span class="st">&quot;Test dotNET&quot;</span></span>
<span id="cb228-6"><a href="#cb228-6" aria-hidden="true" tabindex="-1"></a><span class="va">$client</span> <span class="op">=</span> <span class="fu">New-Object</span> Discord<span class="op">.</span><span class="fu">Webhook</span><span class="op">.</span><span class="fu">DiscordWebhookClient</span><span class="op">(</span><span class="va">$webhookId</span><span class="op">,</span> <span class="va">$webhookToken</span><span class="op">)</span></span>
<span id="cb228-7"><a href="#cb228-7" aria-hidden="true" tabindex="-1"></a><span class="va">$client</span><span class="op">.</span><span class="fu">SendMessageAsync</span><span class="op">(</span><span class="va">$messageContent</span><span class="op">).</span><span class="fu">Wait</span><span class="op">()</span></span></code></pre></div>
<h3 id="discord.net.websocket">Discord.Net.WebSocket</h3>
<div class="sourceCode" id="cb229"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb229-1"><a href="#cb229-1" aria-hidden="true" tabindex="-1"></a><span class="va">$DiscordAssemblies</span> <span class="op">=</span> <span class="op">$(</span><span class="fu">ls</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Documents\Discord.NET\*.dll&quot;</span><span class="op">).</span><span class="fu">FullName</span></span>
<span id="cb229-2"><a href="#cb229-2" aria-hidden="true" tabindex="-1"></a><span class="cf">foreach</span> <span class="op">(</span><span class="va">$assembly</span> <span class="kw">in</span> <span class="va">$DiscordAssemblies</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb229-3"><a href="#cb229-3" aria-hidden="true" tabindex="-1"></a> <span class="fu">Add-Type</span> <span class="op">-</span>Path <span class="va">$assembly</span></span>
<span id="cb229-4"><a href="#cb229-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb229-5"><a href="#cb229-5" aria-hidden="true" tabindex="-1"></a><span class="va">$DISCORD_TOKEN</span> <span class="op">=</span> <span class="st">&quot;MTE5NzE1NjM0NTM3NjQxMTcyOQ.XXXXXX.EzBF6RA9Kx_MSuhLW5elH1U-XXXXXXXXXXXXXX&quot;</span></span>
<span id="cb229-6"><a href="#cb229-6" aria-hidden="true" tabindex="-1"></a><span class="va">$Client</span> <span class="op">=</span> <span class="fu">New-Object</span> Discord<span class="op">.</span><span class="fu">WebSocket</span><span class="op">.</span><span class="fu">DiscordSocketClient</span></span>
<span id="cb229-7"><a href="#cb229-7" aria-hidden="true" tabindex="-1"></a><span class="va">$Client</span><span class="op">.</span><span class="fu">Add_MessageReceived</span><span class="op">({</span></span>
<span id="cb229-8"><a href="#cb229-8" aria-hidden="true" tabindex="-1"></a> <span class="kw">param</span><span class="op">(</span><span class="va">$message</span><span class="op">)</span></span>
<span id="cb229-9"><a href="#cb229-9" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="va">$message</span><span class="op">.</span><span class="fu">Author</span><span class="op">.</span><span class="fu">Id</span> <span class="op">-ne</span> <span class="va">$Client</span><span class="op">.</span><span class="fu">CurrentUser</span><span class="op">.</span><span class="fu">Id</span><span class="op">)</span> <span class="op">{</span></span>
<span id="cb229-10"><a href="#cb229-10" aria-hidden="true" tabindex="-1"></a> <span class="fu">Write-Host</span> <span class="op">(</span><span class="st">&quot;Received message from &quot;</span> <span class="op">+</span> <span class="va">$message</span><span class="op">.</span><span class="fu">Author</span><span class="op">.</span><span class="fu">Username</span> <span class="op">+</span> <span class="st">&quot;: &quot;</span> <span class="op">+</span> <span class="va">$message</span><span class="op">.</span><span class="fu">Content</span><span class="op">)</span></span>
<span id="cb229-11"><a href="#cb229-11" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="op">(</span><span class="va">$message</span><span class="op">.</span><span class="fu">Content</span><span class="op">.</span><span class="fu">Contains</span><span class="op">(</span><span class="st">&quot;ping&quot;</span><span class="op">))</span> <span class="op">{</span></span>
<span id="cb229-12"><a href="#cb229-12" aria-hidden="true" tabindex="-1"></a> <span class="va">$message</span><span class="op">.</span><span class="fu">Channel</span><span class="op">.</span><span class="fu">SendMessageAsync</span><span class="op">(</span><span class="st">&quot;pong&quot;</span><span class="op">).</span><span class="fu">GetAwaiter</span><span class="op">().</span><span class="fu">GetResult</span><span class="op">()</span></span>
<span id="cb229-13"><a href="#cb229-13" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb229-14"><a href="#cb229-14" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb229-15"><a href="#cb229-15" aria-hidden="true" tabindex="-1"></a><span class="op">})</span></span>
<span id="cb229-16"><a href="#cb229-16" aria-hidden="true" tabindex="-1"></a><span class="va">$Client</span><span class="op">.</span><span class="fu">LoginAsync</span><span class="op">([</span>Discord<span class="op">.</span><span class="fu">TokenType</span><span class="op">]::</span>Bot<span class="op">,</span> <span class="va">$DISCORD_TOKEN</span><span class="op">).</span><span class="fu">GetAwaiter</span><span class="op">().</span><span class="fu">GetResult</span><span class="op">()</span></span>
<span id="cb229-17"><a href="#cb229-17" aria-hidden="true" tabindex="-1"></a><span class="co">#$Client.StartAsync().Wait()</span></span>
<span id="cb229-18"><a href="#cb229-18" aria-hidden="true" tabindex="-1"></a><span class="va">$Client</span><span class="op">.</span><span class="fu">StartAsync</span><span class="op">().</span><span class="fu">GetAwaiter</span><span class="op">().</span><span class="fu">GetResult</span><span class="op">()</span></span>
<span id="cb229-19"><a href="#cb229-19" aria-hidden="true" tabindex="-1"></a><span class="va">$Client</span><span class="op">.</span><span class="fu">ConnectionState</span></span>
<span id="cb229-20"><a href="#cb229-20" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb229-21"><a href="#cb229-21" aria-hidden="true" tabindex="-1"></a><span class="op">[</span>console<span class="op">]::</span>ReadKey<span class="op">(</span><span class="va">$true</span><span class="op">)</span></span>
<span id="cb229-22"><a href="#cb229-22" aria-hidden="true" tabindex="-1"></a><span class="va">$Client</span><span class="op">.</span><span class="fu">LogoutAsync</span><span class="op">().</span><span class="fu">GetAwaiter</span><span class="op">().</span><span class="fu">GetResult</span><span class="op">()</span></span>
<span id="cb229-23"><a href="#cb229-23" aria-hidden="true" tabindex="-1"></a><span class="va">$Client</span><span class="op">.</span><span class="fu">Dispose</span><span class="op">()</span></span></code></pre></div>
<h1 id="oh-my-posh">oh-my-posh</h1>
<p><a
href="https://ohmyposh.dev/docs/installation/windows">Install</a></p>
<p><code>winget install JanDeDobbeleer.OhMyPosh -s winget</code><br />
<code>choco install oh-my-posh -y</code><br />
<code>scoop install https://github.com/JanDeDobbeleer/oh-my-posh/releases/latest/download/oh-my-posh.json</code><br />
<code>Set-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://ohmyposh.dev/install.ps1'))</code></p>
<p><a href="https://ohmyposh.dev/docs/themes">Themes</a></p>
<p><code>Get-PoshThemes</code><br />
<code>oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/di4am0nd.omp.json" | Invoke-Expression</code><br />
<code>oh-my-posh init pwsh --config "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/cert.omp.json" | Invoke-Expression</code></p>
<p><code>New-Item -Path $PROFILE -Type File -Force</code><br />
<code>notepad $PROFILE</code><br />
<code>oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/di4am0nd.omp.json" | Invoke-Expression</code></p>
<h3 id="themes-performance">themes-performance</h3>
<div class="sourceCode" id="cb230"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb230-1"><a href="#cb230-1" aria-hidden="true" tabindex="-1"></a>Install-Module themes-performance <span class="op">-</span>Repository NuGet</span>
<span id="cb230-2"><a href="#cb230-2" aria-hidden="true" tabindex="-1"></a><span class="fu">Import-Module</span> themes-performance</span>
<span id="cb230-3"><a href="#cb230-3" aria-hidden="true" tabindex="-1"></a>Set-PoshTheme <span class="op">-</span>Theme System-Sensors <span class="co"># -Save</span></span>
<span id="cb230-4"><a href="#cb230-4" aria-hidden="true" tabindex="-1"></a>Set-PoshTheme <span class="op">-</span>Theme System-Performance <span class="co"># -Save</span></span>
<span id="cb230-5"><a href="#cb230-5" aria-hidden="true" tabindex="-1"></a>Set-PoshTheme <span class="op">-</span>Theme Pwsh-Process-Performance <span class="co"># -Save</span></span></code></pre></div>
<h3 id="terminal-icons">Terminal-Icons</h3>
<p><code>Install-Module -Name Terminal-Icons -Repository PSGallery</code><br />
<code>scoop bucket add extras</code><br />
<code>scoop install terminal-icons</code></p>
<p><code>notepad $PROFILE</code><br />
<code>Import-Module -Name Terminal-Icons</code></p>
<p>Использует шрифты, которые необходимо установить и настроить в
параметрах профиля PowerShell: <a
href="https://github.com/ryanoasis/nerd-fonts">Nerd Fonts</a><br />
Список шрифтов: https://www.nerdfonts.com/font-downloads<br />
Скачать и установить шрифт похожий на Cascadia Code - <a
href="https://github.com/ryanoasis/nerd-fonts/releases/download/v3.1.1/CascadiaCode.zip">CaskaydiaCove</a></p>
<h1 id="pester">Pester</h1>
<p>Source: <a href="https://github.com/pester/Pester">Pester</a></p>
<p><code>Install-Module -Name Pester -Repository PSGallery -Force -AllowClobber</code><br />
<code>Import-Module Pester</code><br />
<code>$(Get-Module Pester -ListAvailable).Version</code></p>
<p><code>.Tests.ps1</code></p>
<div class="sourceCode" id="cb231"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb231-1"><a href="#cb231-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Add-Numbers <span class="op">{</span></span>
<span id="cb231-2"><a href="#cb231-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">param</span> <span class="op">(</span></span>
<span id="cb231-3"><a href="#cb231-3" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="dt">int</span><span class="op">]</span><span class="va">$a</span><span class="op">,</span></span>
<span id="cb231-4"><a href="#cb231-4" aria-hidden="true" tabindex="-1"></a> <span class="op">[</span><span class="dt">int</span><span class="op">]</span><span class="va">$b</span></span>
<span id="cb231-5"><a href="#cb231-5" aria-hidden="true" tabindex="-1"></a> <span class="op">)</span></span>
<span id="cb231-6"><a href="#cb231-6" aria-hidden="true" tabindex="-1"></a> <span class="va">$a</span> <span class="op">+</span> <span class="va">$b</span></span>
<span id="cb231-7"><a href="#cb231-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb231-8"><a href="#cb231-8" aria-hidden="true" tabindex="-1"></a>Describe <span class="st">&quot;Add-Numbers&quot;</span> <span class="op">{</span></span>
<span id="cb231-9"><a href="#cb231-9" aria-hidden="true" tabindex="-1"></a> Context <span class="st">&quot;При сложении двух чисел&quot;</span> <span class="op">{</span></span>
<span id="cb231-10"><a href="#cb231-10" aria-hidden="true" tabindex="-1"></a> It <span class="st">&quot;Должна вернуться правильная сумма&quot;</span> <span class="op">{</span></span>
<span id="cb231-11"><a href="#cb231-11" aria-hidden="true" tabindex="-1"></a> <span class="va">$result</span> <span class="op">=</span> Add-Numbers <span class="op">-</span>a <span class="dv">3</span> <span class="op">-</span>b <span class="dv">4</span></span>
<span id="cb231-12"><a href="#cb231-12" aria-hidden="true" tabindex="-1"></a> <span class="va">$result</span> <span class="op">|</span> Should <span class="op">-</span>Be <span class="dv">7</span></span>
<span id="cb231-13"><a href="#cb231-13" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb231-14"><a href="#cb231-14" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb231-15"><a href="#cb231-15" aria-hidden="true" tabindex="-1"></a> Context <span class="st">&quot;При сложении двух чисел&quot;</span> <span class="op">{</span></span>
<span id="cb231-16"><a href="#cb231-16" aria-hidden="true" tabindex="-1"></a> It <span class="st">&quot;Должна вернуться ошибка (5+0 -ne 4)&quot;</span> <span class="op">{</span></span>
<span id="cb231-17"><a href="#cb231-17" aria-hidden="true" tabindex="-1"></a> <span class="va">$result</span> <span class="op">=</span> Add-Numbers <span class="op">-</span>a <span class="dv">5</span> <span class="op">-</span>b <span class="dv">0</span></span>
<span id="cb231-18"><a href="#cb231-18" aria-hidden="true" tabindex="-1"></a> <span class="va">$result</span> <span class="op">|</span> Should <span class="op">-</span>Be <span class="dv">4</span></span>
<span id="cb231-19"><a href="#cb231-19" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb231-20"><a href="#cb231-20" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb231-21"><a href="#cb231-21" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb231-22"><a href="#cb231-22" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb231-23"><a href="#cb231-23" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> Get-RunningProcess <span class="op">{</span></span>
<span id="cb231-24"><a href="#cb231-24" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="fu">Get-Process</span> <span class="op">|</span> <span class="fu">Select-Object</span> <span class="op">-</span>ExpandProperty Name</span>
<span id="cb231-25"><a href="#cb231-25" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb231-26"><a href="#cb231-26" aria-hidden="true" tabindex="-1"></a>Describe <span class="st">&quot;Get-RunningProcess&quot;</span> <span class="op">{</span></span>
<span id="cb231-27"><a href="#cb231-27" aria-hidden="true" tabindex="-1"></a> Context <span class="st">&quot;При наличии запущенных процессов&quot;</span> <span class="op">{</span></span>
<span id="cb231-28"><a href="#cb231-28" aria-hidden="true" tabindex="-1"></a> It <span class="st">&quot;Должен возвращать список имен процессов&quot;</span> <span class="op">{</span></span>
<span id="cb231-29"><a href="#cb231-29" aria-hidden="true" tabindex="-1"></a> <span class="va">$result</span> <span class="op">=</span> Get-RunningProcess</span>
<span id="cb231-30"><a href="#cb231-30" aria-hidden="true" tabindex="-1"></a> <span class="va">$result</span> <span class="op">|</span> Should <span class="op">-</span>Contain <span class="st">&quot;svchost&quot;</span></span>
<span id="cb231-31"><a href="#cb231-31" aria-hidden="true" tabindex="-1"></a> <span class="va">$result</span> <span class="op">|</span> Should <span class="op">-</span>Contain <span class="st">&quot;explorer&quot;</span></span>
<span id="cb231-32"><a href="#cb231-32" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb231-33"><a href="#cb231-33" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb231-34"><a href="#cb231-34" aria-hidden="true" tabindex="-1"></a> Context <span class="st">&quot;Когда нет запущенных процессов&quot;</span> <span class="op">{</span></span>
<span id="cb231-35"><a href="#cb231-35" aria-hidden="true" tabindex="-1"></a> It <span class="st">&quot;Должен возвращать пустой список&quot;</span> <span class="op">{</span></span>
<span id="cb231-36"><a href="#cb231-36" aria-hidden="true" tabindex="-1"></a> <span class="co"># Замокать функцию Get-Process, чтобы она всегда возвращала пустой список процессов</span></span>
<span id="cb231-37"><a href="#cb231-37" aria-hidden="true" tabindex="-1"></a> Mock <span class="fu">Get-Process</span> <span class="op">{</span> <span class="cf">return</span> <span class="op">@()</span> <span class="op">}</span></span>
<span id="cb231-38"><a href="#cb231-38" aria-hidden="true" tabindex="-1"></a> <span class="va">$result</span> <span class="op">=</span> Get-RunningProcess</span>
<span id="cb231-39"><a href="#cb231-39" aria-hidden="true" tabindex="-1"></a> <span class="va">$result</span> <span class="op">|</span> Should <span class="op">-</span>BeEmpty</span>
<span id="cb231-40"><a href="#cb231-40" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb231-41"><a href="#cb231-41" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb231-42"><a href="#cb231-42" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<h1 id="ffmpeg">FFmpeg</h1>
<div class="sourceCode" id="cb232"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb232-1"><a href="#cb232-1" aria-hidden="true" tabindex="-1"></a><span class="va">$release_latest</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">&quot;https://api.github.com/repos/BtbN/FFmpeg-Builds/releases/latest&quot;</span></span>
<span id="cb232-2"><a href="#cb232-2" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="op">$(</span><span class="va">$release_latest</span><span class="op">.</span><span class="fu">assets</span> <span class="op">|</span> <span class="fu">Where-Object</span> name <span class="op">-match</span> <span class="st">&quot;ffmpeg-master-latest-win64-gpl.zip&quot;</span><span class="op">).</span><span class="fu">browser_download_url</span></span>
<span id="cb232-3"><a href="#cb232-3" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> <span class="va">$url</span> <span class="op">-</span>OutFile <span class="va">$home</span>\Downloads\ffmpeg-master-latest-win64-gpl<span class="op">.</span><span class="fu">zip</span></span>
<span id="cb232-4"><a href="#cb232-4" aria-hidden="true" tabindex="-1"></a>Expand-Archive <span class="op">-</span>Path <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Downloads\ffmpeg-master-latest-win64-gpl.zip&quot;</span> <span class="op">-</span>DestinationPath <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Downloads\&quot;</span></span>
<span id="cb232-5"><a href="#cb232-5" aria-hidden="true" tabindex="-1"></a><span class="fu">Copy-Item</span> <span class="op">-</span>Path <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Downloads\ffmpeg-master-latest-win64-gpl\bin\ffmpeg.exe&quot;</span> <span class="op">-</span>Destination <span class="st">&quot;C:\Windows\System32\ffmpeg.exe&quot;</span></span>
<span id="cb232-6"><a href="#cb232-6" aria-hidden="true" tabindex="-1"></a><span class="fu">Remove-Item</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Downloads\ffmpeg-*&quot;</span> <span class="op">-</span>Force <span class="op">-</span>Recurse</span></code></pre></div>
<p><code>ffmpeg -i input.mp4 output.gif</code> конвертировать mp4 в
gif<br />
<code>ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" output.gif</code>
изменить разрешение на выходе<br />
<code>ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" -r 10 output.gif</code>
изменить количество кадров в секунду на выходе<br />
<code>ffmpeg -i input.mp4 -filter_complex "fps=5,scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=32[p];[s1][p]paletteuse=dither=bayer" output.gif</code>
сжатие за счет цветовой политры<br />
<code>ffmpeg -i input.mp4 -ss 00:00:10 -frames:v 1 -q:v 1 output.jpg</code>
вытащить скриншот из видео на 10 секунде<br />
<code>ffmpeg -i input.mp4 -ss 00:00:05 -to 00:00:10 -c copy output.mp4</code>
вытащить кусок видео<br />
<code>ffmpeg -i "%d.jpeg" -framerate 2 -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4</code>
создать видео из фото (1.jpeg, 2.jpeg и т.д.) с framerate (частотой
кадров) в создаваемом видео 2 кадра в секунду<br />
<code>ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental output.mp4</code>
запись без перекодирования (copy) RTSP-потока с камеры видеонаблюдения
(+ аудио в кодеке AAC) в файл<br />
<code>ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental -movflags +faststart+frag_keyframe+empty_moov output.mp4</code>
переместить метаданные в начало файла, что позволяет начать
воспроизведение файла в видеоплеере до его полной загрузки<br />
<code>ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -frames:v 1 -c:v mjpeg output.jpg</code>
сделать скриншот</p>
<h1 id="pandoc">Pandoc</h1>
<div class="sourceCode" id="cb233"><pre
class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb233-1"><a href="#cb233-1" aria-hidden="true" tabindex="-1"></a><span class="va">$release_latest</span> <span class="op">=</span> <span class="fu">Invoke-RestMethod</span> <span class="st">&quot;https://api.github.com/repos/jgm/pandoc/releases/latest&quot;</span></span>
<span id="cb233-2"><a href="#cb233-2" aria-hidden="true" tabindex="-1"></a><span class="va">$url</span> <span class="op">=</span> <span class="op">$(</span><span class="va">$release_latest</span><span class="op">.</span><span class="fu">assets</span> <span class="op">|</span> <span class="fu">Where-Object</span> name <span class="op">-match</span> <span class="st">&quot;windows-x86_64.zip&quot;</span><span class="op">).</span><span class="fu">browser_download_url</span></span>
<span id="cb233-3"><a href="#cb233-3" aria-hidden="true" tabindex="-1"></a><span class="fu">Invoke-RestMethod</span> <span class="va">$url</span> <span class="op">-</span>OutFile <span class="va">$home</span>\Downloads\pandoc<span class="op">.</span><span class="fu">zip</span></span>
<span id="cb233-4"><a href="#cb233-4" aria-hidden="true" tabindex="-1"></a>Expand-Archive <span class="op">-</span>Path <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Downloads\pandoc.zip&quot;</span> <span class="op">-</span>DestinationPath <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Downloads\&quot;</span></span>
<span id="cb233-5"><a href="#cb233-5" aria-hidden="true" tabindex="-1"></a><span class="va">$path</span> <span class="op">=</span> <span class="op">$(</span><span class="fu">Get-ChildItem</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Downloads\pandoc-*\*.exe&quot;</span><span class="op">).</span><span class="fu">FullName</span></span>
<span id="cb233-6"><a href="#cb233-6" aria-hidden="true" tabindex="-1"></a><span class="fu">Copy-Item</span> <span class="op">-</span>Path <span class="va">$path</span> <span class="op">-</span>Destination <span class="st">&quot;C:\Windows\System32\pandoc.exe&quot;</span></span>
<span id="cb233-7"><a href="#cb233-7" aria-hidden="true" tabindex="-1"></a><span class="fu">Remove-Item</span> <span class="st">&quot;</span><span class="va">$home</span><span class="st">\Downloads\pandoc*&quot;</span> <span class="op">-</span>Force <span class="op">-</span>Recurse</span></code></pre></div>
<p><code>pandoc -s README.md -o PS-Commands.html</code> конвертировать
из Markdown в HTML<br />
<code>pandoc -s PS-Commands.html -o README.md</code> конвертировать из
HTML в Markdown</p>
</body>
</html>