Автор Тема: Скрипты для автоматизации административных задач.  (Прочитано 74780 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн shs

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 4401
  • Рейтинг: 89
    • Просмотр профиля
    • ShS's blog
  • Откуда: Default city
Здесь размещаем скрипты. Обсуждение в других темах.
Первая строка каждого поста должна быть представлена в следующем формате:
Наименование скрипта#Язык программирования#автор

Например:
Подключение сетевого принтера и установка его принтером по умолчанию#JScript#ShS

« Последнее редактирование: 13 ноября 2010, 11:47:39 от Shurikz »

Оффлайн goro

  • Старожил
  • ****
  • Сообщений: 512
  • Рейтинг: 0
  • Пол: Мужской
    • romeo_2205
    • Просмотр профиля
  • Откуда: Киев
Поделитесь пжл, таким скриптом

Оффлайн shs

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 4401
  • Рейтинг: 89
    • Просмотр профиля
    • ShS's blog
  • Откуда: Default city
Поделитесь пжл, таким скриптом
Этим скриптом поделилась сама MS в соответствующей KB, в которой говорится о том, что возможность смены пароля при помощи GPP была убрана из политик.

https://support.microsoft.com/en-us/kb/2962486
« Последнее редактирование: 14 июня 2016, 19:36:37 от shs »

Оффлайн goro

  • Старожил
  • ****
  • Сообщений: 512
  • Рейтинг: 0
  • Пол: Мужской
    • romeo_2205
    • Просмотр профиля
  • Откуда: Киев
а если это будет просто cmd в сценарии автозапуска компьютера
с текстом
echo off
net user user  password

Должно сработать?

Оффлайн shs

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 4401
  • Рейтинг: 89
    • Просмотр профиля
    • ShS's blog
  • Откуда: Default city
а если это будет просто cmd в сценарии автозапуска компьютера
с текстом
echo off
net user user  password

Должно сработать?

да, но это еще более небезопасно, чем то, что отменил MS. Пароль хранится в открытом виде вообще внутри батника.

Оффлайн goro

  • Старожил
  • ****
  • Сообщений: 512
  • Рейтинг: 0
  • Пол: Мужской
    • romeo_2205
    • Просмотр профиля
  • Откуда: Киев
Ищу скрипт для отключения почтовых ящиков exchange у деактивированых учеток, более n-дней.
Может кто поделиться?

Оффлайн shs

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 4401
  • Рейтинг: 89
    • Просмотр профиля
    • ShS's blog
  • Откуда: Default city
Ищу скрипт для отключения почтовых ящиков exchange у деактивированых учеток, более n-дней.
Может кто поделиться?
создайте новую тему

Здесь размещаем скрипты. Обсуждение в других темах.Первая строка каждого поста должна быть представлена в следующем формате:Наименование скрипта#Язык программирования#автор

Оффлайн kwuipi

  • Новичок
  • *
  • Сообщений: 1
  • Рейтинг: 0
  • Пол: Мужской
    • drakzon1
    • Просмотр профиля
  • Откуда: Минск
Всем добрый день, нашел этот скрипт для добавления адресной книги ldap. Всё подстроил, что нужно. Только одна проблема, мне нужно добавить две книги на более чем 200 компов, а этот скрипт добавляет одну. Может нужно поменять первые два ключа ? Но даже не имею понятия на какие
http://www.codeproject.com/Articles/14053/Adding-an-LDAP-address-book-to-MS-Outlook

Оффлайн Triangle

  • Модераторы
  • Олдфаг
  • *****
  • Сообщений: 7212
  • Рейтинг: 49
  • Пол: Мужской
  • Откуда: замкадыш
Убивалка кэша 1С для всех пользователей сервера#Powershell#it-pages.ru

Get-ChildItem "C:\Users\*\AppData\Local\1C\1Cv82\*","C:\Users\*\AppData\Roaming\1C\1Cv82\*" | Where {$_.Name -as [guid]} |Remove-Item -Force -Recurse
Тетрис научил нас жизненно важному пониманию, успехи исчезают, ошибки накапливаются.

Оффлайн Lexw

  • Начинающий
  • *
  • Сообщений: 47
  • Рейтинг: 0
  • Пол: Мужской
    • admintsm@gmail.com
    • Просмотр профиля
  • Откуда: Оттуда
Очистка временных файлов на всех компах в домене, в системных каталогах и во всех учетках пользователей #Psh
писался давно, работает на любой версии PoSh, без предустановленного модуля Active Directory.
Чистит, если свободного места меньше десяти гигов.
Если после чистки свободного места остаётся меньше шести гигов, пишет имя компа в лог usedSpace. Второй столбец - размер диска C.
В лог clearedSpace.log пишутся результаты до и после чистки.
Логи после работы удобно просматривать в экселе, сортировать по столбцам.


######Настройки
#Указываем корень поиска. По умолчанию ищем во всем домене.
#Вместо $DomainDN указываем свой путь вида  OU=Computers,OU=Accounts,DC=mydomain,DC=ru
$Srchroot = [ADSI]"LDAP://OU=Computers,OU=Accounts,DC=mydomain,DC=ru"
#Путь к лог-файлам
$LogPathLowSpace = "D:\work\log\usedSpace.log"
$LogPathClearSpace = "D:\work\log\clearedSpace.log"



Function Test-Host ($Name)
{
    $ping = new-object System.Net.NetworkInformation.Ping
    trap {Write-Verbose "Ошибка пинга"; $False; continue}
    if ($ping.send($Name, 50).Status -eq "Success" ) { $True }
    else { $False }
}


function Clear-TempFiles
{ param([string]$computername=$env:COMPUTERNAME)

$UsersDir = "\\$computername\C$\users"
$UserProfileTemp1 ="\AppData\Local\Temp"
$UserProfileTemp2 ="\AppData\Local\Microsoft\Windows\Temporary Internet Files"
$WindowsTemp = "\\$computername\C$\Windows\Temp"
$RecycleBin =  "\\$computername\C$"+'\$Recycle.Bin'

$dirs = ls $UsersDir
foreach ($path in $dirs)
{
     $temp1=$path.FullName+$UserProfileTemp1
     $temp2=$path.FullName+$UserProfileTemp2
     if((Test-Path $temp1) -and (Test-Path $temp2)   ){
         Write-host ("Clearing profile: "+$path+".....") -NoNewline
         Remove-Item "$temp1\*" -Force -Recurse -Confirm:$false -ErrorAction SilentlyContinue
         Remove-Item "$temp2\*" -Force -Recurse -Confirm:$false -ErrorAction SilentlyContinue
         Write-Host "Done"
      }
     
}
Write-Host ('Clearing C:\$Recycle.Bin.....') -NoNewline
Remove-Item "$RecycleBin\*" -Force -Recurse -Confirm:$false -ErrorAction SilentlyContinue
Write-Host "Done"   
Write-Host ("Clearing C:\Windows\Temp:.....") -NoNewline
Remove-Item "$WindowsTemp\*" -Force -Recurse -Confirm:$false -ErrorAction SilentlyContinue
Write-Host "Done"   
}


function Get-FreeSpace
{param ([string]$DnsHosName)
   $driveC=Get-WmiObject Win32_LogicalDisk -ComputerName $DnsHosName| Where-Object {$_.DeviceID -eq "C:"}
   $freespace=[int]($driveC.FreeSpace/1GB)
   return $freespace
}


#====Обращение к Актив Директори=================
#Получаем имя домена
$DomainName = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$DomainDN = $DomainName.GetDirectoryEntry().distinguishedName
$DN=$DomainName.Name

#Получаем список компов в домене
$selector = New-Object system.DirectoryServices.DirectorySearcher
$Selector.SearchRoot = $Srchroot
$Selector.PageSize = 3000
$selector.Filter = '(objectClass=Computer)'
$selector.PropertiesToLoad.AddRange(@("name","dnshostname", "distinguishedName",
"canonicalName","lastLogonTimestamp"))
$Computers = $selector.FindAll()
#==================================================


""|Out-File -FilePath $LogPathLowSpace
""|Out-File -FilePath $LogPathClearSpace

foreach ($comp in $Computers)
    { 
        $dnsname = $comp.Properties.get_item("dnshostname")
        $CompName = $comp.Properties.get_item("name")
      if(Test-Host $dnsname)
       {
         
         Write-Host "Scanning:"$CompName
         $freespaceBeforClr = Get-FreeSpace -DnsHosName $dnsname
         if ($freespaceBeforClr -le 10)
          {
             Write-Host ("Clearing: "+$CompName+" FreeSpace: "+$freespaceBeforClr)
             Clear-TempFiles -computername $dnsname   
         
               
             $freespaceAfterClr = Get-FreeSpace -DnsHosName $dnsname
             Write-Host ("Clearing: "+$CompName+" After clr: "+$freespaceAfterClr)     
         
             $clrResult = [string] ($CompName+$freespaceBeforClr+$freespaceAfterClr)
             $clrResult|Out-File -FilePath $LogPathClearSpace -Append
             
                if ($freespaceAfterClr -le 6)
                {                   
                $driveC=Get-WmiObject Win32_LogicalDisk -ComputerName $dnsname| Where-Object {$_.DeviceID -eq "C:"}
                $totalspace=[int]($driveC.Size/1GB)
                $result = [string] ($CompName+$freespaceAfterClr+$totalspace)
                $result| Out-File -FilePath $LogPathLowSpace -Append
         
                }
         
            }
       
       }
   
    }

Оффлайн flaitsman

  • Новичок
  • *
  • Сообщений: 8
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Москва
Простой скрипт для резервного копирования серверов в сетевую шару. Можно легко приспособить под свои нужды. Удаление устаревших резервных копий, и уведомление по почте, в случае, если что-то пошло не так.

$CurrentDate = get-date -format dd.MM.yyyy
$DC_Name = "NAME_"
$NPath = "\\storage\BACKUP\"
$Path_Net_Drive = $NPath + $DC_Name + $CurrentDate
$StoreBackup_Period = 5
$limit = (Get-Date).AddDays(-$StoreBackup_Period)
$from = "admin@domain.net"
$to = "admin@domain.net"
$smtp = "mail.domain.local"
$sub = "NAME LAST BACKUP RESULT"

Function CheckPath ($Path) {
$Path_Exists = Test-Path -Path $Path
If ($Path_Exists -eq $False) {New-Item $Path -type directory}
}
Add-PSSnapin Windows.Serverbackup -ErrorAction SilentlyContinue
$policy = New-WBPolicy
$target = New-WBBackupTarget -NetworkPath $Path_Net_Drive
Add-WBBareMetalRecovery -Policy $policy
Add-WBSystemState -policy $policy
Add-WBVolume -Policy $policy -Volume (Get-WBVolume -CriticalVolumes)
Set-WBVssBackupOptions -policy $policy -VssFullBackup
Add-WBBackupTarget -Policy $policy -Target $target
CheckPath $Path_Net_Drive | Out-Null
Start-WBBackup -Policy $policy

if ((Get-WBSummary).LastBackupResultHR -eq 0) {
Get-ChildItem -Path $NPath -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
Get-ChildItem -Path $NPath -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse
}
else {
Get-WBSummary > C:\SCRIPTS\summary.txt
Send-MailMessage -To $to -From $from -Subject $sub  -Attachments C:\SCRIPTS\summary.txt  -SmtpServer $smtp -DeliveryNotificationOption Never
}

Оффлайн flaitsman

  • Новичок
  • *
  • Сообщений: 8
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Москва
Скрипт для чанги 2013. Чекает у кого из юзеров объем почтового ящика близок к превышению квоты, отображает список и уведомляет о таковых по почте, если они имеются.

$array = @()
$array2 = @()
$mailboxes = get-mailbox
$file = New-Item -itemtype file "C:\SCRIPTS\quotas.html" -Force
$mailalert=$false
Add-Content $file '<html><head>
<meta http-equiv="Content-Type" content="text/html;charset=windows-1251">
<title>System Status Report</title>
<style type="text/css">
<!--
BODY{background-color:#FFFFFF;}
TABLE{border-width: 1px;border-style: solid;border-color: black;}
TH{border-width: 1px;padding: 1px;border-style: solid;border-color: black;background-color:#1D92DC}
TD {border-width: 1px;padding: 2px;border-style: solid;border-color: black;background-color:#94BFE4}
TR {color:#000000;font-family:Tahoma;font-size:10pt;}
}
-->
</style>


<table>
<tr><th>mailbox: </th><th>state: </th></tr>
'
foreach ($line in $mailboxes) {
    $user = $line.alias
    $size2 = get-mailboxstatistics $user -erroraction silentlycontinue
    if ($size2 -ne $null) {
        $size = $size2.TotalItemSize.Value.ToMB()
    }
    $array += @(,($user,$size))
}
foreach ($line in $array) {
    $user = $line[0]
    $size = $line[1]
    If ($user -notmatch 'DiscoverySearch') {
        $quota2 = get-mailbox $user
        $quotapsr = $quota2.ProhibitSendReceiveQuota
        if ($quotapsr -ne "unlimited") {
            $quotapsr = $quota2.ProhibitSendReceiveQuota.Value.ToMB()
            if ($size -gt $quotapsr) {
                $quotacheckpsr = "Over"
            } else {
                $quotacheckpsr = "Under"
            }
        } else {
            $quotacheckpsr = "NoChecking"
        }
        $quotaiw = $quota2.IssueWarningQuota
        if ($quotaiw -ne "unlimited") {
            $quotaiw = $quota2.IssueWarningQuota.Value.ToMB()
            if ($size -gt $quotaiw) {
                $quotacheckiw = "Over"
            } else {
                $quotacheckiw = "Under"
            }
        } else {
            $quotacheckiw = "NoChecking"
        }
        $quotaps = $quota2.ProhibitSendQuota
        if ($quotaps -ne "unlimited") {
            $quotaps = $quota2.ProhibitSendQuota.Value.ToMB()
            if ($size -gt $quotaps) {
                $quotacheckps = "Over"
            } else {
                $quotacheckps = "Under"
            }
        } else {
            $quotacheckps = "NoChecking"
        }
        $array2 += @(,($user,$size,$quotacheckiw,$quotaiw,$quotacheckps,$quotaps,$quotacheckpsr,$quotapsr))
    }
}
foreach ($line in $array2) {
    if ($line[2] -eq "Over") {
        $mbname=$line[0]
        write-host "The mailbox for"$line[0]"is " -nonewline
        write-host "OVER the Issue Warning Quota, " -ForegroundColor red -nonewline
        Add-Content $file "<tr><td>$mbname</td><td style='background-color:red; color:Yellow;'><strong>OVER the Issue Warning Quota</strong></td></tr>"
        $mailalert=$true
    } else {
        write-host "The mailbox for"$line[0]"is " -nonewline
        write-host "UNDER the Issue Warning Quota, " -ForegroundColor green -nonewline
    }
    if ($line[4] -eq "Over") {
        $mbname=$line[0]
        write-host "OVER the Prohibit Send Quota," -ForegroundColor red -nonewline
        Add-Content $file "<tr><td>$mbname</td><td style='background-color:red; color:Yellow;'><strong>OVER the Prohibit Send Quota</strong></td></tr>"
        $mailalert=$true
    } else {
        write-host "UNDER the Prohibit Send Quota," -ForegroundColor green -nonewline
    }
    if ($line[6] -eq "Over") {
        $mbname=$line[0]
        write-host " and " -nonewline
        write-host "OVER the Prohibit Send Receive Quota." -ForegroundColor red
        Add-Content $file "<tr><td>$mbname</td><td style='background-color:red; color:Yellow;'><strong>OVER the Prohibit Send Receive Quota</strong></td></tr>"
        $mailalert=$true
    } else {
        write-host " and " -nonewline
        write-host "UNDER the Prohibit Send Receive Quota." -ForegroundColor green
    }
}
if ($mailalert -eq $true) {
$html = Get-Content "C:\SCRIPTS\quotas.html" -raw
Send-MailMessage -smtpServer mail.domain.net -from 'alert@domain.net' -to 'admin@domain.net' -subject "Quotas" -body $html -Encoding UTF8 -BodyAsHTML
}

Оффлайн flaitsman

  • Новичок
  • *
  • Сообщений: 8
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Москва
Скрипт для чанги 2013. Чекает очередь сообщений, и если количество висящих в очереди писем больше установленных лимитов, то уведомляет по почте.

Param(
[string]$From = 'alert@domain.net'
[string]$To = 'admin@domain.net'
[string]$Server = 'mail.domain.local'
[switch]$email = $true
)
[int]$WarningLevel = 10
[int]$CriticalLevel = 20
[int]$ResultError = 0
[string]$computername=$env:computername
function Send-EmailMessage {
param([string]$EmailSubj=$Results, [string]$EmailBody=$Results)
$EmailMessage.Subject = $EmailSubj
$EmailMessage.Body = $EmailBody
$SMTPClient.Send( $EmailMessage )
}
$isHubTransportServer=(Test-Path "HKLM:\SOFTWARE\Microsoft\ExchangeServer\v15\HubTransportRole")
if ($isHubTransportServer) {
$MessagesQueued=get-wmiobject -query "select MessagesQueuedForDelivery from Win32_PerfFormattedData_MSExchangeTransportQueues_MSExchangeTransportQueues"
$Messages=$MessagesQueued.MessagesQueuedForDelivery
$MRes=[string]$messages
if ($Messages) {
if ($Messages -lt $WarningLevel) {
$Results = 'Все в порядке. Количество сообщений в очереди на сервере '+$computername+': ' +$MRes.remove(2)
}
if ($Messages -gt $WarningLevel) {
$ResultError=1
$Results = 'Я извиняюсь, но количество сообщений в очереди на сервере '+$computername+': ' +$MRes.remove(2)+ ' и мне это не по нраву...'
}
if ($Messages -gt $CriticalLevel) {
$ResultError=2
$Results = 'Алярм!!! Что-то пошло не так, и количество сообщений в очереди на сервере '+$computername+' достигло: ' +$MRes.remove(2)+ '. Это меня тревожит...'
}
}
Else {
$ResultError=1
$Results = 'Внимание! Очередь сообщений НЕДОСТУПНА на сервере ' +$computername
}
}
 
Else {
$Results='Exchange 2013 не установлен'
}
if ($email) {
$SMTPClient = New-Object Net.Mail.SMTPClient($Server, $Port)
if (($Username) -and ($Password)) { $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password) }
if ($SSL) { $SMTPClient.EnableSSL = $true }
$EmailMessage = New-Object System.Net.Mail.MailMessage
$EmailMessage.From = $From
$EmailMessage.To.Add( $To )
}
 
Switch ($ResultError) {
default {
write-host $Results
exit 0
}
 
1 {
write-host $Results
if ($email) { Send-EmailMessage }
exit 1
}
 
2 {
write-host $Results
if ($email) { Send-EmailMessage }
exit 2
}
}

Оффлайн shs

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 4401
  • Рейтинг: 89
    • Просмотр профиля
    • ShS's blog
  • Откуда: Default city
Скрипт собирает (на некотором наборе компьютеров) и показывает информацию о заданной задаче из планировщика задач.
Информация о дате времени запуска отображается только для первого триггера запуска, но зато показывает дни запуска в виде строки, где каждая цифра соответствует дню недели, в который скрипт будет запускаться по заданию из планировщика.

#Server Name Prefix
$SRVPrefix="srv"

#Number of Computers
$NoC=99

#DaysDelay (do not look up for evets older then the delay)
$DaysDelay=1

#Name of Scheduled Task
$TaskName="Restart"

#Loop through the list of computers
$Tasks = 1..$NoC|%{

[int]$PC=100*$_/$NoC

    $Srv="$SRVPrefix{0:d2}" -f $_

Write-Progress -Activity "Querying server $srv..." -status "$PC% Complete:" -PercentComplete $PC

    if (Test-Connection -ComputerName $srv -Quiet -Count 1) {

        Get-ScheduledTask -CimSession $Srv -TaskName RestartServer | select TaskName, State, PSComputerName, @{N="TriggersCount";E={$_.triggers.length}}, @{N="StartBoundary";E={$_.triggers[0].StartBoundary}}, @{N="DaysOfWeek";E={$a=$_.triggers[0].DaysOfWeek;$c="";do {$b=[math]::Truncate([math]::Log($a)/[math]::Log(2));$a-=[math]::Pow(2,$b);$c="$b"+$c} while ($a);$c}}

    }

}
$Tasks | sort DaysOfWeek | ft -AutoSize

Оффлайн Triangle

  • Модераторы
  • Олдфаг
  • *****
  • Сообщений: 7212
  • Рейтинг: 49
  • Пол: Мужской
  • Откуда: замкадыш
Write-Host Жди, я работаю, много тут у тебя.
# Получаем информацию о системе
$computerSystem = Get-WmiObject -Class Win32_ComputerSystem
$bios = Get-WmiObject -Class Win32_BIOS

# Получаем объем памяти в ГБ
$memorySizeGB = [math]::round($computerSystem.TotalPhysicalMemory / 1GB, 2)

# Получаем объем диска в ГБ
$diskSizeGB = Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType=3" |
               Measure-Object -Property Size -Sum |
               Select-Object -ExpandProperty Sum
$diskSizeGB = [math]::round($diskSizeGB / 1GB, 2)

# Получаем версию операционной системы
$os = Get-WmiObject -Class Win32_OperatingSystem

# Получаем список установленных программ
$installedPrograms = Get-WmiObject -Class Win32_Product | Select-Object -Property Name, Version

# Выводим результаты
Write-Host "Производитель: $($computerSystem.Manufacturer)"
Write-Host "Модель компьютера: $($computerSystem.Model)"
Write-Host "Серийный номер: $($bios.SerialNumber)"
Write-Host "Объем памяти (ГБ): $memorySizeGB"
Write-Host "Объем диска (ГБ): $diskSizeGB"
Write-Host "Версия операционной системы: $($os.Caption) Версия: $($os.Version)"
Write-Host "Установленные программы:"

# Выводим список установленных программ
if ($installedPrograms) {
    foreach ($program in $installedPrograms) {
        Write-Host " - $($program.Name) (Версия: $($program.Version))"
    }
} else {
    Write-Host "Нет установленных программ."
}
Off-Topic:
это был тест одной нейросетки, первая строка моя отсебятина
Тетрис научил нас жизненно важному пониманию, успехи исчезают, ошибки накапливаются.