add powershell
continuous-integration/drone/push Build is passing Details

states/02
thest1tch 2 years ago
parent 47f2ea38e6
commit 802fd06329

@ -0,0 +1,43 @@
# Powershell. Active Directory
## Список кто добавлял пользователя в домен
Чтобы узнать кто завел юзера в домен, будем использовать журналы безопасности контроллера домена Active Directory.
При заведении нового пользователя в журнале безопасности контроллера домена (только того DC, на котором создавалась учетная запись) появляется событие с кодом EvenId 4720 (на DC должна быть включена политика аудита Audit account management в политике Default Domain Controller Policy).
В описании этого события содержится строка A user account was created, а затем указан аккаунт, из-под которого была создана новая учетка пользователя AD.
Скрипт для выгрузки всех событий создания аккаунтов из журнала контроллера домена за последние 24 часа может выглядеть следующим образом:
```powershell
$time = (get-date) - (new-timespan -hour 24)
$filename = Get-Date -Format yyyy.MM.dd
$exportcsv=”c:\ps\ad_users_creators” + $filename + “.csv”
Get-WinEvent -FilterHashtable @{LogName="Security";ID=4720;StartTime=$Time}| Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$CreatorUser = $event.Event.EventData.Data[4]."#text"
$NewUser = $event.Event.EventData.Data[0]."#text"
$dc = $event.Event.System.computer
$dc + “|” + $Time + “|” + $NewUser + “|” + $CreatorUser| out-file $exportcsv -append
}
}
```
## Список кто последних созданных пользователей
```powershell
$lastday = ((Get-Date).AddDays(-1))
$filename = Get-Date -Format yyyy.MM.dd
$exportcsv=”c:\ps\new_ad_users_” + $filename + “.csv”
Get-ADUser -filter {(whencreated -ge $lastday)} | Export-csv -path $exportcsv
```
## Подсчет количества юзеров с полем
```powershell
(Get-ADUser -Filter {(L -Eq "Склад") -and (Enabled -eq $True)} -SearchBase "OU=user,DC=example,DC=com").count
```
## Вывод юзеров в группе по логинам
```powershell
get-adgroup -filter {name -like "group"} -Properties Members | Get-ADGroupMember | select samaccountname
```

@ -0,0 +1,62 @@
# Скрипт для отправки статистики по отпечатанным страницам принтеров на почту
```powershell
function Send-Email {
$SMTPServer = "smtp.example.ru"
$port = 587
$EmailFrom = "test@example.ru"
$EmailTo = "list@example.ru"
$Body = "Статистика по печати за $(get-date -f dd.MM.yyyy)"
$EmailSubject = "Статистика по печати за $(get-date -f dd.MM.yyyy)"
$EmailUser = "admin@example.ru"
$EmailPass = "password"
$Date = $(get-date -f yyyy.MM.dd)
$File = "c:\count\$Date.txt"
$Message = New-Object System.Net.Mail.MailMessage $EmailFrom, $EmailTo
$Att = New-object Net.Mail.Attachment($File)
$Message.Subject = $EmailSubject
$Message.IsBodyHTML = $True
$Message.Body = $Body
$Message.Attachments.Add($Att)
$SMTP = New-Object Net.Mail.SmtpClient($SMTPServer)
$SMTP.Credentials = New-Object System.Net.NetworkCredential($EmailUser, $EmailPass);
$SMTP.Send($Message)
$att.Dispose()
}
function Get-InfoPrintersKyocera {
$snmp = New-Object -ComObject olePrn.OleSNMP
cls
foreach ($n in 1..119)
{
# IP можно изменить на свой
$ip = "192.168.1.$n"
if (Test-Connection $ip -Quiet -Count 2)
{
$snmp.open($ip, 'public', 1, 3000)
}
else {Continue}
Try {$model = $snmp.Get('.1.3.6.1.2.1.25.3.2.1.3.1')}
Catch {Continue}
New-Object PSObject -Property ([ordered]@{
"Serial Number" = $snmp.Get('.1.3.6.1.4.1.1347.43.5.1.1.28.1')
"PrinterModel" = $model
"IP" = $ip
# "Description" = $snmp.Get('.1.3.6.1.2.1.1.1.0')
"TotalPageCount" = $snmp.Get('.1.3.6.1.4.1.1347.43.10.1.1.12.1.1')
"Date" = $(get-date -f dd.MM.yyyy)
})
}
}
Get-InfoPrintersKyocera | export-csv -NoTypeInformation -encoding UTF8 "C:\count\$(get-date -f yyyy.MM.dd)-PrinterCount.csv"
Send-Email
```

