0

Я все еще новичок с powershell, но люблю изучать и исследовать все, что он может сделать.Подсчет услуг на нескольких серверах

Итак, я ищу, чтобы создать скрипт, который будет выводиться в таблицу datagridview. Я создал достаточно простую форму с многострочным текстовым полем, в котором вы можете ввести список серверов, а затем просто кнопку «проверить», которая вызывает мою функцию, чтобы фактически запрашивать каждый сервер для своих служб и выводить эту информацию в datagridview под ним.

Эта часть была достаточно легкой для меня. Мое дело, я хочу, чтобы это сделать следующее ":

  • запрос каждого сервера и вытащить список всех услуг на сервере
  • затем в DataGridView, я хочу, чтобы показать имя службы в колонке 1, а затем подсчет количества серверов в этой колонке 2

Надеюсь, что это сделать с тех пор. Невозможно предоставить какой-либо код, поскольку я не знаю, как правильно его написать! есть способ генерировать полный список, затем делать цикл и тип типа счета, но не уверен.

Благодарю вас за любую помощь. Был приключенческий поиск и чтение, как сумасшедший. Либо неправильные критерии поиска, либо что-то просто не нажимают на меня.

Update - Добавление в текущем сценарии у меня есть:

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 

$xForm = 800 
$yForm = 800 

$SVCForm = New-Object System.Windows.Forms.Form 
$SVCForm.Text = "Automatic Services Query" 
$SVCForm.Size = New-Object System.Drawing.Size($xForm,$yForm) 
$SVCForm.FormBorderStyle = "FixedSingle" 
$SVCForm.StartPosition = "CenterScreen" 
$SVCForm.ControlBox = $true 
$SVCForm.KeyPreview = $True 
$SVCForm.ShowIcon = $false 
$SVCForm.MinimizeBox = $True 
$SVCForm.MaximizeBox = $false 

$CancelButton = New-Object System.Windows.Forms.Button 
$CancelButton.Location = New-Object System.Drawing.Size(365,720) 
$CancelButton.Size = New-Object System.Drawing.Size(75,23) 
$CancelButton.Text = "Cancel" 
$CancelButton.Add_Click({$x=$CancelButton.Text;$SVCForm.Close()}) 
$SVCForm.Controls.Add($CancelButton) 

$ServerListGroup = New-Object System.Windows.Forms.GroupBox 
$ServerListGroup.Location = New-Object System.Drawing.Size(5,10) 
$ServerListGroup.size = New-Object System.Drawing.Size(780,300) 
$ServerListGroup.text = "Enter list of servers you want to check:" 
$SVCForm.Controls.Add($ServerListGroup) 

$ServerList = New-object System.Windows.Forms.TextBox 
$ServerList.Location = New-object System.Drawing.Size(5,25) 
$ServerList.Size = New-Object System.Drawing.Size(280,270) 
$ServerList.Multiline = $True 
$ServerList.ScrollBars = "Vertical" 
#$ServerList.add_TextChanged({ONValButton}) 
$ServerListGroup.Controls.Add($ServerList) 

$SVCButton = New-Object System.Windows.Forms.Button 
$SVCButton.Location = New-Object System.Drawing.Size(505,140) 
$SVCButton.Size = New-Object System.Drawing.Size(180,22) 
$SVCButton.Text = "SVC Check" 
$SVCButton.Enabled = $True 
$SVCButton.Add_Click({SvcCheckCount}) 
$ServerListGroup.Controls.Add($SVCButton) 


$SvcListGroup = New-Object System.Windows.Forms.GroupBox 
$SvcListGroup.Location = New-Object System.Drawing.Size(5,330) 
$SvcListGroup.size = New-Object System.Drawing.Size(780,380) 
$SvcListGroup.text = "Automatic Running/Not-Running Services are listed below:" 
$SVCForm.Controls.Add($SvcListGroup) 

#$SvcList = New-object System.Windows.Forms.TextBox 
#$SvcList.Location = New-object System.Drawing.Size(5,25) 
#$SvcList.Size = New-Object System.Drawing.Size(765,350) 
#$SvcList.Multiline = $True 
#$SvcList.ScrollBars = "Vertical" 
#$SvcList.Readonly= $True 
#$SvcListGroup.Controls.Add($SvcList) 

