Перейти к содержимому

powershell

Как найти включённого локального администратора на серверах в AD.

Задача провести аудит и убедиться что локальный администратор выключен на серверах.

# Получить список всех серверов в AD
$computers = Get-ADComputer -Filter {OperatingSystem -like "Windows Server*"} -Properties Name
 
# Определить имя пользователя, который будет использоваться для выполнения удаленных команд
$credential = Get-Credential
 
# Создать массив для хранения результатов
$results = @()
 
# Пройти по списку серверов и выполнить команду на каждом из них
foreach ($computer in $computers) {
    $computerName = $computer.Name
 
    # Проверить доступность сервера
    if (Test-Connection -ComputerName $computerName -Count 1 -Quiet) {
        $session = New-PSSession -ComputerName $computerName -Credential $credential
 
        # Искать учетную запись локального администратора
        $localAdmin = Invoke-Command -Session 
Читать далее

Как найти где в AD на серверах включен smbv1 и smbv2

Задача найти где включен smb старый протокол 1 и 2 на серверах в сети

https://techcommunity.microsoft.com/t5/storage-at-microsoft/configure-smb-signing-with-confidence/ba-p/2418102

https://learn.microsoft.com/en-US/windows-server/storage/file-server/troubleshoot/detect-enable-and-disable-smbv1-v2-v3?tabs=server

# Получение списка серверов
$serverList = Get-ADComputer -Filter {OperatingSystem -like "Windows Server*"} | Select-Object -ExpandProperty Name

# Создание массива для результатов
$results = @()

# Проход по каждому серверу
foreach ($server in $serverList) {
    $serverStatus = Test-Connection -ComputerName $server -Count 1 -Quiet

    if ($serverStatus) {
        $smbStatus = Invoke-Command -ComputerName $server -ScriptBlock {
            Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol
        }

        # Добавление результатов в массив
        $results += [PSCustomObject]@{
            ServerName = $server
            IsOnline = $true
            SMBv1Enabled = $smbStatus.EnableSMB1Protocol
            SMBv2Enabled = $smbStatus.EnableSMB2Protocol
        }
    }
    else {
        # Если 
Читать далее

Как обновить сертификат ssl hp ilo через PowerShell и Windows CA

Задача. У сертификатов подошел к концу срок действия. Надо массово обновить сертификаты на hp ilo .

  1. Просканировать под сеть. Составить список ilo hp
  2. Определить у кого закончился срок действия
  3. Перевыпустить сертификат в Windows CA
  4. Импортировать в hp ilo

Написал скрипт.

$minCertAge = 80
$timeoutMs = 10000
$ilo = Find-HPiLO 172.16.35.0-255 | Select-Object HOSTNAME # Ищет hp ilo
$sites = $ilo.HOSTNAME

# Отключить проверку корректности сертификата
[Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

# Создаем массив для хранения сайтов с отрицательным $certExpiresIn
$sitesWithNegativeCertExpires = @()

foreach ($site in $sites)
{
    $fullSiteUrl = "https://$site"  # Добавляем префикс "https://"
    
    Write-Host "Проверка $fullSiteUrl" -f Green
    $req = [Net.HttpWebRequest]::Create($fullSiteUrl)
    
Читать далее

Как синхронизировать папку с помощью PowerShell с фильтром по AD и запустить синхронизацию одновременно со всеми серверами.

Задача синхронизировать одну папку со множеством сервером. Делается это для распространения базы Касперского на удалённые площадки.

function Write-Log {
    param (
        [string]$Message
    )

    # Получение текущей даты и времени
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    
    # Форматирование сообщения в формате "дата время: сообщение"
    $logMessage = "{0}: {1}" -f $timestamp, $Message
    
    # Запись сообщения в лог-файл
    $logMessage | Out-File -FilePath "D:\Programs\replica_kasper\Log.txt" -Append
}

# Установите модуль PSParallel, если у вас его нет
if (-not (Get-Module -Name PSParallel -ListAvailable)) {
    Install-Module PSParallel -Scope CurrentUser
}

# Загрузите модуль PSParallel
Import-Module PSParallel

# Получение списка серверов из AD
$servers = Get-ADComputer -Filter {OperatingSystem 
Читать далее

Как удалить из папки файлы с серверов ad им перезапустить службу.

Задача удалить старые сертификаты из папки после этого перезапустить службу.

# Загрузка модуля ActiveDirectory
Import-Module ActiveDirectory

# Получение списка серверов из AD
$servers = Get-ADComputer -Filter {OperatingSystem -like "*Server*"} | Select-Object -ExpandProperty Name

# Путь к папке, из которой нужно удалить файлы
$folderPath = "C$\ProgramData\VMware\Log Insight Agent\cert"



# Проход по каждому серверу
foreach ($server in $servers) {
    $serverPath = "\\$server\$folderPath"
    
    # Проверка существования папки на сервере
    if (Test-Path $serverPath) {
        # Удаление файлов
        Get-ChildItem -Path $serverPath | Remove-Item -Force
        
        # Перезапуск службы LogInsightAgentService
        Get-Service -Name LogInsightAgentService -ComputerName $server  | Restart-Service -Force
        
        # Перезапуск службы LogInsightAgentUpdaterService
       Get-Service -Name LogInsightAgentUpdaterService   -ComputerName $server  
Читать далее

Как мониторить dfs replication.

Задача получать на почту письмо с ошибками репликации dfs replication

Скрипт https://thesurlyadmin.com/2012/08/03/dfs-replication-monitoring/ дописал что отправка была на почту

<# 
.SYNOPSIS
    Monitor your DFS Replication Backlog with a graphical history.
.DESCRIPTION
    Use the DFSMonitorWithHistory.ps1 script to monitor your DFS backlog.  It
    contains a graphical history chart as well as detailed information from
    each run.  I recommend running from a scheduled task every hour to get the
    best information.
    
    Make sure to edit the PARAM section and update it for your environment.
    
    Graphical history chart is a Google visualization that requires Flash to run 
    (it's the same chart you see on Google 
Читать далее

Как сделать скрипт для Удаление не активных ПК более 60 дней

Скрипт удаляет не активные ПК более 60

<# .SYNOPSIS
    Удаление не активных ПК более 60
.DESCRIPTION
    Скрипт удаляет не активные ПК более 60
#>
#╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗#
$Host.UI.RawUI.WindowTitle = "Удаление не активных ПК более 60"
#╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝#
Import-Module ActiveDirectory
[system.gc]::Collect()
$ErrorActionPreference="Continue"
#------ Logging section ------#
$fileLocation = (gi $MyInvocation.InvocationName) | ForEach-Object {
    $fileDirectory = "$($_.DirectoryName)\$($_.BaseName)";
    "$fileDirectory\$($_.BaseName)_$('{0:yyyy-MM-dd}'-f(date))";
    if (!(Test-Path "$fileDirectory")) {
        ni "$fileDirectory" -ItemType "directory" | Out-Null
    }
}
#------ Variables ------#
$Result = @()
$OrgUnit = "OU=Locations,DC=adminbd.ru,DC=ru"
$td1 = (Get-Date).adddays(-60) # Шаг 7 дней
$td1=$td1.ToFileTime()
 
#------ Workspace ------#
 
#Get-ADComputer -SearchBase $OrgUnit -Filter {lastLogonTimeStamp -le $td1 -and Enabled -eq "True"} -Properties 'lastLogonTimeStamp','Name'| Select-Object 'Name',@{n='lastLogonTimeStamp';e={[DateTime]::FromFileTime($_.lastLogonTimeStamp)}} 
Читать далее

Как Убрать переключатель PasswordNeverExpired

Скрипт работает по OU=External, убирает переключатель “пароль не когда не истекает”, меняет дату создания пароля на текушую.

<# .SYNOPSIS
    Убрать переключатель PasswordNeverExpired
.DESCRIPTION
    Скрипт работает по OU=External, убирает переключатель "пароль не когда не истекает", меняет дату создания пароля на текушую.
#>
#╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗#
$Host.UI.RawUI.WindowTitle = "Убрать переключатель PasswordNeverExpired"
#╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝#
[system.gc]::Collect()
Import-Module ActiveDirectory
 
#------ Logging section ------#
 
$fileLocation = (gi $MyInvocation.InvocationName) | ForEach-Object {
    $fileDirectory = "$($_.DirectoryName)\$($_.BaseName)";
    "$fileDirectory\$($_.BaseName)_$('{0:yyyy-MM-dd}'-f(date))";
    if (!(Test-Path "$fileDirectory")) {
        ni "$fileDirectory" -ItemType "directory" | Out-Null
    }
}
 
#------ Variables ------#
$UserAD = ''
$Result = @()
$tAD = 'pwdLastSet','PasswordNeverExpires','SamAccountName','CanonicalName'
$OrgUnit = "OU=External,OU=Locations,DC=adminbd.ru,DC=ru"
$UserAD = Get-ADUser -SearchBase $OrgUnit -Filter {PasswordNeverExpires 
Читать далее

Как сделать скрипт для отключения учетных записей пользователей с просроченными паролями.

Отключение учетных записей пользователей с просроченными паролями (пароль не менялся более 100 дней).

<# .SYNOPSIS
    Отключение учетных записей пользователей с просроченными паролями
.DESCRIPTION
    Отключение учетных записей пользователей с просроченными паролями (пароль не менялся более 100 дней).
#>
#╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗#
$Host.UI.RawUI.WindowTitle = "Отключение учетных записей пользователей с просроченными паролями"
#╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝#
[system.gc]::Collect()
#------ Logging section ------#
$fileLocation = (gi $MyInvocation.InvocationName) | ForEach-Object {
    $fileDirectory = "$($_.DirectoryName)\$($_.BaseName)";
    "$fileDirectory\$($_.BaseName)_$('{0:yyyy-MM-dd}'-f(date))";
    if (!(Test-Path "$fileDirectory")) {
        ni "$fileDirectory" -ItemType "directory" | Out-Null
    }
}
$Domain     = "adminbd.ru.ru"
$Sender     = "helpdesk@adminbd.ru.ru"
$smtpserver = "mail.adminbd.ru.ru"
#------ Variables ------#
Import-Module ActiveDirectory
$tAD = 'pwdLastSet','Name','whenCreated','PasswordNeverExpires','PasswordExpired','SamAccountName','mail','lastLogonTimestamp','DistinguishedName','Description','CanonicalName','extensionAttribute15'
$tAD2 = 'whenCreated','Name','SamAccountName','mail',@{n='pwdLastSet';e={[DateTime]::FromFileTime($_.pwdLastSet)}},'PasswordNeverExpires','PasswordExpired',@{n='lastLogonTimestamp';e={[DateTime]::FromFileTime($_.lastLogonTimestamp)}},'DistinguishedName','Description','CanonicalName','extensionAttribute15'
$OrgUnit = "OU=Locations,DC=adminbd.ru,DC=ru"
$ExceptinOU 
Читать далее

Как удалить файлы с длинным путем The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.

function Remove-PathToLongDirectory
{
    Param(
        [string]$directory
    )
 
    # create a temporary (empty) directory
    $parent = [System.IO.Path]::GetTempPath()
    [string] $name = [System.Guid]::NewGuid()
    $tempDirectory = New-Item -ItemType Directory -Path (Join-Path $parent $name)
 
    robocopy /MIR $tempDirectory.FullName $directory | out-null
    Remove-Item $directory -Force | out-null
    Remove-Item $tempDirectory -Force | out-null
}

Remove-PathToLongDirectory "T:\Закрытые проекты"