8 июл. 2010 г.

Анализ логов печати

dumpel.exe -s krnd-store -l system -m print -format dts -e 10 -d 30 -t -f printlog.txt


 Dumpel.exe берём из Windows 2000 Resource Kit Tools

© Спёрто, откуда - не помню

Скриншот силами PowerShell

Создание скриншота средствами PoweShell

Оригинал спёрт отсюда


[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$size = [Windows.Forms.SystemInformation]::VirtualScree
$bitmap = new-object Drawing.Bitmap $size.width, $size.height
$graphics = [Drawing.Graphics]::FromImage($bitmap)
$graphics.CopyFromScreen($size.location,[Drawing.Point]::Empty, $size.size)
$graphics.Dispose()
$bitmap.Save(".\screenshot.jpg")
$bitmap.Dispose()



Или (спёрто отсюда):

    Add-Type -Assembly System.Windows.Forms
    Sleep 10

    ## Capture the entire screen
    [System.Windows.Forms.Sendkeys]::SendWait("{PrtSc}")

    ## Capture the current window
    [System.Windows.Forms.Sendkeys]::SendWait("%{PrtSc}")

В продолжении разборок со WSUS

Проблема. В результате выполнения скрипта, который ищет компьютеры, не обновляющиеся со WSUS'a нашлись 2 компьютера. При выполнении на обоих wuauclt.exe /resetauthorization /detectnow
Если появлялся один - исчезал другой и наоборот. В логах ничего странного не заметил. В итоге помог скрипт от shs за что ему огромное спасибо!

Привожу его на всякий случай и здесь:

############################################################################
#  WSUSClientRemoteReset.ps1 PowerShell shs 20100218
#
#  Скрипт, дистаннционно выполняющий действия, описанные в kb903262, над  компьютерами, согласно заданного списка
#  Список компьютеров, который скрипт загружает из файла .\NoWSUS.txt, может быть сформирован при помощи скрипта WSUSAD-Compare.ps1,
#  и представляет из себя список FQDN-имен компьютеров (одна строка - одно имя)
############################################################################
cls
############################################################################
### Объявляем вспомогательные функции
############################################################################
#
#Функция возращает true, если заданный хост пингуется и false  - в противном случае (спасибо Xaerg'у)
function Test-Host ($Name)
{
    $ping = new-object System.Net.NetworkInformation.Ping
    trap {Write-Verbose "Ошибка пинга"; $False; continue}
    if ($ping.send($Name).Status -eq "Success" ) { $True }
    else { $False }
}
############################################################################
#
# Начало скрипта
#
############################################################################
### Загружаем в переменную список компьютеров из файла .\NoWSUS.txt,
### попутно получая короткое имя компьютера из его FQDN###
$noInWSUS = gc .\NoWSUS.txt| foreach{($_ -replace " ") -replace "\..+$"}
#Обработаем полученный список
$noInWSUS| where{Test-Host $_}|foreach{`
    $CompName = $_
    Write-Host "`n`n$CompName"
    #Подлкючаемся к службе Автоматического обновления (wuauserv) (далее по тексту - служба) на удаленной машине
    ###см. http://thepowershellguy.com/blogs/posh/archive/2007/01/03/powershell-using-net-to-manage-remote-services.aspx
    [System.Reflection.Assembly]::LoadWithPartialName('system.serviceprocess')
    $wuauserv=new-Object System.ServiceProcess.ServiceController('wuauserv',$CompName)
    #Инициализация флага успешной остановки службы
    $Stopped=$true
    #Если служба не остановлена, то остановливаем ее
    if ($wuauserv.Status -ne "Stopped") {
        try {
            #Останавливаем службу
            $wuauserv.Stop()
            #Ожидаем остановки службы в течении заданного таймаута
            $wuauserv.WaitForStatus('Stopped',(new-timespan -seconds 10))
        }
        catch {
            # если в течение отведенного таймаута служба не остановилась, то сообщим об этом...
            "На $CompName службу wuauserv остановить не удалось...`n"
            # ...и установим флаг успешной остановки службы в состояние $false
            $Stopped=$false
        }
    }
    # если служба была успешно остановлена, то
    # выполняем действия, указанные в kb903262
    if ($Stopped) {
        #
        #Удаляем ключи реестра, согласно http://support.microsoft.com/kb/903262
        ###О том, как работать с реестром на удаленной машине, читаем здесь:
        ###http://thepowershellguy.com/blogs/posh/archive/2007/06/20/remote-registry-access-and-creating-new-registry-values-with-powershell.aspx
        $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $CompName)
        $regKey= $reg.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate",$true)
        $regKey.DeleteValue("SusClientId")
        $regKey.DeleteValue("SusClientIdValidation")
        $regKey.DeleteValue("PingID")
        $regKey.DeleteValue("AccountDomainSid")
        #Инициализация флага успешного запуска службы Автоматического обновления (wuauserv)
        $Started=$true
        #
        try {
            #Запускаем службу Автообновления
            $wuauserv.Start()
            #Ожидаем запуска службы в течении заданного таймаута
            $wuauserv.WaitForStatus('Running',(new-timespan -seconds 10))
        }
        catch {
            # если в течение отведенного таймаута служба не стартовала, то сообщим об этом...
            "На $CompName службу wuauserv запустить не удалось...`n"
            # ...и установим флаг успешного запуска службы в состояние $false
            $Started=$false
        }
        # если служба Автоматического обновления была успешно запущенна, то
        # выполняем действия, указанные в kb903262
        if ($Started) {
            #Ждем 5 секунд
            Start-Sleep -Seconds 5
            #принудительное применение политики (на всякий случай, лучше перебдеть)
            "Запускаем принудительное обновление политики..."
            $RemoteProcess=([wmiclass]"\\$CompName\root\cimv2:Win32_Process").create("cmd /c gpupdate /force")
            "...код возврата запуска - $($RemoteProcess.ReturnValue), ID запущеного процесса - $($RemoteProcess.ProcessId)`n"
            #Ждем 30 секунд
            Start-Sleep -Seconds 30
            "Выполняем wuauclt /resetauthorization /detectnow"
            #выполняем wuauclt /resetauthorization /detectnow, согласно http://support.microsoft.com/kb/903262
            $RemoteProcess=([wmiclass]"\\$CompName\root\cimv2:Win32_Process").create("cmd /c wuauclt /resetauthorization /detectnow")
            "...код возврата запуска - $($RemoteProcess.ReturnValue), ID запущеного процесса - $($RemoteProcess.ProcessId)`n"
        }
    }
}

