WSUS রিপোর্টটি একটি গোষ্ঠীর অনুমোদনের জন্য v


9

আমি এক বা একাধিক গ্রুপের জন্য অনুমোদিত না হওয়া কম্পিউটার গ্রুপ এ এর ​​জন্য অনুমোদিত হওয়া আপডেটের ডাব্লুএসইউস প্রতিবেদন তৈরির উপায় খুঁজতে চেষ্টা করছি। বিকল্পভাবে, একটি সারণী প্রতিবেদন যা প্রতিটি আপডেট এবং প্রতিটি গ্রুপের অনুমোদনের স্থিতি তালিকাভুক্ত করে, যাতে আমার যা প্রয়োজন তা উত্তোলনের জন্য এটি প্রক্রিয়া করা যায়। ডাব্লুএসইউজে নিজেই এ জাতীয় একটি প্রতিবেদন বলে মনে হচ্ছে না, বা কমপক্ষে আমি খুঁজে পাচ্ছি না, সুতরাং এই জাতীয় একটি প্রতিবেদন তৈরির একটি স্ক্রিপ্ট সবচেয়ে স্বাগত।


আপনার ডাব্লুএসইউস উইন্ডোজের কোন সংস্করণটি চলছে?
নাট

@ নেট, এটি ডাব্লুএসইউস 3.2.7600.226 একটি সার্ভার ২০০৮ আর 2 স্ট্যান্ডার্ড bit৪ বিট মেশিনে চলছে।
জন গার্ডেনিয়ার্স

আমি মনে করি আপনার কাছে আমার একটি সমাধান আছে, আমাকে কয়েক দিন এবং আমি নিশ্চিত করব
নট

উত্তর:


8

এই পাওয়ারশেল স্ক্রিপ্টটি আপনার প্রাথমিক অনুরোধটি ঠিক তাই করেছিল। একটি কম্পিউটার গ্রুপ পরীক্ষা করুন এবং এক বা একাধিক কম্পিউটার গোষ্ঠীর জন্য অনুমোদিত নয় এমন আপডেটগুলি সন্ধান করুন।

দ্রষ্টব্য আপনার এটি কোনও WSUS সার্ভার বা এমন কোনও মেশিনে চালানো দরকার যা ডাব্লুএসইউএস অ্যাডমিন সরঞ্জাম ইনস্টল করা আছে।

কনফিগারেশন

সেট $targetComputerGroupকম্পিউটার Group এ আপনি একটি বেসলাইন হিসেবে সেট ব্যবহার করতে চান $CheckForMissingগোষ্ঠী বা গ্রুপ তোমাকে দেখতে যদি তারা জন্য অনুমোদিত হয়েছে চান নাম করে। দ্রষ্টব্য: কেবলমাত্র কোমা বিচ্ছিন্ন করতে গুণমানগুলি করতে ("গ্রুপ 1, গ্রুপ 2")

$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
            }
        }
    }
}

সম্পূর্ণ হয়ে গেলে আপনার আউটপুট যেমন: এখানে চিত্র বর্ণনা লিখুন

যদি স্ক্রিনে আউটপুট না দিয়ে আপনি তালিকাটি কোনও সিএসভিতে রফতানি করতে চান তবে নীচের অংশটি নীচের কোডের সাথে প্রতিস্থাপন করুন:

   $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"

এটি কাজ করে! আপনি কি জানেন কীভাবে আউটপুটটি কেটে ফেলা যায়? বিটিডাব্লু, আমি আরও 9 ঘন্টা এই অনুগ্রহটি দিতে পারি না।
জন গার্ডেনিয়ার্স

1
কাণ্ড কীভাবে পর্দার জন্য পাওয়ার শেল ফর্ম্যাটগুলির একটি ফাংশন। আমি সিএসভি ফাইলে আউটপুট দেওয়ার উদাহরণ সহ উত্তরটি আপডেট করেছি যাতে আপনার সম্পূর্ণ মান থাকতে পারে।
নাট

দুর্দান্ত, কারণ সিএসভি আমার প্রয়োজনের জন্য খুব উপযুক্ত very এখান থেকে আমি এটি পার্লকে খাওয়াতে পারি, যেখানে আমি কী করছি তা কমপক্ষে আমি জানি। অনেক প্রশংসিত.
জন গার্ডেনিয়ার্স

7

কেউ ডাব্লুএসইউ ডাটাবেসে "সহজভাবে" সংযুক্ত হয়ে এর বিরুদ্ধে অনুসন্ধান চালাতে পারে:

  1. উন্নত সুবিধাগুলি সহ এসকিউএল পরিচালনা স্টুডিও শুরু করুন।
  2. উইন্ডোজ প্রমাণীকরণ\\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query ব্যবহার করে কানেক্ট করুন ।

