none
Нужен powershell скрипт по починке VSS Writers. RRS feed

  • Вопрос

  • Добрый Вечер коллеги.

    Есть задача, нужно максимально автоматизировать процесс починки vss writers.

    А именно скрипт, который будет сканировать на сервере все vss writers, затем находить среди них поломанный , т.е. со статусом faild, затем поломанные writers  нужно с ассоциировать с службами  и рестартонуть эти службы.

    Та же хотелось бы что бы скрипт мог работать с удаленными серверами (по списку или строке ввода) и выводил отчет о проделанной работе.

    Заранее спасибо


    • Изменено Sastashi 21 сентября 2014 г. 15:01
    21 сентября 2014 г. 15:01

Ответы

  • 1) Взять скрипт - Powershell Script/Function to get VSS Writers information on many computers

    2) Собрать все writers и в гугле легко найти службы от них зависящие

    param($ComputerName)
    
    Start-Transcript -Path "C:\Log\$ComputerName"
    
    $writers = @{
    	'ASR Writer' = 'VSS' 
    	'BITS Writer' = 'BITS'
    	'COM+ REGDB Writer' = 'VSS'
    	'DFS Replication service writer' = 'DFSR'
    	'DHCP Jet Writer' = 'DHCPServer' 
    	'FRS Writer' = 'NtFrs' 
    	'FSRM writer' = 'srmsvc' 
    	'IIS Config Writer' = 'AppHostSvc'
    	'IIS Metabase Writer' = 'IISADMIN'
    	'Microsoft Exchange Writer' = 'MSExchangeIS'
    	'Microsoft Hyper-V VSS Writer' = 'vmms' 
    	'NTDS' = 'NTDS'
    	'OSearch VSS Writer' = 'OSearch'
    	'OSearch14 VSS Writer' = 'OSearch14' 
    	'Registry Writer' = 'VSS'
    	'Shadow Copy Optimization Writer' = 'VSS'
    	'SPSearch VSS Writer' = 'SPSearch'
    	'SPSearch4 VSS Writer' = 'SPSearch4' 
    	'SqlServerWriter' = 'SQLWriter' 
    	'System Writer' = 'CryptSvc'
    	'TermServLicensing' = 'TermServLicensing' 
    	'WINS Jet Writer' = 'WINS' 
    	'WMI Writer' = 'Winmgmt' 
    }
    
    function Get-VssWriters {
        [CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact='Low')] 
        Param(
            [Parameter(Mandatory=$false,
                       ValueFromPipeLine=$true,
                       ValueFromPipeLineByPropertyName=$true,
                       Position=0)]
                [ValidateNotNullorEmpty()]
                [String[]]$ComputerName = $env:COMPUTERNAME
        )
        
        $Writers = @()
        $k = 0
        foreach ($Computer in $ComputerName) {
            try {
                Write-Verbose "Getting VssWriter information from computer $Computer"
                $k++
                $Progress = "{0:N0}" -f ($k*100/$ComputerName.count)
                Write-Progress -Activity "Processing computer $Computer ... $k out of $($ComputerName.count) computers" `
                    -PercentComplete $Progress -Status "Please wait" -CurrentOperation "$Progress% complete"
    
                $RawWriters = Invoke-Command -ComputerName $Computer -ErrorAction Stop -ScriptBlock { 
                    return (VssAdmin List Writers)
                } 
    
                for ($i=0; $i -lt ($RawWriters.Count-3)/6; $i++) {
                    $Writer = New-Object -TypeName psobject
                    $Writer| Add-Member "ComputerName" $Computer
                    $Writer| Add-Member "WriterName" $RawWriters[($i*6)+3].Split("'")[1]
                    $Writer| Add-Member "StateID" $RawWriters[($i*6)+6].SubString(11,1)
                    $Writer| Add-Member "StateDesc" $RawWriters[($i*6)+6].SubString(14,$RawWriters[($i*6)+6].Length - 14)
                    $Writer| Add-Member "LastError" $RawWriters[($i*6)+7].SubString(15,$RawWriters[($i*6)+7].Length - 15)
                    $Writers += $Writer 
                }
    
                Write-Debug "Done"
            } catch {
                Write-Warning "Computer $Computer is offline, does not exist, or cannot be contacted"
            }
        }
        return $Writers
    }
    
    Get-VssWriters -ComputerName $ComputerName | Where {$_.StateDesc -match "Failed"} | Foreach {
    	$_
    	Get-Service $writers["$($_.WriterName)"] -ComputerName $ComputerName | Restart-Service -Force
    }
    
    Stop-Transcript

    • Помечено в качестве ответа Sastashi 22 сентября 2014 г. 17:36
    21 сентября 2014 г. 18:38
    Отвечающий
  • Start-Transcript -Path "C:\Log\$env:ComputerName"
    
    $writers = @{
    	'ASR Writer' = 'VSS' 
    	'BITS Writer' = 'BITS'
    	'COM+ REGDB Writer' = 'VSS'
    	'DFS Replication service writer' = 'DFSR'
    	'DHCP Jet Writer' = 'DHCPServer'
    	'DPM Writer' = 'DPMWriter'
    	'FRS Writer' = 'NtFrs' 
    	'FSRM writer' = 'srmsvc' 
    	'IIS Config Writer' = 'AppHostSvc'
    	'IIS Metabase Writer' = 'IISADMIN'
    	'Microsoft Exchange Writer' = 'MSExchangeIS'
    	'Microsoft Hyper-V VSS Writer' = 'vmms' 
    	'NTDS' = 'NTDS'
    	'OSearch VSS Writer' = 'OSearch'
    	'OSearch14 VSS Writer' = 'OSearch14' 
    	'Registry Writer' = 'VSS'
    	'Shadow Copy Optimization Writer' = 'VSS'
    	'SPSearch VSS Writer' = 'SPSearch'
    	'SPSearch4 VSS Writer' = 'SPSearch4' 
    	'SqlServerWriter' = 'SQLWriter' 
    	'System Writer' = 'CryptSvc'
    	'TermServLicensing' = 'TermServLicensing' 
    	'WINS Jet Writer' = 'WINS' 
    	'WMI Writer' = 'Winmgmt' 
    }
    
    function Get-VssWriters {
    
        $Writers = @()
    	$RawWriters = VssAdmin List Writers
    
    	for ($i=0; $i -lt ($RawWriters.Count-3)/6; $i++) {
            $Writer = New-Object -TypeName psobject
            $Writer| Add-Member "ComputerName" $Computer
            $Writer| Add-Member "WriterName" $RawWriters[($i*6)+3].Split("'")[1]
            $Writer| Add-Member "StateID" $RawWriters[($i*6)+6].SubString(11,1)
            $Writer| Add-Member "StateDesc" $RawWriters[($i*6)+6].SubString(14,$RawWriters[($i*6)+6].Length - 14)
            $Writer| Add-Member "LastError" $RawWriters[($i*6)+7].SubString(15,$RawWriters[($i*6)+7].Length - 15)
            $Writers += $Writer 
        }
    	
        return $Writers
    }
    
    Get-VssWriters  | Where {$_.StateDesc -match "Failed"} | Foreach {
    	$_
    	Get-Service $writers["$($_.WriterName)"]  | Restart-Service -Force
    }
    
    Stop-Transcript

    • Помечено в качестве ответа Sastashi 24 сентября 2014 г. 7:31
    24 сентября 2014 г. 5:53
    Отвечающий

Все ответы

  • Добрый вечер! Вот неплохой сайт с коллекцией различных скриптов, может что подойдет.

    21 сентября 2014 г. 15:31
  • 1) Взять скрипт - Powershell Script/Function to get VSS Writers information on many computers

    2) Собрать все writers и в гугле легко найти службы от них зависящие

    param($ComputerName)
    
    Start-Transcript -Path "C:\Log\$ComputerName"
    
    $writers = @{
    	'ASR Writer' = 'VSS' 
    	'BITS Writer' = 'BITS'
    	'COM+ REGDB Writer' = 'VSS'
    	'DFS Replication service writer' = 'DFSR'
    	'DHCP Jet Writer' = 'DHCPServer' 
    	'FRS Writer' = 'NtFrs' 
    	'FSRM writer' = 'srmsvc' 
    	'IIS Config Writer' = 'AppHostSvc'
    	'IIS Metabase Writer' = 'IISADMIN'
    	'Microsoft Exchange Writer' = 'MSExchangeIS'
    	'Microsoft Hyper-V VSS Writer' = 'vmms' 
    	'NTDS' = 'NTDS'
    	'OSearch VSS Writer' = 'OSearch'
    	'OSearch14 VSS Writer' = 'OSearch14' 
    	'Registry Writer' = 'VSS'
    	'Shadow Copy Optimization Writer' = 'VSS'
    	'SPSearch VSS Writer' = 'SPSearch'
    	'SPSearch4 VSS Writer' = 'SPSearch4' 
    	'SqlServerWriter' = 'SQLWriter' 
    	'System Writer' = 'CryptSvc'
    	'TermServLicensing' = 'TermServLicensing' 
    	'WINS Jet Writer' = 'WINS' 
    	'WMI Writer' = 'Winmgmt' 
    }
    
    function Get-VssWriters {
        [CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact='Low')] 
        Param(
            [Parameter(Mandatory=$false,
                       ValueFromPipeLine=$true,
                       ValueFromPipeLineByPropertyName=$true,
                       Position=0)]
                [ValidateNotNullorEmpty()]
                [String[]]$ComputerName = $env:COMPUTERNAME
        )
        
        $Writers = @()
        $k = 0
        foreach ($Computer in $ComputerName) {
            try {
                Write-Verbose "Getting VssWriter information from computer $Computer"
                $k++
                $Progress = "{0:N0}" -f ($k*100/$ComputerName.count)
                Write-Progress -Activity "Processing computer $Computer ... $k out of $($ComputerName.count) computers" `
                    -PercentComplete $Progress -Status "Please wait" -CurrentOperation "$Progress% complete"
    
                $RawWriters = Invoke-Command -ComputerName $Computer -ErrorAction Stop -ScriptBlock { 
                    return (VssAdmin List Writers)
                } 
    
                for ($i=0; $i -lt ($RawWriters.Count-3)/6; $i++) {
                    $Writer = New-Object -TypeName psobject
                    $Writer| Add-Member "ComputerName" $Computer
                    $Writer| Add-Member "WriterName" $RawWriters[($i*6)+3].Split("'")[1]
                    $Writer| Add-Member "StateID" $RawWriters[($i*6)+6].SubString(11,1)
                    $Writer| Add-Member "StateDesc" $RawWriters[($i*6)+6].SubString(14,$RawWriters[($i*6)+6].Length - 14)
                    $Writer| Add-Member "LastError" $RawWriters[($i*6)+7].SubString(15,$RawWriters[($i*6)+7].Length - 15)
                    $Writers += $Writer 
                }
    
                Write-Debug "Done"
            } catch {
                Write-Warning "Computer $Computer is offline, does not exist, or cannot be contacted"
            }
        }
        return $Writers
    }
    
    Get-VssWriters -ComputerName $ComputerName | Where {$_.StateDesc -match "Failed"} | Foreach {
    	$_
    	Get-Service $writers["$($_.WriterName)"] -ComputerName $ComputerName | Restart-Service -Force
    }
    
    Stop-Transcript

    • Помечено в качестве ответа Sastashi 22 сентября 2014 г. 17:36
    21 сентября 2014 г. 18:38
    Отвечающий
  • День добрый, странность в скрипте... запускаю его  на сервере, а он не видет  его.. т.е. локахост н доступен пишет.. в чем может быть проблема?
    23 сентября 2014 г. 10:17
  • Для начала требуется включить PS Remoting на всех серверах - Understanding PowerShell Remote Management
    23 сентября 2014 г. 10:33
    Отвечающий
  • ох а без него нельзя? а то включать на порядком 1000 серверов это будет то еще удовольствие
    23 сентября 2014 г. 10:39
  • ох а без него нельзя? а то включать на порядком 1000 серверов это будет то еще удовольствие
    Все можно, но придумывайте сами обходные пути. Для включения воспользоваться групповыми политиками - Enable and configure Windows PowerShell Remoting using Group Policy 
    23 сентября 2014 г. 11:11
    Отвечающий
  • Хорошо... спасибо за ответы и последний вопрос...

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


    • Изменено Sastashi 24 сентября 2014 г. 5:50
    24 сентября 2014 г. 5:38
  • Start-Transcript -Path "C:\Log\$env:ComputerName"
    
    $writers = @{
    	'ASR Writer' = 'VSS' 
    	'BITS Writer' = 'BITS'
    	'COM+ REGDB Writer' = 'VSS'
    	'DFS Replication service writer' = 'DFSR'
    	'DHCP Jet Writer' = 'DHCPServer'
    	'DPM Writer' = 'DPMWriter'
    	'FRS Writer' = 'NtFrs' 
    	'FSRM writer' = 'srmsvc' 
    	'IIS Config Writer' = 'AppHostSvc'
    	'IIS Metabase Writer' = 'IISADMIN'
    	'Microsoft Exchange Writer' = 'MSExchangeIS'
    	'Microsoft Hyper-V VSS Writer' = 'vmms' 
    	'NTDS' = 'NTDS'
    	'OSearch VSS Writer' = 'OSearch'
    	'OSearch14 VSS Writer' = 'OSearch14' 
    	'Registry Writer' = 'VSS'
    	'Shadow Copy Optimization Writer' = 'VSS'
    	'SPSearch VSS Writer' = 'SPSearch'
    	'SPSearch4 VSS Writer' = 'SPSearch4' 
    	'SqlServerWriter' = 'SQLWriter' 
    	'System Writer' = 'CryptSvc'
    	'TermServLicensing' = 'TermServLicensing' 
    	'WINS Jet Writer' = 'WINS' 
    	'WMI Writer' = 'Winmgmt' 
    }
    
    function Get-VssWriters {
    
        $Writers = @()
    	$RawWriters = VssAdmin List Writers
    
    	for ($i=0; $i -lt ($RawWriters.Count-3)/6; $i++) {
            $Writer = New-Object -TypeName psobject
            $Writer| Add-Member "ComputerName" $Computer
            $Writer| Add-Member "WriterName" $RawWriters[($i*6)+3].Split("'")[1]
            $Writer| Add-Member "StateID" $RawWriters[($i*6)+6].SubString(11,1)
            $Writer| Add-Member "StateDesc" $RawWriters[($i*6)+6].SubString(14,$RawWriters[($i*6)+6].Length - 14)
            $Writer| Add-Member "LastError" $RawWriters[($i*6)+7].SubString(15,$RawWriters[($i*6)+7].Length - 15)
            $Writers += $Writer 
        }
    	
        return $Writers
    }
    
    Get-VssWriters  | Where {$_.StateDesc -match "Failed"} | Foreach {
    	$_
    	Get-Service $writers["$($_.WriterName)"]  | Restart-Service -Force
    }
    
    Stop-Transcript

    • Помечено в качестве ответа Sastashi 24 сентября 2014 г. 7:31
    24 сентября 2014 г. 5:53
    Отвечающий