@ -0,0 +1,164 @@
# Небольшие заметки по использованию, чтобы не забывать. 
## Перед выполнение скриптового файла
```powershell
set-executionpolicy remotesigned
```
## Получить помощь
```powershell
# помощь по команде Get-Process
get-help Get-Process
# пример использования команды Get-Process
get-help Get-Process -examples
# Получить методы возвращаемого объекта Get-Process
Get-Process| Get-Member
# Узнать тип объекта. В данном случае переменной с каталогом пользователя
$home.GetType()
```
## Операции сравнения
| **Операция** | **без учета регистра** | **с учетом регистра** | **C#** |
| --- | --- | --- | --- |
| равно(equal) | `-eq` | `-ceq` | `==` |
| не равно (not equal) | `-ne` | `-cne` | `!=` |
| больше чем (greater then) | `-gt` | `-cgt` | `>` |
| меньше чем (less than) | `-lt` | `-clt` | `<` |
| больше равно (greater or equal) | `-ge` | `-cge` | `>=` |
| меньше равно (less than or equal) | `-le` | `-cle` | `⇐` |
## Операции со строками
Полная аналогия с C#. Разбить строку по пробелам
```powershell
$string = "Test string"
$string.split(" ")
```
Ищем в $string первый пробел
```powershell
$string.IndexOf(" ")
```
## Предопределенные переменные
- `$home` — каталог пользователя 
- `$NULL` — пусто 
- `$true` — истина 
- `$false` — ложь
- `$DebugPreference` (См. команду `Write-Debug`)
- «Continue» выводить отладку
- «SilentlyContinue» не выводить отладочную информацию. 
## Работа с файлами
Дописать `$string` новой строкой в файл $file
```powershell
$string | Out-File $file -Append
```
Получить в `$string` содержимое файла $file
```powershell
$string = get-content -Path $file
```
Проверить существование файла
```powershell
Test-Path "C:test.txt"
```
Найти все файлы с определенным расширением расширением в каталоге и подкаталогах. Затем скопировать эти файлы в другой каталог.
```powershell
$flist = get-childitem e:doc* -include *.pdf -recurse
$flist | ForEach-Object{$_.CopyTo("e:docall_pdf" + $_.PSChildName)}
```
Текущий каталог
```powershell
$local = Get-Location
$local.Path # Рабочий каталог
$local.Drive.Root # Корень
$local.Drive.Name # Буква диска
$local.Drive.Used # Использовано диска
$local.Drive.Free # Свободно на диске
```
## Вывод текста на экран
```powershell
# текст на который надо обратить внимание. Выделяется желтым.
Write-Warning("Текст требующий внимания")
# Просто выводит текст
Write-Host("Просто текст")
#включили вывод отладочной информации
$DebugPreference = "Continue"
# вывели отладочную информацию
Write-Debug "Cannot open file."
# отключили отладочную вывод отладочной информации
$DebugPreference = "SilentlyContinue"
```
## Сделать паузу на несколько секунд
```powershell
Start-Sleep -s 15 # Пауза на 15 секунд
```
## Пауза в консоли, до нажатия Enter
```powershell
Read-Host "Нажмите Enter"
```
## Работа с процессами
Задача: убить все процессы с именем Notepad
```powershell
# Способ №1
get-process Notepad | Stop-Process
# Способ №2 (Работает только с одним процессом)
$plist = get-process Notepad
$plist.Kill()
# Способ №3 (то же что и 2, но все процессы)
$plist = get-process Notepad
$plist | ForEach-Object {$_.Kill()}
```
## Получить процессы и даты их запуска
```powershell
Get-Process| Format-Table Name,StartTime -AutoSize
```
## Список сессий RDP
```powershell
$servers = "server1", "server2"
$ts = qwinsta /server:$server
$td = ($ts | where { $_ -notlike "*Подключено*" -and $_ -notlike "*services*" -and $_ -notlike "*Прием*"})
foreach ($server in $servers) {
"Users: $server"
$td
}
```

@ -0,0 +1,25 @@
# Остановка процесса
Для завершения процессов в PowerShell предусмотрен отдельный командлет Stop-Process, позволяющий «убивать» один или несколько процессов сразу. Способов завершения процесса в PowerShell два — через идентификатор процесса и через его имя, используйте какой вам удобнее.
## Через идентификатор процесса
```powershell
Stop-Process id_process
```
Для получения списка ID активных процессов используется командлет `Get-Process`.
Допустим, вы хотите завершить зависший браузер Edge. Выполните в PowerShell команду `Get-Process` и посмотрите, какой ID имеет процесс MicrosoftEdge.
В данном примере это 2196. Следовательно, команда завершения будет такой:
```powershell
Stop-Process 2196
```
## Через имя процесса
Вместо идентификатора можно использовать имя процесса, только в этом случае потребуется указать ключ `processname`. Вот так:
```powershell
Stop-Process -processname MicrosoftEdge
```
Если нужно завершить работу нескольких приложений, их процессы указываются один за другим через запятую:
```powershell
Stop-Process -processname MicrosoftEdge, regedit
```

@ -28,7 +28,8 @@ nav:
- PHP imagick: docker/nextcloud/php-imagick.md
- Игровые сервера:
- Valheim: docker/games/valheim.md
- Ubuntu 22:
- Software:
- Ubuntu 22:
- HPE:
- Management Component Pack: ubuntu/hpe/hpe-mcp.md
- MariaDB: ubuntu/mariadb.md
@ -36,6 +37,11 @@ nav:
- Docker+UFW: ubuntu/docker-ufw.md
- Монтирование CIFS: ubuntu/mount-cifs.md
- Ubuntu bash aliases: ubuntu/bash-aliases.md
- Powershell:
- software/powershell/index.md
- Active Directiry: software/powershell/ad.md
- Stop-Process: software/powershell/stop-process.md
- Count-Pages: software/powershell/count-pages.md
- Proxmox:
- CT Template: proxmox/ct-template.md
- Другое:

Loading…
Cancel
Save