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

powershell

Как найти на серверах rds rdp ферме профили которые в статусе fslogix WaitingForWriteQueueFlush

На хостах терминальной фермы есть проблема что процесс fslogix держит cloud  profile

# Имя коллекции RDS, замените на своё
$collectionName = "Farm Fxlogixs"

# Получаем список серверов из коллекции (только имена)
$servers = Get-RDSessionHost -CollectionName $collectionName | Select-Object -ExpandProperty SessionHost

# Результаты
$result = @()

foreach ($server in $servers) {
    Write-Host "Подключаемся к серверу: $server" -ForegroundColor Cyan

    try {
        $disks = Invoke-Command -ComputerName $server -ScriptBlock {
            # Попытка получить диски FSLogix, которые ожидают записи
            Get-CloudCacheDisk
        } -ErrorAction Stop

        foreach ($disk in $disks) {
            if ($disk.State -eq "WaitingForWriteQueueFlush") {
                $result += [PSCustomObject]@{
                    Server      = $server
                    UserProfile = $disk.CachePath
                    State       = $disk.State
                
Читать далее

Как разблокировать (unblock) файл скаченный из сети на серверах в ad

Задача разблокировать файл на определённых сервера

# Импортируем модуль ActiveDirectory, если он не установлен
if (-not (Get-Module -ListAvailable -Name ActiveDirectory)) {
    Install-Module -Name ActiveDirectory -Force
}
Import-Module ActiveDirectory
 
# Фильтруем компьютеры, которые являются серверами (например, по имени или OU)
$servers = Get-ADComputer -Filter {name -like "*HWRDS*"} -Property Name | Select-Object -ExpandProperty Name
 
# Список файлов для разблокировки
$filesToUnlock = @("Zone.exe") # Добавьте здесь нужные вам файлы
 
function UnBlock-FilesOnRemoteServers {
    param (
        [string[]]$servers,
        [string[]]$files
    )
 
    foreach ($server in $servers) {
        Write-Host "Processing server: $server"
         
        # Убедимся, что сервер доступен
        if (Test-Connection -ComputerName $server -Count 1 -Quiet) {
            foreach ($file in $files) 
Читать далее

Как скопировать файл на компьютеры из группы

Задача скопировать файл на пк которые находиться в группе

# Параметры
$sourceFile = "C:\1\nethasp.ini"
$destinationFolder = "C:\Program Files\1cv8\conf"
$adGroupName = "ComputerGroup"

# Проверка исходного файла
if (-not (Test-Path $sourceFile)) {
    Write-Host "❌ Ошибка: файл $sourceFile не найден!" -ForegroundColor Red
    exit 1
}

# Получаем список компьютеров из группы AD
try {
    $computers = Get-ADGroupMember -Identity $adGroupName | 
                 Where-Object { $_.objectClass -eq 'computer' } | 
                 Select-Object -ExpandProperty Name
    
    if (-not $computers) {
        Write-Host "❌ В группе '$adGroupName' нет компьютеров!" -ForegroundColor Red
        exit 1
    }
    Write-Host "✅ Найдено компьютеров: $($computers.Count)" -ForegroundColor Green
} catch {
    Write-Host "❌ Ошибка при получении списка из 
Читать далее

Как найти программу и версию с помощью powershell

Надо проверить установленную версию fslogix на серверах rds

<#
.SYNOPSIS
    Скрипт для проверки версий указанных программ на серверах AD с фильтрацией по имени
.DESCRIPTION
    Ищет указанную программу в реестре удаленных серверов и возвращает информацию о версии
.PARAMETER NameFilter
    Фильтр имен серверов (например, "*hwrdsh*")
.PARAMETER SoftwareName
    Название программы для поиска (например, "Microsoft FSLogix Apps")
.EXAMPLE
    .\Get-SoftwareVersionOnServers.ps1 -NameFilter "*hwrdsh*" -SoftwareName "Microsoft FSLogix Apps"
#>

param (
    [string]$NameFilter = "*hwrdsh*",
    [string]$SoftwareName = "Microsoft FSLogix Apps"
)

# Импорт модуля ActiveDirectory
try {
    Import-Module ActiveDirectory -ErrorAction Stop
}
catch {
    Write-Host "Ошибка при импорте модуля ActiveDirectory: $_" -ForegroundColor Red
    exit 1
}

# Функция 
Читать далее

Как сбросить все сессии в статусе дисконект (disconnect) с фермы rds windows

Задача разлогинить всех пользователей с фермы rds у которых статус disconnect и определение активного брокера, логирование с очищением логов

# Функция для завершения RDP-сессии
function Invoke-RDPSessionLogoff {
    Param(
        [parameter(Mandatory=$True, Position=0)][String]$ComputerName,
        [parameter(Mandatory=$true, Position=1)][String]$SessionID
    )
    $ErrorActionPreference = "Stop"
    logoff $SessionID /server:$ComputerName /v 2>&1
}

# Функция для получения списка залогиненных пользователей
Function Get-LoggedOnUser {
    Param(
        [parameter(Mandatory=$True, Position=0)][String]$ComputerName="localhost"
    )
    $ErrorActionPreference = "Stop"
    Test-Connection $ComputerName -Count 1 | Out-Null
    quser /server:$ComputerName 2>&1 | Select-Object -Skip 1 | ForEach-Object {
        $CurrentLine = $_.Trim() -Replace "\s+"," " -Split "\s"
        $HashProps = @{
            UserName = $CurrentLine[0]
            ComputerName = $ComputerName
        }
        If ($CurrentLine[2] -eq "Disc") {
            $HashProps.SessionName = 
Читать далее

Как с помощью PowerShell посчитать сколько пользователей входит в группу где много вложенных групп

Задача посчитать общее количество пользователей находящийся в группе с множество вложений групп

Import-Module ActiveDirectory

$mainGroup = "G-Terminal"
$global:allResults = @() # Используем глобальную переменную
$groupCache = @{}

function Get-GroupInfo {
    param (
        [string]$groupName,
        [string]$parentGroup = "",
        [int]$level = 0
    )
    
    # Проверяем кэш
    if ($groupCache.ContainsKey($groupName)) {
        return $groupCache[$groupName]
    }

    try {
        $group = Get-ADGroup -Identity $groupName -Properties Member
        $members = @(Get-ADGroupMember -Identity $groupName -ErrorAction Stop)
        
        $userCount = 0
        $nestedGroups = @()
        $totalUsers = 0

        # Считаем пользователей и вложенные группы
        foreach ($member in $members) {
            if ($member.objectClass -eq 'user') {
                $userCount++
            }
            elseif ($member.objectClass -eq 'group') {
                $nestedGroups += $member
            
Читать далее

Как через powershell проверить есть ли файл на файловых шарах или нет

Задача есть файл который лежит в одном месте и надо проверить если ли файл на других сетевых шарах и сделать сводную таблицу

# Параметры скрипта
$sourceFolder = "D:\buffer"  # Корневая папка для поиска MP4 файлов
$share1 = "\\Msk-fs\sm_06$" # Первая шара
$share2 = "\\Msk-fs\sm_05$" # Вторая шара
$csvReport = "C:\temp\comparison1.csv" # CSV файл с результатами

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

# Получаем все MP4 файлы из исходной папки (рекурсивно)
$mp4Files = Get-ChildItem -Path $sourceFolder -Filter "*.mp4" -Recurse -File
$totalFiles = $mp4Files.Count
$processed = 0

# Обрабатываем каждый файл
foreach ($file in $mp4Files) {
    $processed++
    # Преобразуем 
Читать далее

Как узнать в exchange из Get-MessageTrackingLog емайл адреса ,извлечь емеил адреса из лога и проверить ящики включены и есть или переадресация.

Задача. есть почтовый домен. Надо избавиться от него и перенести адреса на другие почтовые сервера и сделать доверенный домен.
Сначала за 30 дней читаем логи. Распарсиваем их и забираем только event id send и recipients. Потом по ним проверяем есть ли ящик, включена переадресация и включена учетная запись или нет в ад.

# Подключение к Exchange PowerShell
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "http://MXS1.adminbd.ru/PowerShell/" -Authentication Kerberos
Import-PSSession $session


# Задаем период времени (30 дней назад до текущего момента)
$StartDate = (Get-Date).AddDays(-30)
$EndDate = Get-Date

# Получаем логи трекинга сообщений
$Logs = Get-MessageTrackingLog -Start $StartDate -End $EndDate -ResultSize Unlimited | 
    Select-Object 
Читать далее

Как настроить шифрование компьютеров на базе win 10 — 11 в Active Directory с помощью BitLocker , gpo и PowerShell c сохранением ключей

Задача включить шифрование с сохранением ключей в ad на Windows 10 и 11.

Сделал gpo bitlocker pc. Включил в gpo
Computer Configuration (Enabled) —  Policies -Administrative Templates
Windows Components/ BitLocker Drive Encryption

Windows Components/ BitLocker Drive Encryption/ Fixed Data Drives
Choose how BitLocker-protected fixed drives can be recovered Enabled

Enforce drive encryption type on fixed data drives

Windows Components/ BitLocker Drive Encryption/ Operating System Drives
Choose how BitLocker-protected operating system drives can be recovered

 

Configure use of hardware-based encryption for operating system drives

 

 

Enforce drive encryption type on operating system drives

 

 

Require additional authentication at … Читать далее

Как делегировать права для группы на ou для создание пользователей через powershell.

Задача предоставить права для группы на ou для создание учетных записей пользователей

# Импортируем модуль Active Directory
Import-Module ActiveDirectory

# Определяем путь к OU
$ouPath = "AD:\OU=User Create ,OU=Users,OU=Locations,OU=Locations,DC=adminbd,DC=ru"

# Получаем текущий ACL для OU
$acl = Get-Acl $ouPath

# Указываем имя группы или пользователя
$groupName = "G-Create User"
$groupSID = (Get-ADGroup -Identity $groupName).SID

# Преобразуем SID в формат DOMAIN\AccountName
$identityReference = $groupSID.Translate([System.Security.Principal.NTAccount])

# Создаем ACE для прав ReadProperty, WriteProperty, ReadControl, WriteDacl
$ace1 = New-Object System.DirectoryServices.ActiveDirectoryAccessRule(
    $groupSID,
    [System.DirectoryServices.ActiveDirectoryRights] "ReadProperty, WriteProperty, ReadControl, WriteDacl",
    [System.Security.AccessControl.AccessControlType] "Allow",
    [Guid]::Empty,
    [System.DirectoryServices.ActiveDirectorySecurityInheritance] "All"
)

# Создаем ACE для CreateChild, DeleteChild (для объектов типа User)
$ace2 = 
Читать далее
Яндекс.Метрика