Ich habe die folgende PowerShell-Funktion erstellt, um die Dateien in einem benutzerdefinierten Verzeichnis durchzulaufen, die von der DISA-FSO bereitgestellten CCI-Werte mit den Test-IDs für jede der STIGs zu verknüpfen das Verzeichnis, und geben Sie diese Daten an eine .csv
Datei der Benutzer aus.PowerShell Foreach-Schleife wird nach mehreren erfolgreichen Versuchen nicht ausgeführt
Der Code arbeitete in PowerShell ISE
, dann versuchte ich es in PowerShell Terminal
und es funktioniert nicht mehr in beiden.
Wenn ich die function
ausfühle, fragt es nach und speichert die Parameter, aber die primäre Schleife wird nicht ausgeführt (Kommentar unten in Zeile 23). Während des Debugging habe ich gesehen, dass die foreach
Schleife ganz übersprungen wird. Was muss ich tun, damit die foreach-Schleife ausgeführt wird?
Dinge, die ich habe versucht:
- die param außerhalb der Funktion zu bewegen
- die Funktion vor oder nach der Funktionsdeklaration aufrufen (dh am oberen oder unteren Rand des Skripts
- Entfernen der Überprüfen, ob
if
die vom Benutzer angegebene Ausgabedatei vorhanden ist - Hinzufügen einer Variablen, nachdem die Ausgabedatei vorhanden ist Überprüfen Sie, ob die Parameter angezeigt werden (damit wird angezeigt, was nachher übersprungen wird)
Aktuelle Funktionszustand:
Function CreateTestPlan {
param (
[Parameter(Mandatory = $true, HelpMessage="Filename of DISA STIG Benchmark XCCDF.xml file. Downloaded from IASE website. Usage: -BenchMarksDir")]
[string]$BenchMarksDir,
[Parameter(Mandatory = $true, HelpMessage="Filename of DISA CCI .XML file. Downloaded from IASE website. Usages: -CCIFile")]
[string]$CCIFile,
[Parameter(Mandatory = $true, HelpMessage="Filename of your choosing, ending in .csv. Usages: -OutFile")]
[string]$OutFile,
[Parameter(Mandatory = $true, HelpMessage="Determines output of control numbers and selection. Usages: -CCIFilter + NIST SP 800-53, NIST SP 800-53 Revision 4, NIST SP 800-53A")]
[ValidateSet("NIST SP 800-53","NIST SP 800-53 Revision 4","NIST SP 800-53A")]
[string]$CCIFilter
)
if (![System.IO.File]::Exists($OutFile))
{
New-Item -ItemType file $OutFile -EA Stop
}
ElseIf([System.IO.File]::Exists($OutFile))
{
Clear-Content $OutFile -EA Stop
}
Foreach ($file in $files) #Loop does not execute
{
[xml]$Stigx = Get-Content -Path $file.FullName -EA Stop
[xml]$CCIx = Get-Content -Path $CCIFile -EA Stop
# start by parsing the xccdf benchmark
if($Stigx){
$StigCollection = @()
# loop through the xccdf benchmark collecting data into an object collection
$StigName = $Stigx.Benchmark.title
#loop through each group in the stig
foreach ($group in $StigX.Benchmark.Group){
# create a new PSObject collecting and stripping out as required.
$STIG = New-Object -TypeName PSObject -Property ([ordered]@{
GroupID = $group.id
RuleTitle = $group.Rule.title
Severity = $group.Rule.severity
VulnerabilityDetails = $($($($group.Rule.description) -split '</VulnDiscussion>')[0] -replace '<VulnDiscussion>', '')
Check = $group.Rule.check.'check-content'
Fix = $group.Rule.fixtext.'#text'
ControlIdentifier = $group.Rule.ident.'#text' -join "`r`n"
Control = $null # control is null as it will be added from the CCI List
StigName = $StigName
})
$StigCollection += $STIG
}# close foreach
}# close if
# loop through the Stig Collection updating the Control information pulled from the U_CCI_List.xml
foreach($StigObj in $StigCollection){
foreach($CciItem in $CCIX.cci_list.cci_items.cci_item){
if($CciItem.Id -EQ $StigObj.ControlIdentifier){
# filter the control version by the title
if($CciItem.references.reference.title -EQ $CCIFilter){
$StigObj.Control = $CciItem.references.reference.index -join "`r`n"
}
}
}
}
$StigCollection | Select-Object -Property 'StigName', 'GroupID', 'Control', 'Check' | Export-Csv $OutFile -Append -NoTypeInformation
}
}
meinen Browser, um die Testdateien hier dadurch verursacht, dass das Hinzufügen zum Absturz bringen, ich bin die Bereitstellung Links, mit denen die notwendigen Parameterdateien heruntergeladen werden können:
Benchmarks: General Operating System STIG CCI Matrix: DISA FSO CCI
Beispiel Verwendung und keine Fehler werden empfangen:
Danke für Ihre Zeit. Ich fühle mich, als hätte ich diese Linie an einer Stelle, muss sie versehentlich gelöscht haben. – Chris
Auch dank George Rolston für die for-Schleife-Logik in seinem Beitrag zur Verfügung gestellt: http://www.entelechyit.com/2017/01/02/powershell-and-disa-nist-stigs-part-1/ – Chris