diff --git a/docs/software/powershell/ad.md b/docs/software/powershell/ad.md new file mode 100644 index 0000000..6d5693e --- /dev/null +++ b/docs/software/powershell/ad.md @@ -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 +``` + diff --git a/docs/software/powershell/count-pages.md b/docs/software/powershell/count-pages.md new file mode 100644 index 0000000..e9f7e8c --- /dev/null +++ b/docs/software/powershell/count-pages.md @@ -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 +``` \ No newline at end of file diff --git a/docs/software/powershell/index.md b/docs/software/powershell/index.md new file mode 100644 index 0000000..59da642 --- /dev/null +++ b/docs/software/powershell/index.md @@ -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 +} +``` \ No newline at end of file diff --git a/docs/software/powershell/stop-process.md b/docs/software/powershell/stop-process.md new file mode 100644 index 0000000..72df60f --- /dev/null +++ b/docs/software/powershell/stop-process.md @@ -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 +``` \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 2d71b6a..acf7a13 100755 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -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 - Другое: