среда, 31 июля 2019 г.

Скрипт для поиска однофамильцев в AD. powershell
Namesakes detecting in ActiveDirectory, powershell

#by me, 2019

import-module activedirectory

$SMTPSERVER = "exch.domain.local"

function main{
$users = (get-aduser -filter {enabled -eq $true -and EmailAddress -like "*@*"} -properties DisplayName).DisplayName
$doubleDisplayNames = $users | group | where{$_.count -gt 1}
if($doubleDisplayNames.count -gt 0) {
Send-MailMessage -From powershell@domain.local -To achernov@domain.local -Subject "Обнаружены полные однофамильцы в домене domain.local" -Body $($doubleDisplayNames.Name -join "`n") -SmtpServer $SMTPSERVER -Priority High -Encoding UTF8
}
}#end of main

try{
 main
}
catch
{
 $ErrorMessage = $_.Exception.Message
 Send-MailMessage -From powershell@domain.local -To admin@domain.local -Subject "Скрипт поиска однофамильцев в домене domain.loc вызвал ошибку выполнения." -Body $($ErrorMessage) -SmtpServer $SMTPSERVER -Priority High -Encoding UTF8
}

среда, 13 февраля 2019 г.

<#
Скрипт очистки рабочих каталогов 1С пользователей. Скрипт для Terminal Server.
Принцип работы:
Логофит всех пользователей у которых запущен клиент 1С.
Удаляет каталоги формы [guid] из массива, определенного в переменной $global:dirs
Лог работы скрипта в файле с именем из переменной $logfile
Для запуска скрипта файл "C:\Program Files\1cv8\nightrestart" должен существовать
#>

$logfile = "C:\scripts\1C-TS-restartAndRemoveUsersWorkDirs.log"
$path = "C:\Program Files\1cv8\nightrestart"
$test = $false
$global:dirs = ("C:\Users\*\AppData\Local\1C\1Cv82\*","C:\Users\*\AppData\Roaming\1C\1Cv82\*","C:\Users\*\AppData\Local\1C\1Cv8\*","C:\Users\*\AppData\Roaming\1C\1Cv8\*","C:\Users\*\AppData\Roaming\1C\Файлы\")

if (-not(Test-Path $path)) {
    log("Script execution temporarily suspended. File C:\Program Files\1cv8\nightrestart not found.")
    Exit
}

function log([string]$txt)
{ add-content $logfile "$(Get-date): $txt" }


function LogoffAll {
# логофим всех пользователей у которых запущен клиент 1C
log("Logoff for all...")
$currentid = (Get-Process -PID $pid).SessionID
$proceses1c = Get-Process | Where-Object{$_.Name -like "1cv8" -or $_.Name -like "1cv8c"}
$sessionids = $proceses1c | select sessionid | Group-Object sessionid | select name
foreach ($sessionid in $sessionids) {if ($sessionid.name -ne "0" -and $sessionid.name -ne $currentid.ToString()) {logoff $sessionid.name}}
}

function RemoveDirs {
    $removedfiles = 0
foreach ($dirname in $global:dirs){
foreach ($dirtoremove in Get-ChildItem $dirname | Where {$_.Name -as [guid]}) {
try {
Remove-Item $dirtoremove -Force -Recurse -cf:$false -ErrorAction Stop -WhatIf:$test
$removedfiles++
}
catch {
log("Error. Can not remove dir " + $dirtoremove)
}
}
}
    return $removedfiles
}

#main section
log("Start...")
LogoffAll
$removeddirs = RemoveDirs
log("Dirs deleted: " + $removeddirs)