我正在尝试比较 2 个数组的重复条目。如果两个数组中都存在一个条目,我想将其保存到一个变量中。此外,我希望带有信息的变量包含我从电子表格中提取的现有结构。 (你可以在我的代码中看到我正在提取补丁窗口、ASA、测试、dmz、服务器名称等信息)。
这里有更多关于我想要完成的信息。
首先,我使用 [adsisearcher] 从 Active Directory 中提取服务器列表。唯一真正让我感兴趣的变量是名称,所以这就是它存储的全部内容。 让我们将此变量命名为 $A.
接下来我有一个电子表格,其中包含一堆服务器和其他信息,例如它是否是测试服务器、产品等……我使用“Import-Excel”powershell 模块从我的工作表中导入数据,但不同之处在于这是我拉的一些不同的东西。 服务器名,是否是DMZ,测试服务器,补丁窗口和服务器的系统管理员。
我使用 LINQ 检查两个数组之间相交的值,但输出为空。
最终结果是这样的……我想要一种快速的方法来根据电子表格中的内容对服务器进行抽查,以确保它们仍然处于活动状态并且\或者它不是一个设备。
我尝试做一个foreach循环来检查每个服务器使用:
if(($($ServerList.DMZServer) -eq $true) -OR ($NULL -ne (([adsisearcher]"(&(objectClass=computer)(objectCategory=computer)(samaccountname=$($ServerList.ServerName)$))").FindOne())))
{
blah
}
然而,这比我想要的要长,所以我希望能快一点。由于我拥有所有可用数据并且我可以比较 2 个数组,我认为这可能是最佳选择,但我没有得到我希望的结果。我愿意接受任何建议或帮助。
这是我的脚本:
CLS
$ErrorActionPreference = 'SilentlyContinue'
$ErrorFile = (Split-Path $script:MyInvocation.MyCommand.Path) + "\ERROR.txt"
#Install the module that will let us perform certain tasks in Excel
#Install PSExcel Module for powershell
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
#Check if Module is imported
if(Get-Module -ListAvailable -Name "ImportExcel")
{
Import-Module ImportExcel
}
else
{
#Install NuGet (Prerequisite) first
Install-PackageProvider -Name NuGet -Scope CurrentUser -Force -Confirm:$False
Install-Module -Name ImportExcel -Scope CurrentUser -Force -Confirm:$False
Import-Module ImportExcel
}
#Clear screen again
CLS
#Start Timestamp
Get-Date
Write-Host " "
#------------------------------------ Global Variables
$Path = (Split-Path $script:MyInvocation.MyCommand.Path)
$ListA = $ListB = $ServerList = $ServersList = $FilteredServers = @()
#------------------------------------ Setup Excel Variables
#The file we will be reading from
$ExcelFile = (Get-ChildItem -Path "$Path\*.xlsx").FullName
#Worksheet we are working on (by default this is the 1st tab)
$worksheet = (((New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList (New-Object -TypeName System.IO.FileStream -ArgumentList $ExcelFile,'Open','Read','ReadWrite')).Workbook).Worksheets[1]).Name
$Servers = Import-Excel -Path $ExcelFile -WorkSheetname $worksheet -StartRow 1
#------------------------------------ Populate our variable with data from spreadsheet
foreach($Server in $Servers)
{
$ServersList += [pscustomobject]@{ 'ServerName' = $Server."Child"
'TestServer' = $Server."Test server"
'DMZServer' = $Server."DMZ"
'PatchWindow' = $Server."Patch Window"
'ASA' = $Server."Primary" }
}
#------------------------------------ Remove Duplicate entries
$ServersList = ($ServersList | Sort-Object -Property ServerName -Unique)
#------------------------------------ Seperate Servers from DMZ Servers
foreach($ServerList in $ServersList)
{
#Check if server is on DMZ
if($($ServerList.DMZServer) -eq $true)
{
$ServerList.ServerName += ".dmz.com"
}
$FilteredServers += $ServerList
}
#------------------------------------ Filter out Appliances
# First Grab all servers from AD
#------------------------------------
#Get Servers
$searcher = [adsisearcher]::new()
$searcher.Sort.PropertyName = "name"
#Search root is the OU level we want to search at
$searcher.SearchRoot = [adsi]"LDAP://OU=Servers,DC=blah,DC=com"
#Make this any non zero value to expand the default result size.
$searcher.PageSize = 100
#Filter Computers only and enabled
$searcher.Filter = "(&(objectCategory=computer)(objectClass=computer)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"
#List the properties we are interested in
$searcher.PropertiesToLoad.AddRange(('name','distinguishedname'))
#Now output the results with the exception of filtering out any machines in the citrix farms (we're not interested in those)
$Servers = Foreach ($Computer in $searcher.FindAll()){ ($Computer.Properties).name }
#------------------------------------
## Compare the 2 arays and pull out the servers that we want.
[String[]]$ListA = $Servers
[String[]]$ListB = $FilteredServers.ServerName
[System.Linq.Enumerable]::Intersect([object[]]$ListA, [object[]]$ListB)