এই টেবিলগুলি আপনার প্রশ্ন সম্পর্কিত আগ্রহী বলে মনে হচ্ছে:

  • tbUpdate
    একক আপডেটগুলি সম্পর্কে তথ্য ধারণ করে

  • tbTargetGroup
    সমস্ত কম্পিউটার গ্রুপ সম্পর্কে তথ্য ধারণ করে

  • tbDeployment
    কোন কম্পিউটার গ্রুপগুলির জন্য কোন আপডেটগুলি অনুমোদিত হয়েছে সে সম্পর্কে তথ্য ধারণ করে

তবে, vUpdateApprovalআপনার পরে থাকা বেশিরভাগ তথ্য পুনরুদ্ধার করার জন্য ইতিমধ্যে বিদ্যমান ভিউটি ব্যবহার করা উপকারী বলে মনে হচ্ছে , কারণ এই দৃশ্যটি ইতিমধ্যে অন্যান্য জিনিসের মধ্যে ActionIDথেকে কলামটি অনুবাদ করে tbDeployment

vUpdateApprovalদৃশ্য অবশ্য আপডেটের জন্য কোনো সহজে পাঠযোগ্য শিরোনাম অন্তর্ভুক্ত নয়। শিরোনামগুলি সাধারণত পাঠ করা হয় tbLocalizedProperty। এটা আমাদের জন্য সহজ করতে, আরেকটা দৃশ্য আছে: vUpdate

আপনার প্রথম অনুরোধটি মাপসই করবে এমন যথাযথ ক্যোয়ারী তৈরি করতে আমার কাছে আমাদের ডাব্লুএসএস ডাটাবেসে যথাযথ তথ্য নেই (এবং আমি এটি অন্ধভাবে তৈরি করতে যথেষ্ট আত্মবিশ্বাসী নই))। সুতরাং এখানে আপনার দ্বিতীয় অনুরোধ জন্য একটি পদ্ধতির। যদি আমি জগাখিচুবি না করি তবে এটি সমস্ত আপডেটের সমস্ত তালিকা এবং সমস্ত দলের জন্য অনুমোদনের স্থিতি তৈরি করে।

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 টি ডিফল্ট গ্রুপ সহ আমাদের এসবিএসের জন্য, এটি 2615 ডলারে 121558 ফলাফল সারি তৈরি করে। সুতরাং, আপনি যদি কোয়েরিটি নিয়ে খেলতে চান SELECT TOP 1000তবে পরীক্ষার সময় প্রথম লাইনটি পরিবর্তন করার পরামর্শ দেওয়া যেতে পারে ।

আমি এগুলি একটি পাওয়ারশেল স্ক্রিপ্টে গুটিয়ে রাখার জন্য সময়ও দিয়েছিলাম:

# 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পরীক্ষার সময় আপনার শেল বন্যা এড়াতে এই স্ক্রিপ্টটিতে সীমাবদ্ধতা অন্তর্ভুক্ত রয়েছে ।


এটি অবশ্যই তদন্ত করার মতো কিছু। এমএস এসকিউএল সার্ভারের সাথে ইন্টারেক্ট করার জন্য একটি পার্ল মডিউল রয়েছে।
জন গার্ডেনিয়ার্স

@ জনগার্ডিনিয়ার্স: আমি একটি পাওয়ারশেল স্ক্রিপ্ট যুক্ত করেছি যা ক্যোরিটি সম্পাদন করে। দুঃখের বিষয়, আমার পার্ল জ্ঞানটি আরও খারাপ :)
ডের হচস্টাপলার

এটি একটি ভাল সূচনা পয়েন্ট তবে আমাকে কীভাবে আউটপুট কেটে নেওয়া যায় তা বন্ধ করতে হবে।
জন গার্ডেনিয়ার্স

@ জনগার্ডিনিয়ার্স: ঠিক একইভাবে পাওয়ারশেল ফিরে আসা অবজেক্টগুলি ডিফল্টরূপে প্রদর্শন করে। আপনি স্ক্রিপ্টটি চালাতে myscript.ps1 | flপারেন কোনও আলাদা (বিচ্ছিন্ন) আউটপুট পেতে।
ডের হচস্টাপলার

আমি আপনার চেষ্টার জন্য আপনাকে পুরষ্কার করার সিদ্ধান্ত নিয়েছে তবে আপনাকে 24 ঘন্টা অপেক্ষা করতে হবে। সিস্টেম আমাকে তাত্ক্ষণিকভাবে কোনও অনুদানের অনুমতি দেবে না।
জন গার্ডেনিয়ার্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.