एक समूह के लिए WSUS रिपोर्ट अनुमोदन


9

मैं उन अद्यतनों की WSUS रिपोर्ट बनाने का एक तरीका खोजने की कोशिश कर रहा हूं जिन्हें कंप्यूटर समूह ए के लिए अनुमोदित किया गया है जो कि एक या एक से अधिक समूहों के लिए अनुमोदित नहीं हैं। वैकल्पिक रूप से, एक सारणीबद्ध रिपोर्ट जो प्रत्येक अद्यतन और प्रत्येक समूह के लिए अनुमोदन की स्थिति को सूचीबद्ध करती है, ताकि इसे निकालने की प्रक्रिया की जा सके कि मुझे क्या चाहिए। WSUS में ही इस तरह की रिपोर्ट प्रतीत नहीं होती है, या कम से कम एक मुझे नहीं मिल सकती है, इसलिए इस तरह की रिपोर्ट का उत्पादन करने के लिए एक स्क्रिप्ट सबसे स्वागत योग्य होगी।


आपके WSUS पर विंडोज़ का कौन सा संस्करण चल रहा है?
रात्रि

@ नहीं, यह WSUS 3.2.7600.226 सर्वर 2008 R2 मानक 64 बिट मशीन पर चल रहा है।
जॉन गार्डनियर्स

मुझे लगता है कि मेरे पास आपके लिए एक समाधान है, मुझे कुछ दीजिए और मैं पुष्टि करता हूं
नैट

जवाबों:


8

यह पॉवरशेल स्क्रिप्ट ठीक वही करती है जो आपका प्रारंभिक अनुरोध था। एक कंप्यूटरग्रुप की जाँच करें और एक या एक से अधिक कंप्यूटर समूहों के लिए अनुमोदित अपडेट न ढूंढें।

नोट आपको इसे WSUS सर्वर या WSUS व्यवस्थापक उपकरण स्थापित करने वाली मशीन पर चलाने की आवश्यकता होगी।

विन्यास

$targetComputerGroupकंप्यूटर समूह पर सेट करें जिसे आप आधार रेखा के रूप में उपयोग करना चाहते हैं $CheckForMissingसमूह या समूहों के नाम पर सेट करें जिन्हें आप देखना चाहते हैं कि क्या उन्हें अनुमोदित किया गया है। नोट: कोमा सेपरेट को गुणा करने के लिए ("Group1, Group2")

$serverName="localhost"
$targetComputerGroup="BaselineGroup"
$checkForMissing="MissingGroup1,MissingGroup2"