Скрипт проверки бекапов

Есть такая чудо бухгалтерская программа, как Испро.
И вот у неё очень своеобразная система бекапов.
Для успешного бекапа (по крайней мере в версии 7.07.017.999 RU) нужны следующие условия:

а) Залогиненный пользователь (желательная служебная учётка, особенно если у вас ИТ отдел из нескольких человек)
б) Открытая программа испро
в) И (по крайней мере в текущей версии это важно) программа перезапускалась после последнего ручного бекапа

Как видно, всё может поломаться не только из-за каких-то внешних факторов (отключение электричества), но и из-за элементарной невнимательности.

Чтобы с этим бороться я написал скриптик.
Василию Гусеву огромное спасибо :)

#Скрипт мониторит папку с бекапами Испро, проверяя наличие файла за сегодняшний день
#Не забывайте, что для успешного бекапа средствами Испро должен быть:
#а) залогинен krnd-cmdman
#б) открыта программа Испро
#в) программа перезапускалась после последнего ручного бекапа
cls
cd C:\BackBases\BackISPRO
$IsproDir = "C:\BackBases\BackISPRO"
$IsproBackup = dir $IsproDir | where {$_.lastwritetime.date -eq (get-date).date}
$IsproSize = Get-ChildItem $IsproBackup | ForEach-Object { echo ($_.Length/1MB).tostring("0.00")MB}
$IsproFileDate = Get-ChildItem $IsproBackup | ForEach-Object { echo ($_.LastWritetime)} | Get-Date -f d

If ($IsproBackup)
#Когда уведомления запарят - следующий блок можно будет заменить на {exit}
{Send-MailMessage -from "sm@mail.ru" -To "postmaster@mail.ru" -Subject "Backup Ispro is GOOD" -Body "Backup is fine.
FileName is $IsproBackup
FileSize is $IsproSize
FileDate is $IsproFileDate" -SmtpServer krnd-mailout}

else
{Send-MailMessage -from "sm@mail.ru" -To "postmaster@mail.ru" -Subject "Backup Ispro FAILED" -Body "Backup of ISPRO was not succesfull!! Please check it!" -SmtpServer krnd-mailout}
exit