2017-12-14 1 views
1

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: No Errors and Example Usage

Antwort

5

Die Variable $files ist nie gesetzt, also muss sie $null (empty) sein. Die foreach-Schleife versucht, jedes Element in $files durchzugehen, was nichts ist. Die Schleife wird nicht wirklich übersprungen, es gibt einfach nichts zu iterieren.

Wenn Sie alle Dateien in $BenchMarksDir durchlaufen möchten, müssten Sie zuerst alle darin enthaltenen Dateien aufzählen.

$files = Get-ChildItem -Path BenchMarksDir -File 
+0

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

+0

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

Verwandte Themen