[void][reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus=[Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer($serverName,$false)
$computerGroup=$wsus.GetComputerTargetGroups()|ForEach-Object -Process {if ($_.Name -eq $targetComputerGroup) {$_}}
$UpdateScope=New-Object Microsoft.UpdateServices.Administration.UpdateScope
$UpdateScope.ApprovedStates="Any"
$updateScope.ApprovedComputerTargetGroups.Add($computerGroup)
$Approvals = $wsus.GetUpdateApprovals($UpdateScope)

#At this point we have all of the updates assigned to the $targetComputerGroup

$report= @()
write-host "Querying for all Updates approved for $targetComputerGroup"

foreach ($Approval in $approvals) {
   $record=""|Select-Object ComputerGroup,UpdateName, UpdateID
   $record.ComputerGroup=$wsus.GetComputerTargetGroup($Approval.ComputerTargetGroupID).Name
   $record.UpdateName=$wsus.GetUpdate($Approval.UpdateID).Title
   $record.UpdateID=$wsus.GetUpdate($Approval.UpdateID).ID.UpdateID
   $report +=$record
   }

#Now group the results by UpdateName
$GR=$report|group -Property UpdateName

$CheckForMissing=$CheckForMissing.Split(",")

 foreach ($entry in $gr) {
    $groups=@()
    foreach ($g in $entry.Group) {
        $groups += $g.ComputerGroup
        }
    foreach ($missing in $checkForMissing) {
        if ($groups -Contains $missing) {}
        else{
            New-Object PSObject -Property @{
            Name = $entry.Name
            UpdateID = $entry.Group[0].UpdateID
            GroupMissing = $missing
            }
        }
    }
}

जब पूरा हो जाएगा तो आपको आउटपुट आउटपुट मिलेगा: यहां छवि विवरण दर्ज करें

यदि स्क्रीन पर आउटपुट देने के बजाय आप सूची को CSV में निर्यात करना चाहते हैं, तो नीचे के हिस्से को निम्न कोड से बदलें:

   $CheckForMissing=$CheckForMissing.Split(",")
   $CSVdata=@()
     foreach ($entry in $gr) {
        $groups=@()
        foreach ($g in $entry.Group) {
            $groups += $g.ComputerGroup
            }
        foreach ($missing in $checkForMissing) {
            if ($groups -Contains $missing) {}
            else{
                $CSVdata += New-Object PSObject -Property @{
                Name = $entry.Name
                UpdateID = $entry.Group[0].UpdateID
                GroupMissing = $missing
                }
            }
        }
    }
 $CSVdata|Export-Csv "FILENAME.CSV"

यह काम करता हैं! क्या आप जानते हैं कि आउटपुट को कम करने से कैसे रोका जाए? BTW, मैं एक और 9 घंटे के लिए इनाम नहीं दे सकता।
जॉन गार्डनियर्स

1
ट्रंकेशन स्क्रीन का पावरफुल फॉर्मेट कैसे होता है, इसका एक कार्य है। मैंने CSV फ़ाइल के आउटपुट के उदाहरण के साथ उत्तर को अपडेट किया ताकि आपके पास पूर्ण मान हो सकें।
नैट

बहुत बढ़िया, क्योंकि सीएसवी मेरी जरूरतों के लिए बहुत उपयुक्त है। यहां से मैं इसे पर्ल को खिला सकता हूं, जहां कम से कम मुझे पता है कि मैं क्या कर रहा हूं। बहुत सराहना की।
जॉन गार्डनियर्स

7

एक "बस" WSUS डेटाबेस से कनेक्ट कर सकता है और इसके खिलाफ क्वेरी चला सकता है:

  1. एलीवेटेड विशेषाधिकारों के साथ एसक्यूएल प्रबंधन स्टूडियो शुरू करें।
  2. Windows प्रमाणीकरण\\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query का उपयोग करने के लिए कनेक्ट करें ।

इन तालिकाओं में आपके प्रश्न के बारे में रुचि है:

  • tbUpdate
    एकल अद्यतन के बारे में जानकारी रखता है

  • tbTargetGroup
    सभी कंप्यूटर समूहों के बारे में जानकारी प्राप्त करता है

  • tbDeployment
    किस कंप्यूटर समूह के लिए क्या अपडेट स्वीकृत किए गए हैं, इस बारे में जानकारी रखता है

हालाँकि, पहले से मौजूद vUpdateApprovalजानकारी को पुनः प्राप्त करने के लिए पहले से मौजूद दृश्य का उपयोग करना फायदेमंद लगता है , क्योंकि यह दृश्य पहले ActionIDसे tbDeploymentही अन्य चीजों से कॉलम का अनुवाद करता है ।

vUpdateApprovalदेखने के लिए, तथापि, अद्यतन के लिए किसी भी आसानी से पढ़ने योग्य खिताब शामिल नहीं है। शीर्षक आमतौर से पढ़ा जाता है tbLocalizedProperty। हमारे लिए इसे आसान बनाने के लिए, एक और दृश्य है vUpdate:।

मेरे पास उचित क्वेरी के निर्माण के लिए हमारे WSUS डेटाबेस में वास्तव में उचित डेटा नहीं है जो आपके पहले अनुरोध को फिट करेगा (और मैं इसे आँख बंद करके निर्माण करने के लिए पर्याप्त आश्वस्त नहीं हूं)। तो यहाँ आपके माध्यमिक अनुरोध के लिए एक दृष्टिकोण है। अगर मैं गड़बड़ नहीं करता, तो यह सभी समूहों के लिए सभी अद्यतनों और अनुमोदन स्थिति की एक सूची तैयार करता है।

SELECT
    aUpdate.UpdateId,
    aUpdate.DefaultTitle,
    aGroup.Name as GroupName,
    aApproval.Action as Action
FROM
    PUBLIC_VIEWS.vUpdate AS aUpdate INNER JOIN
    PUBLIC_VIEWS.vUpdateApproval AS aApproval ON aUpdate.UpdateId = aApproval.UpdateId LEFT JOIN
    dbo.tbTargetGroup as aGroup ON aGroup.TargetGroupID = aApproval.ComputerTargetGroupId
;

जो हमारे जर्मन एसबीएस पर इस उत्पादन का उत्पादन करता है:

यहां छवि विवरण दर्ज करें

अपने 5 डिफ़ॉल्ट समूहों के साथ हमारे SBS के लिए, यह ~ 26s में 121558 परिणाम पंक्तियों का उत्पादन करता है। इसलिए, यदि आप क्वेरी के साथ खेलना चाहते हैं, तो SELECT TOP 1000परीक्षण करते समय पहली पंक्ति को बदलना उचित हो सकता है ।

मैंने इसे एक PowerShell स्क्रिप्ट में लपेटने के लिए भी समय लिया:

# Where to connect to
$dataSource        = "\\.\pipe\MSSQL`$MICROSOFT##SSEE\sql\query"
$connectionTimeout = 30

# The query we want to perform against the WSUS database
$query = @"
    SELECT TOP 10
        aUpdate.UpdateId,
        aUpdate.DefaultTitle,
        aGroup.Name as GroupName,
        aApproval.Action as Action
    FROM
        PUBLIC_VIEWS.vUpdate AS aUpdate INNER JOIN
        PUBLIC_VIEWS.vUpdateApproval AS aApproval ON aUpdate.UpdateId = aApproval.UpdateId LEFT JOIN
        dbo.tbTargetGroup as aGroup ON aGroup.TargetGroupID = aApproval.ComputerTargetGroupId
"@
$queryTimeout = 120

# Construct the connection string
$connectionString = "Data Source={0};Integrated Security=True;Connect Timeout={1};Database=SUSDB" -f $dataSource,$connectionTimeout

# Open the connection to the SQL server
$connection = New-Object System.Data.SqlClient.SQLConnection
$connection.ConnectionString = $connectionString
$connection.Open()

# Construct our SQL command
$sqlCommand = New-Object system.Data.SqlClient.SqlCommand( $query, $connection )
$sqlCommand.CommandTimeout = $queryTimeout

# Retrieve the data from the server
$dataSet     = New-Object system.Data.DataSet
$dataAdapter = New-Object system.Data.SqlClient.SqlDataAdapter( $sqlCommand )
[void]$dataAdapter.fill( $dataSet )

# Clean up
$connection.Close()

# Output result
$dataSet.Tables

कृपया ध्यान दें कि इस स्क्रिप्ट में SELECT TOP 10परीक्षण के दौरान अपने खोल को बाढ़ से बचने के लिए सीमा शामिल है ।


यह निश्चित रूप से जांच करने के लिए कुछ है। शायद एमएस SQL ​​सर्वर के साथ बातचीत करने के लिए एक पर्ल मॉड्यूल है।
जॉन गार्डनियर्स

@ जॉन्गार्डेनियर्स: मैंने एक पॉवरशेल स्क्रिप्ट जोड़ी है जो क्वेरी करती है। अफसोस की बात है, मेरा पर्ल ज्ञान और भी बुरा है :)
डेर होकस्टाप्लर

यह एक अच्छा शुरुआती बिंदु है, लेकिन मुझे यह पता लगाना होगा कि आउटपुट को कम करने से कैसे रोका जाए।
जॉन गार्डनियर्स

@ जॉनहार्डियर्स: यह है कि पावरशेल डिफ़ॉल्ट रूप से दी गई वस्तुओं को कैसे प्रदर्शित करता है। आप myscript.ps1 | flएक अलग (नॉन-ट्रंकेटेड) आउटपुट प्राप्त करने के लिए स्क्रिप्ट को चला सकते हैं ।
डेर होकस्टाप्लर

मैंने आपको अपने प्रयास के लिए पुरस्कृत करने का फैसला किया है, लेकिन आपको 24 घंटे इंतजार करना होगा। सिस्टम मुझे तुरंत इनाम देने की अनुमति नहीं देगा।
जॉन गार्डनियर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.