четверг, 26 мая 2016 г.

Удалённое управление сессией пользователя стандартными средствами Microsoft Windows (Remote Desktop Shadowing)

Начиная с Windows 8.1/2012 R2 была возвращена функция Remote Desktop Shadowing - теневой сеанс, который позволяет подключаться и управлять сессией пользователя на удалённом компьютере, в том числе незаметно. Установить подключение можно с помощью утилиты "mstsc" со следующими параметрами:

/shadow:ID – подключиться к терминальной сессии с указанным номером ID;
/v:servername – имя удалённого сервера, если не указывать, используется localhost;
/prompt – если не указать, используется текущий пользователь;
/control – возможность взаимодействия с сеансом пользователя (если не указано, используется режим просмотра сессии пользователя);
/noConsentPrompt – не запрашивать у пользователя подтверждение на подключение к сессии.

Чтобы определить нужный ID, воспользуйтесь следующим запросом:
query session /server:servername
Будет выведен список соответствия пользователей и их идентификаторов сеанса.

Кроме того необходимо выполнить следующие предварительные настройки:
1. Пользователь, который подключается с помощью теневого сеанса, должен быть администратором на удалённой машине.
2. Включите удалённый рабочий стол в "Свойства системы"->"Удалённый доступ".


3. Установите параметр реестра в одно из следующих возможных значений:

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services]
«Shadow»=dword:0000000X

где X означает:
0 - удаленное управление не разрешено;
1 - полный контроль с разрешения клиента;
2 - полный контроль без разрешения клиента;
3 - наблюдение за сеансом с разрешения клиента;
4 - наблюдение за сеансом без разрешения клиента.

По умолчанию параметр "Shadow" отсутствует, но при этом предоставляется полный контроль с разрешения клиента.

Аналогичные настройки можно сделать и с помощью локальной групповой политики: "Конфигурация компьютера-Административные шаблоны-Компоненты Windows-Службы удалённых рабочих столов-Узел сеансов удалённых рабочих столов-Подключения-Устанавливает правила удалённого управления для пользовательских служб удалённых рабочих столов".

Некоторые заготовки командных файлов, приведённые ниже, позволят с удобством пользоваться теневыми сеансами в корпоративной среде:

1. Данный скрипт запрашивает название удалённого компьютера, затем имя пользователя, к сеансу которого мы будем подключаться:

@echo off
set /P rcomp="Input name or IP of remote pc: "
set /P ruser="Input name of remote user: "
for /f "tokens=3 delims= " %%G in ('query session %ruser% /server:%rcomp%') do set rid=%%G
start mstsc /shadow:%rid% /v:%rcomp% /control

2. Скрипт аналогичен первому, только вместо запроса сеанса подключение производится к консольной сессии:

@echo off
set /P rcomp="Input name or IP of remote pc: "
for /f "tokens=3 delims= " %%G in ('query session console /server:%rcomp%') do set rid=%%G
start mstsc /shadow:%rid% /v:%rcomp% /control

3. В этом варианте пользователю будет показан список всех сеансов на удалённом компьютере и предложено выбрать к какому нужно подключиться:

@echo off
set /P rcomp="Input name or IP of remote pc: "
query session /server:%rcomp%
set /P rid="Choose ID of remote user: "
start mstsc /shadow:%rid% /v:%rcomp% /control

4. Данный алгоритм несколько сложнее предыдущих: он через WMI определяет версию ОС на удалённом компьютере, и в зависимости от этого, запускает теневое подключение или удалённый помощник. Кроме того, скрипт делает правку в реестре, чтобы выполнить подключение к пользователю незаметно:

@echo off
set /P rcomp="Input name or IP of remote pc: "
for /f "tokens=1 delims=." %%V in ('wmic /node:'%rcomp%' os get version') do (
if '%%V'=='5' set rver=5
if '%%V'=='6' set rver=6
if '%%V'=='10' set rver=10
)
for /f "tokens=3 delims= " %%G in ('query session console /server:%rcomp%') do set rid=%%G
if '%rver%'=='10' (
reg add "\\%rcomp%\HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v Shadow /t REG_DWORD /d 2 /f
start mstsc /shadow:%rid% /v:%rcomp% /control /noConsentPrompt
timeout 5 > NUL
reg delete "\\%rcomp%\HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v Shadow /f
) else (
start msra /offerRA %rcomp%
)

вторник, 24 мая 2016 г.

PowerShell: скрипт для автоматизации отклонения заменяемых обновлений (Superseded Updates) на сервере WSUS

Данный скрипт поможет автоматически отклонять заменяемые обновления (так называемые "Superseded Updates") на сервере WSUS, которые потеряли свою актуальность и перекрываются новыми версиями патчей.

$WsusServer = "wsus.mycompany.corp"
$UseSSL = $false
$PortNumber = 80
$TrialRun = $false

#E-mail Configuration
$SMTPServer = "smtp.mycompany.corp"
$FromAddress = "WSUS@mycompany.corp"
[string[]] $Recipients = "admin1@mycompany.corp", "admin2@mycompany.corp", "admin3@mycompany.corp"
$MessageSubject = "WSUS :: Declining Superseded Updates"

Function SendEmailStatus($MessageSubject, $MessageBody)
{
$SMTPMessage = New-Object System.Net.Mail.MailMessage
$SMTPMessage.from = $FromAddress
foreach($recipient in $Recipients)
{
$SMTPMessage.to.Add($recipient)
}
$SMTPMessage.Subject = $MessageSubject
$SMTPMessage.Body = $MessageBody
$SMTPMessage.IsBodyHTML = $true
#Send the message via the local SMTP Server
$SMTPClient = New-Object System.Net.Mail.SMTPClient $SMTPServer
$SMTPClient.Send($SMTPMessage)
$SMTPMessage.Dispose()
rv SMTPClient
rv SMTPMessage
}

#Connect to the WSUS 3.0 interface.
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null
$WsusServerAdminProxy = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer($WsusServer,$UseSSL,$PortNumber);
$superseded = $WsusServerAdminProxy.SearchUpdates('kb') | ?{-not $_.IsDeclined -and $_.IsSuperseded}
If ($TrialRun)
{$MessageSubject += " Trial Run"}
Else
{$superseded | %{$_.Decline()}}
If ($superseded.Count -gt 0)
{
$MessageBody = $superseded | Select `
@{Name="Title";Expression={[string]$_.Title}},`
@{Name="KB Article";Expression={[string]::join(' | ',$_.KnowledgebaseArticles)}},`
@{Name="Classification";Expression={[string]$_.UpdateClassificationTitle}},`
@{Name="Product Title";Expression={[string]::join(' | ',$_.ProductTitles)}},`
@{Name="Product Family";Expression={[string]::join(' | ',$_.ProductFamilyTitles)}},`
@{Name="Uninstallation Supported";Expression={[string]$_.UninstallationBehavior.IsSupported}} | ConvertTo-HTML
SendEmailStatus $MessageSubject $MessageBody
}
Else
{
SendEmailStatus $MessageSubject "No superseded updates for declining"
}

Перед началом использования необходимо установить константы в соответствии с вашей инфраструктурой. А конкретнее это: имя сервера, порт, флаг использования протокола SSL, флаг использования пробного режима, имя SMTP сервера для отправки отчёта, адреса отправителя и получателей, тема письма.