2016-12-05 5 views
0

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

Get-OnlineComputers | % { get-process -computername $_ } 

Теперь я в основном получили мою функция готова, но это слишком долго. Я хочу только вернуть компьютеры, у которых есть WinRM active, но я также хочу предоставить возможность получить каждый компьютер, даже те, у которых не было настроено WinRM (параметр переключателя).

Это моя функция. сначала он создает pssession для domaincontroller, чтобы получить все компьютеры в нашей локальной сети. затем за компьютером, он будет проверять, активны ли они в WinRM или если они принимают пинг. если это так, он возвращается.

$session = New-PSSession Domaincontroller 
$computers = Invoke-Command -Session $session { Get-ADComputer -filter * } | select -ExpandProperty Name 

$computers | % { 
    if ($IncludeNoWinRM.IsPresent) 
    { 
     $ErrorActionPreference = "SilentlyContinue" 
     $ping = Test-NetConnection $_ 
     if ($ping.PingSucceeded -eq 'True') 
     { 
      $_ 
     }  
    } 
    else 
    { 
     $ErrorActionPreference = "SilentlyContinue" 
     $WinRM = Test-WSMan $_ 
     if ($WinRM) 
     { 
      $_ 
     } 
    } 
} 

Является ли это лучшим способом, чтобы проверить свои онлайн-компьютеры? Кто-нибудь имеет более быструю и лучшую идею?

Спасибо!

+1

Я бы сначала протестировал, если они принимают пинг. то вы знаете, если они в сети, и если да, вы можете проверить WinRM. я могу ошибаться, но, возможно, это ускоряет его. – XtremeBaumer

+0

oops - почему я получил нижестоящий знак? Что я могу улучшить в своем вопросе? – SimonS

ответ

3

Очень быстрое решение использует -Quiet параметр Test-Connection командлета:

так например:

$ping = Test-Connection "Computer" -Quiet -Count 1 
if ($ping) 
{ 
"Online" 
} 
    else 
    { 
    "Offline" 
    } 

Если вам это не достаточно быстро, вы можете использоватьМетод System.Net.NetworkInformation.Ping

Вот пример функции:

Function Test-Ping 
{ 
Param($computer = "127.0.0.1") 
    $ping = new-object System.Net.NetworkInformation.Ping 
    Try 
    { 
    [void]$ping.send($computer,1) 
    $Online = $true 
    } 

    Catch 
    { 
    $Online = $False 
    } 

    Return $Online 
} 

Что касается его выполнения на нескольких компьютерах, я предлагаю использовать пространств выполнения, так как это самый быстрый Многопоточность вы можете получить с помощью PowerShell,

Для более информация см:

Runspaces vs Jobs

Basic Runspaces implemenation

+0

очень приятно. я попробую ваши предложения и приму это в качестве ответа. Я бы дал вам еще один +1, если бы мог рассказать мне о RunSpaces. очень интересно! – SimonS

+0

@simons я бы лучше пошел с Posh-RSJob, так как он обрабатывает всю боль с помощью пробелов, а затем попытается реализовать пробелы. – 4c74356b41

0

Начало использования с использованием Posh-RSJob для параллельного выполнения, что само по себе даст огромный прирост производительности. Так что ваш код будет выглядеть примерно так:

$computers | % {Start-RSJob -Name {$using:_.Name} -ScriptBlock { 
    Yourcodehere 
    } 
} 

Get-RSjob | Receive-RSJob 

Обратите внимание, что вы должны вызвать переменные с $using:variablename

+1

Использование регулярных команд '* -Job', которые уже поставляются с PowerShell, будет в основном делать то же самое. Возможно, немного менее эффективно, но без необходимости сначала устанавливать сторонний модуль. –

+0

Судя по моему опыту, гораздо менее эффективно, особенно когда речь идет о сотнях призывов. – 4c74356b41

+0

Runspaces уже являются родными, но модуль просто обертывает вокруг них хороший синтаксис. регулярная старт-работа будет загружать еще один полный экземпляр powershell, пробелы запускают другой поток в рамках одного процесса powershell и идеально подходят для одновременных заданий, упомянутых в оригинальном плакате, так как он намного более добрый к системным ресурсам и намного быстрее. –

0

Boe Prox (master of runpaces) написал функцию, которая доступна в галерее Powershell. Я связал сценарий ниже.

Он использует многие ответы, уже даваемые для одновременного изучения 100 компьютеров компьютеров по имени. Сценарий получает информацию о сети WMI, если тестовое соединение завершается успешно. Его довольно легко адаптировать для получения любой другой информации, которую вы хотите, или просто вернуть результат тестового соединения.

Скрипт фактически использует пулы пространства пробелов, а не прямые пробелы, чтобы ограничить количество одновременных потоков, которые могут возникнуть в вашем цикле.

Boe также написал модуль PoSH-RSJob, уже упомянутый. Этот скрипт достигнет того, чего вы хотите в родном PoSH, без необходимости устанавливать его модуль.

https://gallery.technet.microsoft.com/scriptcenter/Speedy-Network-Information-5b1406fb

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