четверг, 24 июня 2010 г.

Снова борьба с пользователями

Однажды я уже писал о том, как можно упростить себе жизнь при общении с пользователями. Допустим, звонит вам пользователь и жалуется на некую проблему. Нужно подключиться к нему, используя тот или иной софт, дабы посмотреть на его рабочий стол. Однако вопрос об имени его компьютера во многих случаях ставит его в тупик. Программа bginfo, вполне может помочь, на мой взгляд. Однако есть необходимость проинсталлировать ее на большое количество компьютеров. Конечно, можно воспользоваться глобальными политиками. Однако это не всегда срабатывает. Что самое неприятное – это проблема отследить, где оно стало а где нет. Кроме того использование скриптов в глобальных политиках ограничено на медленных каналах связи. При скорости канала меньше некоего порогового значения они просто не применяются. Так задумано. В общем, для установки такого рода небольшого софта я предпочитаю использовать скрипты. Проще отследить и понять, где оно стало а где нет. Для этой конкретной программки я написал вот такой вот простой скриптик с некоторой избыточностью:

$ErrorActionPreference = "SilentlyContinue"
$bginfoImage = 'C:\Tools\Bginfo.exe'
$bginfoConfig = 'C:\Tools\config.bgi'


function Ping-Address {
PROCESS {
$ping = $false
$name = $_.name
Write-Host "PINGING $name" -NoNewline
if (Test-Connection -ComputerName $name -Count 1 -ErrorAction SilentlyContinue) {
Write-Host " PING OK" -ForegroundColor Green -NoNewline
return $_}
else
{Write-Host " PING FAILED" -ForegroundColor Red}
}
}

function getWindowsDirectory ($computername){
gwmi win32_operatingsystem -Property windowsdirectory -ComputerName $computername | Select-Object windowsdirectory}

function copyFiles ($source, $destination){
Write-Host ' COPIYNG FILES' -ForegroundColor Blue
Copy-Item $source -Destination $destination}

function writeRegistryValues ($computername){
Write-Host ' WRITING REGISTRY VALUES' -ForegroundColor Blue
$ret = getWindowsDirectory $computername
$windir = $ret.windowsdirectory
$key = "SOFTWARE\Microsoft\Windows\CurrentVersion\run"
$type = [Microsoft.Win32.RegistryHive]::LocalMachine
$regKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($type, $computername)
$regKey = $regKey.OpenSubKey($key,$TRUE)
$regKey.SetValue('bginfo',"bginfo $windir\config.bgi /nolicprompt /timer:0",[Microsoft.Win32.RegistryValueKind]::String)
$regKey.Close()
}

function testBginfo ($computername){
$reg = $false
$path = $false
$file1 = "\\$computername\admin$\bginfo.exe"
$file2 = "\\$computername\admin$\config.bgi"
$path = Test-Path $file1, $file2

$key = "SOFTWARE\Microsoft\Windows\CurrentVersion\run"
$type = [Microsoft.Win32.RegistryHive]::LocalMachine
$regKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($type, $computername)
trap {
Write-Host " $_" -ForegroundColor Red
return $true
}
$regKey = $regKey.OpenSubKey($key)
foreach ($name in $regKey.GetValueNames()) {
if ($name -eq 'bginfo') {$reg = $reg -or $true}
else {$reg = $reg -or $false}
}
$regKey.Close()
$reg = $reg -and $path
if ($reg) {
write-host ' BGINFO ALREADY INSTALLED' -ForegroundColor Gray
return $true}
else {
write-host ' BGINFO NOT INSTALLED' -ForegroundColor Blue
return $false}
}


function installBgInfo () {
PROCESS{
$name = $_.name
if ((testBginfo $name) -eq $false){
Write-Host "INSTALLING BGINFO TO $name"
copyFiles $bginfoImage,$bginfoConfig "\\$name\admin$"
writeRegistryValues $name}
}
}


cls
$Srv=Get-QADcomputer -Name "*" | Select-Object name
$Srv | Ping-Address | installBgInfo


Собственно говоря – ничего сложного. По-умолчанию скрипт выбирает из AD список компьютеров. Затем проверяет их доступность при помощи ping. Потом копирует файлы самой программы bginfo и ее конфигурационного файла в папку \\сервер\admin$. Файл конфигурации нужно предварительно создать при помощи самой программы bginfo, выбрав те параметры, которые она должна отображать. И на конец, пишет нужные ключики в реестр, чтобы заставить приложение запускаться при старте системы. Еще одним положительным моментом при этом является то, что даже если удаленный компьютер в последствии отвалится от сетки в которой, допустим, есть DHCP, программа все равно запустится и по указанному ей адресу из APIPA диапазона вы это быстро определите. В строке



$Srv=Get-QADcomputer -Name "*" | Select-Object name

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

Отправить комментарий