我有一个脚本可以获取任何给定服务标签的最后登录信息。我几乎每天都要运行它来进行部署。在阅读了有关工作之后,我认为将这个过程写成一份工作是值得的。我写的脚本的工作原理是返回信息。在比较两个脚本的结果时,我意识到将命令作为作业运行的脚本不会返回计算机列表中每台计算机上的信息。
这是我得到的错误。它似乎会针对每台机器返回,但仍然为大多数机器提供信息。 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
我可以采取哪些措施来防止信息丢失,或者这是将某事作为工作的副作用?
答案 0 :(得分:1)
可以在不使用Jobs的情况下优化问题中提供的代码。
关于这个问题,过去我遇到了一些问题,即创建了许多工作并进行了大量远程处理,这会导致我的网络端口耗尽或超出某些应用程序或协议可能存在的某些最大连接限制。
没有工作的代码示例:
### 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
例如,如果您的@('P-ADDS-','P-SQLS-')
变量中有以下$ServerNames
,您将获得此过滤器:(Name -like '*P-ADDS-*') -or (Name -like '*P-SQLS-*')
这将在我的生产环境中获取所有Active Directory和Microsoft SQL相关服务器