2014-08-27 6 views
0

아래 PS 스크립트 수정에 대한 약간의 제안을 요청합니다. 현재 나는이 스크립트가 배포 될 위치의 IP 주소로 37 줄의 IP 주소의 처음 3 옥텟을 수동으로 변경해야합니다. 누군가가 스크립트를 수정할 수있는 방법을 알고 있는지 확인하여 처음 세 옥텟을 수동으로 변경할 필요가 없으므로 마지막 옥텟은 항상 1-60이됩니다. 호스트 시스템에서 PS 버전 2.0Powershell IP 주소

Function Check-Patches{ 
Param($Filename) 

    $logname = "C:\temp\PatchVerify\$FileName.csv" 
    [xml]$x = Get-Content "C:\Users\Cambridge\SecurityScans\$FileName.mbsa" 

    $PatchStatus = @() 

    #This list is created based on a text file that is provided. 
    $monthlyPatches = Get-Content "C:\Temp\PatchVerify\Patches_NA.txt" | ? {$_ -match "-KB(?<KB>\d+)"} | % { $matches.KB} 


    #Create objects for all the patches in the updatelog that were in the monthly list. 
    Switch ($x | % {$_.SecScan} | % {$_.Check} | ? {$_.id -eq 500} | % {$_.detail} | % {$_.updatedata} | ? {$monthlyPatches -contains $_.KBID}) 
    { 
     {$_.isinstalled -eq "true"} 
       { 
        $PatchStatus += New-Object PsObject -property @{Device=$FileName; Patch=$_.KBID; Present="YES"} 
        Continue 
       } 
     {$_.isinstalled -eq "false"} 
       { 
        $PatchStatus += New-Object PsObject -property @{Device=$FileName; Patch=$_.KBID; Present="NO"} 
        Continue 
       } 
    } 

    $detectedPatches = $PatchStatus | % {$_.Patch} 
    #Populate all of the monthly patches that weren't found on the machine as installed or failed 
    $monthlypatches | ? {$detectedPatches -notcontains $_} | % { $PatchStatus += New-Object PsObject -property @{Device=$FileName; Patch=$_; Present="Unknown"} } 

    #Output results 
    $PatchStatus 

    } 

1..60 | % { Check-Patches "172.26.210.$_" } | Export-Csv "C:\temp\PatchVerify\$env:ComputerName.csv" -NoTypeInformation 
+1

아니요, 직접 수정해야 할 것 같지 않습니다. 그렇게 말하고있다. 너는 무엇을 바꾸고 있니? 목록 있어요? 각 서브넷이 정의되었지만 텍스트 파일을 가져 와서 루프 할 수 있습니까? – Matt

+0

IP에서 사이트로의 변경은 스크립트에 나열된 것이 내가 테스트 환경에서 사용하고있는 것입니다. 각 서브넷을 반복 할 수있는 텍스트 파일의 예가 있습니까? – user2637664

+0

정말로, 나는 당신의 질문에 이미 대답했다. 답변을 수락하고 새 질문을 게시해야합니다. 그러나 CSV에서 다른 패치를 얻는 것과 관련된 새로운 질문에 대해서는 Patches_NA.txt 파일의 내용이 어떻게 나타나는지 샘플을 보여 주어야합니다. 그래서 우리는 현재 작업하고있는 것을 알고 있습니다. – TheMadTechnician

답변

0

하자가 다음과 같은 내용

10.10.13 
10.10.14 
10.10.15 

사람들은 일부 내부 서브넷있는 텍스트 파일이 있다고 가정합니다. 마지막 문을 루프에 넣으면 다음과 같이됩니다.

Get-Content c:\pathtotext\subnets.txt | ForEach-Object{ 
    $subnet = $_ 
    1..60 | % { Check-Patches "$subnet.$_" } | Export-Csv "C:\temp\PatchVerify\$env:ComputerName.csv" -NoTypeInformation 
} 

파일의 내용을 읽고 파일의 각 행에 대해 문장을 읽습니다. 다른 파이프 1..60 |이 호출되어 데이터가 변경되는 $_

+0

좋아, 이것은 작동 할 수 있습니다. 방금 나 한테 아이디어를 줬어. 나 한테 시험해보고 너에게 돌아갈거야. 감사. – user2637664

1

WMI 호출을 사용하여 로컬 IP를 가져올 수 있고 RegEx를 사용하여 처음 세 개의 8 진수를 가져올 수 있기 때문에 $subnet = $_이 필요합니다. 이것은 마지막. ###을 단지 처음 세 옥텟을 얻기 위해 아무 것도없이 바꿉니다.

$localip = @(Get-WMIObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled='TRUE'")[0].ipaddress[0] -replace "\.\d+$" 
1..60 | % { Check-Patches "$localip.$_" } | Export-Csv "C:\temp\PatchVerify\$env:ComputerName.csv" -NoTypeInformation 
+0

잘 읽지 못했던 것 같습니다. 이것은 정답입니다. 스크립트는 한 위치에서 다른 서브넷에 대해 실행되지만 – Matt

+0

안녕하세요. 입력에 감사드립니다. 이 솔루션은 훌륭하게 작동하지만 .csv 파일은 이러한 장치에 대해 "알 수 없음"으로 표시되어야하며 모두 "예"로 표시됩니다. – user2637664

+0

질문에 대한 내 답변에 문제가없는 것은 패치를 확인하는 방법과 관련이 있습니다. – TheMadTechnician