Запуск процесса AsJob с потерей информации - PullRequest
0 голосов
/ 03 мая 2018

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

Это ошибка, которую я получаю. Похоже, что это возвращает против каждой машины, но затем по-прежнему предоставляет информацию для большинства из них. Error

Старый скрипт возвращает информацию о каждом компьютере в списке.

#Load Active Directory 
Import-Module activedirectory
#Load list of computers
$Results = @()
$Computer = Get-Content -path 'C:\Scripts\computers.txt'

#Check each computer in the list 
ForEach($ComputerName in $Computer)
    {
    $results += Get-ADComputer -Filter " Name -Like '*$ComputerName*' " -Properties name, samaccountname, lastlogondate, DNSHostName; Start-Sleep -Seconds 3 
     } 

#Export to CSV file
$Results | Select Name, SamAccountName, LastLogonDate, DNSHostName | Export-Csv -NoTypeInformation -Path 'C:\Scripts\output.csv'

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

#Check each computer in the list 
Write-Host -Foreground Green "Getting last logon information"
foreach($ComputerName in $Computer)
    {
    Start-Job C:\Scripts\GetADComputer.ps1 -ArgumentList $ComputerName
}
    #Wait for jobs
    Get-Job | Wait-Job

    #Get job results
    $Results += Get-Job | Receive-Job

#Export to CSV file
$Results | Select Name, SamAccountName, LastLogonDate, DNSHostName | Export-Csv -NoTypeInformation -Path 'C:\Scripts\output1.csv'

Сценарий, который он вызывает при запуске задания:

#Allows the $ComputerName variable from the initial script to be used. 
param(
    [Parameter(Mandatory=$True,
    ValueFromPipeline=$True)]
    [string[]]$ComputerName
)

#Load Active Directory 
Import-Module activedirectory

#Retrieves information about the ADComputers
Get-ADComputer -Filter " Name -Like '*$ComputerName*' " -Properties name, samaccountname, lastlogondate, DNSHostName; Start-Sleep -Seconds 3

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

1 Ответ

0 голосов
/ 03 мая 2018

Код, указанный в вопросе, можно оптимизировать без использования заданий.

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

Пример кода без работы:

### Script Settings/Params

#Computer Names
$ComputerNames = Get-Content -path '.\ComputerNames.txt'

#Computer Properties to retrieve from AD which we want to export.
$ComputerProperties = @('Name', 'SamAccountName', 'LastLogonDate', 'DNSHostName')

#File Path and Name for our export file.
$ExportFilePath = ".\export.csv"

### Script Execution

#AD Query
$ComputerNames_ADFilter = ($ComputerNames | ForEach-Object {"(Name -like '*$($_)*')"}) -join ' -or '
$ADComputers = Get-ADComputer -filter $ComputerNames_ADFilter -Properties $ComputerProperties

#Export
$ADComputers | Select $ComputerProperties | Export-Csv -NoTypeInformation -Path $ExportFilePath

Например, если в вашей переменной $ServerNames есть следующее @('P-ADDS-','P-SQLS-'), вы получите этот фильтр: (Name -like '*P-ADDS-*') -or (Name -like '*P-SQLS-*') это даст мне все связанные с Active Directory и Microsoft SQL серверы в моей производственной среде.

...