$SvcGrid = New-Object System.Windows.Forms.DataGridView 
$SvcGrid.Location = New-Object System.Drawing.Size(5,15) 
$SvcGrid.Size = New-Object System.Drawing.Size(760,360) 
$SvcGrid.ColumnHeadersBorderStyle = [System.Windows.Forms.DataGridViewHeaderBorderStyle]::Single 
$SvcGrid.CellBorderStyle = [System.Windows.Forms.DataGridViewCellBorderStyle]::Single 
$SvcGrid.ColumnHeadersHeightSizeMode = [System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode]::DisableResizing 
$SvcGrid.GridColor = [System.Drawing.Color]::Black 
$SvcGrid.RowHeadersVisible = $false 
$SvcGrid.AllowUserToAddRows = $false 
$SvcGrid.AllowUserToResizeColumns = $False 
$SvcGrid.AllowUserToResizeRows = $false 
$SvcGrid.ColumnHeadersHeight = 23 
$SvcGrid.SelectionMode = [System.Windows.Forms.DataGridViewSelectionMode]::FullRowSelect 
$Scroll = New-Object System.Windows.Forms.VScrollBar 
$Scroll.Dock = [System.Windows.Forms.DockStyle]::Right 
$Scroll.width = 18 
$Scroll.isAccessible = $false 
$SvcGrid.Controls.Add($Scroll)     
$SvcGrid.Columns.Add("Name","Service Name") > $null 
$SvcGrid.Columns["Name"].Width = 200 
$SvcGrid.Columns["Name"].HeaderCell.Style.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleLeft 
$SvcGrid.Columns["Name"].DefaultCellStyle.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleLeft 
$SvcGrid.Columns["Name"].ReadOnly = $False 
$SvcGrid.Columns.Add("StartMode", "Start Mode") > $null 
$SvcGrid.Columns["StartMode"].Width = 180 
$SvcGrid.Columns["StartMode"].HeaderCell.Style.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleLeft 
$SvcGrid.Columns["StartMode"].DefaultCellStyle.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleLeft 
$SvcGrid.Columns["StartMode"].ReadOnly = $False 
$SvcGrid.Columns.Add("Running","Running") > $null 
$SvcGrid.Columns["Running"].Width = 180 
$SvcGrid.Columns["Running"].HeaderCell.Style.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleCenter 
$SvcGrid.Columns["Running"].DefaultCellStyle.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleCenter 
$SvcGrid.Columns["Running"].ReadOnly = $true 
$SvcGrid.Columns.Add("NotRunng","Not Running")>$null 
$SvcGrid.Columns["NotRunng"].Width = 180 
$SvcGrid.Columns["NotRunng"].HeaderCell.Style.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleCenter 
$SvcGrid.Columns["NotRunng"].DefaultCellStyle.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleCenter 
$SvcGrid.Columns["NotRunng"].ReadOnly = $true 
$SvcListGroup.Controls.Add($SvcGrid) 




Function SvcCheckCount 
{ 
    $SvcGrid.Rows.Clear() 
    $Servername = $ServerList.Text.Split("`n")|%{$_.trim()} 

    foreach($Server in $Servername) 
      { 
      $Server = $Server.ToUpper() 
       $svctest = Get-WmiObject Win32_Service | Where-Object {$_.StartMode -eq 'Auto'} | Select-Object Name, Startmode, State 

       Foreach ($svc in $svctest) 
       { 
       $name = $svc.Name 
       $startmode = $svc.StartMode 
       $state = $svc.State 

       If($state-eq"Running"){$SvcGrid.Rows.add($name,$startmode,$state)} 
       If($state-eq"Stopped"){$SvcGrid.Rows.add($name,$startmode,$null,$state)} 
       } 

       } 



} 




$SVCForm.Topmost = $True 

$SVCForm.Add_Shown({$SVCForm.Activate()}) 
[void] $SVCForm.ShowDialog() 
+0

Можете ли вы предоставить некоторые код? Также непонятно, что вы просите. Является ли проблема с подсчетом служб на нескольких серверах или написанием сценария для всех описанных вами поведений? Если второй случай верен, я бы рекомендовал вам задать конкретный вопрос и показать код, который вы попробовали. –

+0

обновил мое сообщение со сценарием, который у меня есть. Он будет получать все службы на серверах, которые вы вводите в текстовое поле, и отображать имя, режим запуска, а также запускать или останавливать в виде сетки. Вы можете отсортировать его по имени и увидеть, что существуют одинаковые имена служб, как для каждого сервера. Я хочу, чтобы он учитывал и отображал только каждую службу, которую он нашел, как одну строку, и подсчет рядом с ним, с каким количеством серверов он работает (из того, что вы ввели в текстовое поле). – LTrig

ответ

1

Поскольку у вас уже есть GUI часть этой работы я собираюсь сосредоточиться нам группирование данных, которые вы ищете. Идя в это, одна вещь, которую я нечеткой, - это то, почему у вас есть операторы if, но мы можем работать над этим, если это необходимо. Ниже предназначается, чтобы быть на месте вашего foreach петли

$services = @() 
foreach($Server in $Servername){ 
    $Server = $Server.ToUpper() 
    $services += Get-WmiObject Win32_Service -ComputerName $Server -Filter 'StartMode="Auto"' | 
      Select-Object Name, Startmode, State | 
      Add-Member -MemberType NoteProperty -Value $Server -Name "Server" -PassThru 
} 
$services | Group-Object Name | ForEach-Object{ 
    $SvcGrid.Rows.add($_.Name,$_.Count) 
} 

Первое: вы не используете переменную $server в вашем Wmi вызова, так что все результаты были бы из одной машины вы запускали это с. Кроме того, я переместил Where в -Filter, чтобы ускорить обработку на удаленных компьютерах.

Соберите всю эту информацию в массив (добавив имя компьютера, если оно станет полезным позже). Затем, используя результаты, используйте Group-Object, чтобы получить подсчеты, которые вы искали. Pipe, что в другой ForEach-Object, чтобы получить результаты в сетке

Примечание стороны (которые я не проверял.): Если вы просто хотите, данные в сетке можно использовать Out-GridView

$services | Group-Object Name | Select name,count | Out-GridView 
+0

Вы, сэр, потрясающие! Спасибо за это.Единственное, что я изменил, было в объекте get-wmi, я связал его с этим, чтобы получить как автоматическое, так и остановленное: '$ services + = Get-WmiObject Win32_Service -ComputerName $ Server | Where {$ _. StartMode-eq" Auto " -and $ _. State-eq «Stopped»} 'затем продолжил канал, который вы опубликовали. – LTrig

+0

Извините, я заметил, что вы удалили 'Where' и положили в' -filter'. Есть ли способ добавить несколько фильтров? – LTrig

+0

@LTrig вы можете изменить фильтр на это: '-Filter 'StartMode =" Auto "и State =" Stopped "'' – Matt

Смежные вопросы