diff --git a/.github/workflows/copy-to-CSS-SystemCenter-OperationsManager.yml b/.github/workflows/copy-to-CSS-SystemCenter-OperationsManager.yml index bcc146a..ef68ef3 100644 --- a/.github/workflows/copy-to-CSS-SystemCenter-OperationsManager.yml +++ b/.github/workflows/copy-to-CSS-SystemCenter-OperationsManager.yml @@ -4,11 +4,11 @@ name: Copy Files to microsoft/CSS-SystemCenter-OperationsManager # Controls when the workflow will run on: - # Triggers the workflow on push or pull request events but only for the "master" branch + # Triggers the workflow on push or pull request events but only for the master branch push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] + branches: [ master ] + #pull_request: + #branches: [ master ] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -25,12 +25,12 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3 + - uses: actions/checkout@main - name: Push Powershell directory to microsoft/CSS-SystemCenter-OperationsManager # You may pin to the exact commit or the version. # uses: datalbry/copy_folder_to_another_repo_action@f4ceec0eb4df6da5e4fe043dbc38c698a8ff4401 - uses: datalbry/copy_folder_to_another_repo_action@1.0.1 + uses: datalbry/copy_folder_to_another_repo_action@master with: # Source folder from the origin directory source_folder: Powershell @@ -52,7 +52,7 @@ jobs: - name: Push SQL directory to microsoft/CSS-SystemCenter-OperationsManager # You may pin to the exact commit or the version. # uses: datalbry/copy_folder_to_another_repo_action@f4ceec0eb4df6da5e4fe043dbc38c698a8ff4401 - uses: datalbry/copy_folder_to_another_repo_action@1.0.1 + uses: datalbry/copy_folder_to_another_repo_action@master with: # Source folder from the origin directory source_folder: 'SQL Queries' @@ -74,7 +74,7 @@ jobs: - name: Push ManagementPacks directory to microsoft/CSS-SystemCenter-OperationsManager # You may pin to the exact commit or the version. # uses: datalbry/copy_folder_to_another_repo_action@f4ceec0eb4df6da5e4fe043dbc38c698a8ff4401 - uses: datalbry/copy_folder_to_another_repo_action@1.0.1 + uses: datalbry/copy_folder_to_another_repo_action@master with: # Source folder from the origin directory source_folder: 'ManagementPacks' diff --git a/.github/workflows/push-changes-to-blakedrumm-fileshare.yml b/.github/workflows/push-changes-to-blakedrumm-fileshare.yml index 94dc451..b85bc1a 100644 --- a/.github/workflows/push-changes-to-blakedrumm-fileshare.yml +++ b/.github/workflows/push-changes-to-blakedrumm-fileshare.yml @@ -24,11 +24,11 @@ jobs: name: Copy Files to Blake Drumm - File Repository runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + - uses: actions/checkout@main - name: Copy Operations Manager Powershell to Blake Drumm - File Repository # You may pin to the exact commit or the version. # uses: AbleLincoln/push-to-sftp@a6c117bb60fdc94ab8e5b139cdb0b19bea582c81 - uses: AbleLincoln/push-to-sftp@v1.2 + uses: AbleLincoln/push-to-sftp@main with: # SFTP server host: ${{ secrets.HOST }} @@ -46,7 +46,7 @@ jobs: - name: Copy AutomatedLab Powershell to Blake Drumm - File Repository # You may pin to the exact commit or the version. # uses: AbleLincoln/push-to-sftp@a6c117bb60fdc94ab8e5b139cdb0b19bea582c81 - uses: AbleLincoln/push-to-sftp@v1.2 + uses: AbleLincoln/push-to-sftp@main with: # SFTP server host: ${{ secrets.HOST }} @@ -65,7 +65,7 @@ jobs: - name: Copy Operations Manager SQL Queries to Blake Drumm - File Repository # You may pin to the exact commit or the version. # uses: AbleLincoln/push-to-sftp@a6c117bb60fdc94ab8e5b139cdb0b19bea582c81 - uses: AbleLincoln/push-to-sftp@v1.2 + uses: AbleLincoln/push-to-sftp@main with: # SFTP server host: ${{ secrets.HOST }} diff --git a/Powershell/Create-PortableSCOMPSModule.ps1 b/Powershell/Create-PortableSCOMPSModule.ps1 index 355829f..03b763b 100644 --- a/Powershell/Create-PortableSCOMPSModule.ps1 +++ b/Powershell/Create-PortableSCOMPSModule.ps1 @@ -277,6 +277,7 @@ Write-Output "`$(Time-Stamp)Completed importing the SCOM PowerShell Module!" } elseif (`$Action -eq 'Uninstall') { + # Remove GAC assemblies Get-ChildItem "`$Path\Microsoft.EnterpriseManagement*" | % { `$resolvedPath = (Resolve-Path `$gacPath\`$(`$_.Name) -ErrorAction SilentlyContinue) if (`$resolvedPath) @@ -286,23 +287,41 @@ elseif (`$Action -eq 'Uninstall') } } + # Remove Server folder `$resolvedPath = Resolve-Path `$serverFolder -ErrorAction SilentlyContinue if (`$resolvedPath) { Remove-Item -Path `$resolvedPath -Force -Recurse } + # Remove Console folder `$resolvedPath = Resolve-Path `$consoleFolder -ErrorAction SilentlyContinue if (`$resolvedPath) { Remove-Item -Path `$resolvedPath -Force -Recurse } + # Remove PowerShell folder `$resolvedPath = Resolve-Path `$powerShellFolder -ErrorAction SilentlyContinue if (`$resolvedPath) { Remove-Item -Path `$resolvedPath -Force -Recurse } + + # Remove the module path from PSModulePath environment variable + `$envVariableArray = [Environment]::GetEnvironmentVariable("PSModulePath", "Machine") -split ';' + if (`$envVariableArray -contains `$powerShellFolder) + { + `$envVariableArray = `$envVariableArray -ne `$powerShellFolder + `$newEnvVariable = `$envVariableArray -join ';' + [Environment]::SetEnvironmentVariable("PSModulePath", `$newEnvVariable, "Machine") + Write-Output "`$(Time-Stamp) - Removed module from the machine level environmental variable (PSModulePath)" + } + else + { + Write-Output "`$(Time-Stamp) - PowerShell module folder was not found in PSModulePath" + } + Write-Output "`$(Time-Stamp)Completed removing the SCOM PowerShell Module!" } "@ diff --git a/Powershell/General Functions/Get-UserRights.ps1 b/Powershell/General Functions/Get-UserRights.ps1 index b1f42c5..0fe5744 100644 --- a/Powershell/General Functions/Get-UserRights.ps1 +++ b/Powershell/General Functions/Get-UserRights.ps1 @@ -1,71 +1,124 @@ <# .SYNOPSIS - Get Local User Account rights from the Local Security Policy - + Retrieves local user account rights from the local or remote machine's security policy. + .DESCRIPTION - This script will gather the local security policy User Rights from the local, or a remote machine. - + This script gathers the local security policy user rights assignments from the local machine or specified remote machines. It allows you to output the results to the console, a file (CSV or Text), or pass the results through the pipeline for further processing. + .PARAMETER ComputerName - Comma separated list of servers you want to run this script against. To run locally, run without this switch. - + Specifies a comma-separated list of servers to run this script against. To run locally, omit this parameter. This parameter accepts values from the pipeline. + + .PARAMETER UserName + Specifies the usernames to filter the results. Use this parameter to retrieve user rights assignments for specific users. Provide the username in the format: domain\Username. If omitted, all user rights assignments will be retrieved. + .PARAMETER FileOutputPath - Location to store the Output File. Set the Type (CSV or Text) with FileOutputType - + Specifies the location where the output file will be stored. Use this parameter in combination with -FileOutputType to define the output format. + .PARAMETER FileOutputType - Set the type of file you would like to output as. Combine with the OutputPath parameter. - + Specifies the type of file to output. Valid options are 'CSV' or 'Text'. This parameter should be used with -FileOutputPath. + .PARAMETER PassThru - Output as an object that you can manipulate / access. - + Indicates that the script should output the results as objects to the pipeline, allowing for further manipulation or filtering. + .EXAMPLE - Usage: - Get Local User Account Rights and output to text in console: - PS C:\> .\Get-UserRights.ps1 - - Get Remote Server User Account Rights: - PS C:\> .\Get-UserRights.ps1 -ComputerName SQL.contoso.com - - Get Local Machine and Multiple Server User Account Rights: - PS C:\> .\Get-UserRights.ps1 -ComputerName $env:COMPUTERNAME, SQL.contoso.com - - Output to CSV in 'C:\Temp': - PS C:\> .\Get-UserRights.ps1 -FileOutputPath C:\Temp -FileOutputType CSV - - Output to Text in 'C:\Temp': - PS C:\> .\Get-UserRights.ps1 -FileOutputPath C:\Temp -FileOutputType Text - Pass thru object: - PS C:\> .\Get-UserRights.ps1 -ComputerName SQL.contoso.com -PassThru | Where {$_.Principal -match "Administrator"} - + Get local user account rights and output to the console: + + PS C:\> .\Get-UserRights.ps1 + + .EXAMPLE + Get user account rights from a remote server: + + PS C:\> .\Get-UserRights.ps1 -ComputerName SQL.contoso.com + + .EXAMPLE + Get user account rights from the local machine and multiple remote servers: + + PS C:\> .\Get-UserRights.ps1 -ComputerName "$env:COMPUTERNAME", "SQL.contoso.com" + + .EXAMPLE + Get user account rights for specific users on a remote server: + + PS C:\> .\Get-UserRights.ps1 -ComputerName SQL.contoso.com -UserName "CONTOSO\User1", "CONTOSO\User2" + + .EXAMPLE + Output results to a CSV file in 'C:\Temp': + + PS C:\> .\Get-UserRights.ps1 -FileOutputPath C:\Temp -FileOutputType CSV + + .EXAMPLE + Output results to a text file in 'C:\Temp': + + PS C:\> .\Get-UserRights.ps1 -FileOutputPath C:\Temp -FileOutputType Text + + .EXAMPLE + Pass through objects and filter for a specific Privilege name: + + PS C:\> .\Get-UserRights.ps1 -ComputerName SQL.contoso.com -PassThru | Where-Object { $_.PrivilegeName -eq "Deny log on locally" } + .NOTES - This script is located in the following GitHub Repository: https://github.com/blakedrumm/SCOM-Scripts-and-SQL - Exact location: https://github.com/blakedrumm/SCOM-Scripts-and-SQL/blob/master/Powershell/General%20Functions/Get-UserRights.ps1 - - Blog post: https://blakedrumm.com/blog/set-and-check-user-rights-assignment/ - Author: Blake Drumm (blakedrumm@microsoft.com) First Created on: June 10th, 2021 - Last Modified on: August 15th, 2022 + Last Modified on: October 7th, 2024 + + GitHub Repository: + https://github.com/blakedrumm/SCOM-Scripts-and-SQL + + Exact Location: + https://github.com/blakedrumm/SCOM-Scripts-and-SQL/blob/master/Powershell/General%20Functions/Get-UserRights.ps1 + + ------------------------------------------------------------------------------ + + MIT License + Copyright (c) Microsoft + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + + .LINK + https://blakedrumm.com/blog/set-and-check-user-rights-assignment/ #> + [CmdletBinding()] -[OutputType([string])] param ( [Parameter(ValueFromPipeline = $true, Position = 0, - HelpMessage = '(Server1, Server2) Comma separated list of servers you want to run this script against. To run locally, run without this switch. This argument accepts values from the pipeline.')] - [Alias('servers')] + HelpMessage = '(Server1, Server2) Comma-separated list of servers you want to run this script against. To run locally, run without this parameter. This argument accepts values from the pipeline.')] + [Alias('Computers', 'Servers')] [array]$ComputerName, [Parameter(Position = 1, - HelpMessage = '(ex. C:\Temp) Location to store the Output File. Set the Type with FileOutputType')] - [string]$FileOutputPath, + HelpMessage = 'Specifies the usernames to filter the results.')] + [Alias('User', 'Principal')] + [array]$UserName, [Parameter(Position = 2, - HelpMessage = '(CSV or Text) Set the type of file you would like to output as. Combine with the OutputPath parameter.')] - [ValidateSet('CSV', 'Text', '')] - [string]$FileOutputType, + HelpMessage = '(e.g., C:\Temp) Location to store the output file. Set the type with FileOutputType.')] + [Alias('Path', 'OutputDirectory')] + [string]$FileOutputPath, [Parameter(Position = 3, - HelpMessage = 'Output as an object that you can manipulate / access.')] + HelpMessage = '(CSV or Text) Sets the type of file you would like to output. Combine with the FileOutputPath parameter.')] + [ValidateSet('CSV', 'Text', 'None')] + [Alias('Type', 'OutputFileType')] + [string]$FileOutputType = "None", + [Parameter(Position = 4, + HelpMessage = 'Outputs the result as an object that you can manipulate or access.')] [switch]$PassThru ) + BEGIN { #region Initialization @@ -107,9 +160,222 @@ BEGIN $TimeStamp = Get-Date -Format "MM/dd/yyyy hh:mm:ss tt" return "$TimeStamp - " } + function Get-SecurityPolicy + { + param + ( + $UserName + ) + #requires -version 2 + # Fail script if we can't find SecEdit.exe + $SecEdit = Join-Path ([Environment]::GetFolderPath([Environment+SpecialFolder]::System)) "SecEdit.exe" + if (-not (Test-Path $SecEdit)) + { + Write-Error "File not found - '$SecEdit'" -Category ObjectNotFound + return + } + Write-Verbose "Found Executable: $SecEdit" + + # LookupPrivilegeDisplayName Win32 API doesn't resolve logon right display + # names, so use this hashtable + $UserLogonRights = @{ + "SeAssignPrimaryTokenPrivilege" = "Replace a process level token" + "SeAuditPrivilege" = "Generate security audits" + "SeBackupPrivilege" = "Back up files and directories" + "SeBatchLogonRight" = "Log on as a batch job" + "SeChangeNotifyPrivilege" = "Bypass traverse checking" + "SeCreateGlobalPrivilege" = "Create global objects" + "SeCreatePagefilePrivilege" = "Create a pagefile" + "SeCreatePermanentPrivilege" = "Create permanent shared objects" + "SeCreateSymbolicLinkPrivilege" = "Create symbolic links" + "SeCreateTokenPrivilege" = "Create a token object" + "SeDebugPrivilege" = "Debug programs" + "SeDenyBatchLogonRight" = "Deny log on as a batch job" + "SeDenyInteractiveLogonRight" = "Deny log on locally" + "SeDenyNetworkLogonRight" = "Deny access to this computer from the network" + "SeDenyRemoteInteractiveLogonRight" = "Deny log on through Remote Desktop Services" + "SeDenyServiceLogonRight" = "Deny log on as a service" + "SeEnableDelegationPrivilege" = "Enable computer and user accounts to be trusted for delegation" + "SeImpersonatePrivilege" = "Impersonate a client after authentication" + "SeIncreaseBasePriorityPrivilege" = "Increase scheduling priority" + "SeIncreaseQuotaPrivilege" = "Adjust memory quotas for a process" + "SeIncreaseWorkingSetPrivilege" = "Increase a process working set" + "SeInteractiveLogonRight" = "Allow log on locally" + "SeLoadDriverPrivilege" = "Load and unload device drivers" + "SeLockMemoryPrivilege" = "Lock pages in memory" + "SeMachineAccountPrivilege" = "Add workstations to domain" + "SeManageVolumePrivilege" = "Perform volume maintenance tasks" + "SeNetworkLogonRight" = "Access this computer from the network" + "SeProfileSingleProcessPrivilege" = "Profile single process" + "SeRelabelPrivilege" = "Modify an object label" + "SeRemoteInteractiveLogonRight" = "Allow log on through Remote Desktop Services" + "SeRemoteShutdownPrivilege" = "Force shutdown from a remote system" + "SeRestorePrivilege" = "Restore files and directories" + "SeSecurityPrivilege" = "Manage auditing and security log" + "SeServiceLogonRight" = "Log on as a service" + "SeShutdownPrivilege" = "Shut down the system" + "SeSyncAgentPrivilege" = "Synchronize directory service data" + "SeSystemEnvironmentPrivilege" = "Modify firmware environment values" + "SeSystemProfilePrivilege" = "Profile system performance" + "SeSystemtimePrivilege" = "Change the system time" + "SeTakeOwnershipPrivilege" = "Take ownership of files or other objects" + "SeTcbPrivilege" = "Act as part of the operating system" + "SeTimeZonePrivilege" = "Change the time zone" + "SeTrustedCredManAccessPrivilege" = "Access Credential Manager as a trusted caller" + "SeUndockPrivilege" = "Remove computer from docking station" + "SeDelegateSessionUserImpersonatePrivilege" = "Obtain an impersonation token for another user in the same session" + "SeSynchronizePrivilege" = "Required to use the object wait functions" + "SePrivilegeNotHeld" = "Privilege not held" + } + try + { + # Attempt to reference the 'Win32.AdvApi32' type to check if it already exists. + # Casting to [void] suppresses any output or errors if the type doesn't exist. + [void][Win32.AdvApi32] + } + catch + { + # If the type does not exist, an exception is thrown and caught here. + # We proceed to define the type using the Add-Type cmdlet. + + # Use Add-Type to define a new .NET type in C# code. + # The -TypeDefinition parameter accepts a string containing the C# code. + Add-Type -TypeDefinition @" + // Include necessary namespaces for the C# code. + using System; + using System.Runtime.InteropServices; + using System.Text; + + // Define a namespace called 'Win32' to contain our class. + namespace Win32 + { + // Define a public class 'AdvApi32' to hold our P/Invoke method. + public class AdvApi32 + { + // Use the DllImport attribute to import the 'LookupPrivilegeDisplayName' function from 'advapi32.dll'. + // SetLastError = true allows us to retrieve error information if the call fails. + [DllImport("advapi32.dll", SetLastError = true)] + public static extern bool LookupPrivilegeDisplayName( + string systemName, // The name of the target system (null for local). + string privilegeName, // The name of the privilege to look up. + StringBuilder displayName, // A StringBuilder to receive the privilege's display name. + ref uint cbDisplayName, // The size of the displayName buffer; updated with the actual size used. + out uint languageId // Receives the language identifier for the returned display name. + ); + } + } +"@ -PassThru | Out-Null + # -PassThru outputs the generated type, but we pipe it to Out-Null to suppress output. + } + + + # Use LookupPrivilegeDisplayName Win32 API to get display name of privilege + # (except for user logon rights) + function Get-PrivilegeDisplayName + { + param ( + [String]$name # The privilege name to look up + ) + + # Create a StringBuilder object to receive the display name of the privilege + $displayNameSB = New-Object System.Text.StringBuilder 1024 + $languageId = 0 + + # Call the LookupPrivilegeDisplayName API function to get the display name + $ok = [Win32.AdvApi32]::LookupPrivilegeDisplayName($null, $name, $displayNameSB, [Ref]$displayNameSB.Capacity, [Ref]$languageId) + + # If the API call is successful, return the display name as a string + if ($ok) + { + return $displayNameSB.ToString() + } + # If the API call fails, check the hashtable for the privilege name + else + { + # Use an if statement to check if the key exists in the hashtable + if ($UserLogonRights[$name]) + { + return $UserLogonRights[$name] + } + else + { + return $name + } + } + } + + + # Outputs list of hashtables as a PSObject + function Out-Object + { + param ( + [System.Collections.Hashtable[]]$hashData + ) + $order = @() + $result = @{ } + $hashData | ForEach-Object { + $order += ($_.Keys -as [Array])[0] + $result += $_ + } + $out = New-Object PSObject -Property $result | Select-Object $order + return $out + } + # Translates a SID in the form *S-1-5-... to its account name; + function Get-AccountName + { + param ( + [String]$principal + ) + try + { + $sid = New-Object System.Security.Principal.SecurityIdentifier($principal.Substring(1)) + $sid.Translate([Security.Principal.NTAccount]) + } + catch { $principal } + } + $TemplateFilename = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName()) + $LogFilename = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName()) + $StdOut = & $SecEdit /export /cfg $TemplateFilename /areas USER_RIGHTS /log $LogFilename + Write-Verbose "$StdOut" + if ($LASTEXITCODE -eq 0) + { + $dtable = $null + $dtable = New-Object System.Data.DataTable + $dtable.Columns.Add("Privilege", "System.String") | Out-Null + $dtable.Columns.Add("PrivilegeName", "System.String") | Out-Null + $dtable.Columns.Add("Principal", "System.String") | Out-Null + $dtable.Columns.Add("ComputerName", "System.String") | Out-Null + Select-String '^(Se\S+) = (\S+)' $TemplateFilename | Foreach-Object { + $Privilege = $_.Matches[0].Groups[1].Value + $Principals = $_.Matches[0].Groups[2].Value -split ',' + foreach ($Principal in $Principals) + { + $PrincipalName = Get-AccountName $Principal + + # If $UserName is provided, filter the output + if (-not $UserName -or ($UserName -contains $PrincipalName)) + { + $nRow = $dtable.NewRow() + $nRow.Privilege = $Privilege + $nRow.PrivilegeName = Get-PrivilegeDisplayName $Privilege + $nRow.Principal = $PrincipalName + $nRow.ComputerName = $env:COMPUTERNAME + $dtable.Rows.Add($nRow) + } + } + return $dtable + } + } + else + { + $OFS = "" + Write-Error "$StdOut" + } + Remove-Item $TemplateFilename, $LogFilename -ErrorAction SilentlyContinue + } if (!$PassThru) { - Write-Output "$(Time-Stamp)Starting main script execution." + Write-Output "$(Time-Stamp)Starting get user rights script execution." } #endregion Initialization } @@ -122,19 +388,24 @@ PROCESS ( [Parameter(ValueFromPipeline = $true, Position = 0, - HelpMessage = '(Server1, Server2) Comma separated list of servers you want to run this script against. To run locally, run without this switch. This argument accepts values from the pipeline.')] - [Alias('servers')] + HelpMessage = '(Server1, Server2) Comma-separated list of servers you want to run this script against. To run locally, run without this parameter. This argument accepts values from the pipeline.')] + [Alias('Computers', 'Servers')] [array]$ComputerName, [Parameter(Position = 1, - HelpMessage = '(ex. C:\Temp) Location to store the Output File. Set the Type with FileOutputType')] + HelpMessage = 'Specifies the usernames to filter the results.')] + [Alias('User', 'Principal')] + [array]$UserName, + [Parameter(Position = 2, + HelpMessage = '(e.g., C:\Temp) Location to store the output file. Set the type with FileOutputType.')] + [Alias('Path', 'OutputDirectory')] [string]$FileOutputPath, - [Parameter(Mandatory = $false, - Position = 2, - HelpMessage = '(CSV or Text) Set the type of file you would like to output as. Combine with the OutputPath parameter.')] - [ValidateSet('CSV', 'Text', '')] - [string]$FileOutputType, [Parameter(Position = 3, - HelpMessage = 'Output as an object that you can manipulate / access.')] + HelpMessage = '(CSV or Text) Sets the type of file you would like to output. Combine with the FileOutputPath parameter.')] + [ValidateSet('CSV', 'Text', 'None')] + [Alias('Type', 'OutputFileType')] + [string]$FileOutputType = "None", + [Parameter(Position = 4, + HelpMessage = 'Outputs the result as an object that you can manipulate or access.')] [switch]$PassThru ) if (!$ComputerName) @@ -151,266 +422,19 @@ PROCESS #region Non-LocalMachine if ($ComputerName -notmatch $env:COMPUTERNAME) { + $GetSecurityPolicyFunction = "function Get-SecurityPolicy { ${function:Get-SecurityPolicy} }" $localrights += Invoke-Command -ScriptBlock { - param ([int]$VerbosePreference) - function Get-SecurityPolicy - { - #requires -version 2 - # Fail script if we can't find SecEdit.exe - $SecEdit = Join-Path ([Environment]::GetFolderPath([Environment+SpecialFolder]::System)) "SecEdit.exe" - if (-not (Test-Path $SecEdit)) - { - Write-Error "File not found - '$SecEdit'" -Category ObjectNotFound - return - } - Write-Verbose "Found Executable: $SecEdit" - # LookupPrivilegeDisplayName Win32 API doesn't resolve logon right display - # names, so use this hashtable - $UserLogonRights = @{ - "SeBatchLogonRight" = "Log on as a batch job" - "SeDenyBatchLogonRight" = "Deny log on as a batch job" - "SeDenyInteractiveLogonRight" = "Deny log on locally" - "SeDenyNetworkLogonRight" = "Deny access to this computer from the network" - "SeDenyRemoteInteractiveLogonRight" = "Deny log on through Remote Desktop Services" - "SeDenyServiceLogonRight" = "Deny log on as a service" - "SeInteractiveLogonRight" = "Allow log on locally" - "SeNetworkLogonRight" = "Access this computer from the network" - "SeRemoteInteractiveLogonRight" = "Allow log on through Remote Desktop Services" - "SeServiceLogonRight" = "Log on as a service" - } - # Create type to invoke LookupPrivilegeDisplayName Win32 API - $Win32APISignature = @' -[DllImport("advapi32.dll", SetLastError=true)] -public static extern bool LookupPrivilegeDisplayName( - string systemName, - string privilegeName, - System.Text.StringBuilder displayName, - ref uint cbDisplayName, - out uint languageId -); -'@ - $AdvApi32 = Add-Type advapi32 $Win32APISignature -Namespace LookupPrivilegeDisplayName -PassThru - # Use LookupPrivilegeDisplayName Win32 API to get display name of privilege - # (except for user logon rights) - function Get-PrivilegeDisplayName - { - param ( - [String]$name - ) - $displayNameSB = New-Object System.Text.StringBuilder 1024 - $languageId = 0 - $ok = $AdvApi32::LookupPrivilegeDisplayName($null, $name, $displayNameSB, [Ref]$displayNameSB.Capacity, [Ref]$languageId) - if ($ok) - { - $displayNameSB.ToString() - } - else - { - # Doesn't lookup logon rights, so use hashtable for that - if ($UserLogonRights[$name]) - { - $UserLogonRights[$name] - } - else - { - $name - } - } - } - # Outputs list of hashtables as a PSObject - function Out-Object - { - param ( - [System.Collections.Hashtable[]]$hashData - ) - $order = @() - $result = @{ } - $hashData | ForEach-Object { - $order += ($_.Keys -as [Array])[0] - $result += $_ - } - $out = New-Object PSObject -Property $result | Select-Object $order - return $out - } - # Translates a SID in the form *S-1-5-... to its account name; - function Get-AccountName - { - param ( - [String]$principal - ) - try - { - $sid = New-Object System.Security.Principal.SecurityIdentifier($principal.Substring(1)) - $sid.Translate([Security.Principal.NTAccount]) - } - catch { $principal } - } - $TemplateFilename = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName()) - $LogFilename = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName()) - $StdOut = & $SecEdit /export /cfg $TemplateFilename /areas USER_RIGHTS /log $LogFilename - Write-Verbose "$StdOut" - if ($LASTEXITCODE -eq 0) - { - $dtable = $null - $dtable = New-Object System.Data.DataTable - $dtable.Columns.Add("Privilege", "System.String") | Out-Null - $dtable.Columns.Add("PrivilegeName", "System.String") | Out-Null - $dtable.Columns.Add("Principal", "System.String") | Out-Null - $dtable.Columns.Add("ComputerName", "System.String") | Out-Null - Select-String '^(Se\S+) = (\S+)' $TemplateFilename | Foreach-Object { - $Privilege = $_.Matches[0].Groups[1].Value - $Principals = $_.Matches[0].Groups[2].Value -split ',' - foreach ($Principal in $Principals) - { - $nRow = $dtable.NewRow() - $nRow.Privilege = $Privilege - $nRow.PrivilegeName = Get-PrivilegeDisplayName $Privilege - $nRow.Principal = Get-AccountName $Principal - $nRow.ComputerName = $env:COMPUTERNAME - $dtable.Rows.Add($nRow) - } - return $dtable - } - } - else - { - $OFS = "" - Write-Error "$StdOut" - } - Remove-Item $TemplateFilename, $LogFilename -ErrorAction SilentlyContinue - } - return Get-SecurityPolicy - } -ArgumentList $VerbosePreference -computer $ComputerName -HideComputerName | Select-Object * -ExcludeProperty RunspaceID, PSShowComputerName, PSComputerName -Unique + param ($GetSecurityPolicyFunctionContents, + $UserName, + [int]$VerbosePreference) + . ([ScriptBlock]::Create($GetSecurityPolicyFunctionContents)) + return Get-SecurityPolicy -UserName $UserName + } -ArgumentList $GetSecurityPolicyFunction, $UserName, $VerbosePreference -ComputerName $ComputerName -HideComputerName | Select-Object * -ExcludeProperty RunspaceID, PSShowComputerName, PSComputerName -Unique } #endregion Non-LocalMachine - else #region LocalMachine + else + #region LocalMachine { - function Get-SecurityPolicy - { - #requires -version 2 - # Fail script if we can't find SecEdit.exe - $SecEdit = Join-Path ([Environment]::GetFolderPath([Environment+SpecialFolder]::System)) "SecEdit.exe" - if (-not (Test-Path $SecEdit)) - { - Write-Error "File not found - '$SecEdit'" -Category ObjectNotFound - return - } - Write-Verbose "Found Executable: $SecEdit" - # LookupPrivilegeDisplayName Win32 API doesn't resolve logon right display - # names, so use this hashtable - $UserLogonRights = @{ - "SeBatchLogonRight" = "Log on as a batch job" - "SeDenyBatchLogonRight" = "Deny log on as a batch job" - "SeDenyInteractiveLogonRight" = "Deny log on locally" - "SeDenyNetworkLogonRight" = "Deny access to this computer from the network" - "SeDenyRemoteInteractiveLogonRight" = "Deny log on through Remote Desktop Services" - "SeDenyServiceLogonRight" = "Deny log on as a service" - "SeInteractiveLogonRight" = "Allow log on locally" - "SeNetworkLogonRight" = "Access this computer from the network" - "SeRemoteInteractiveLogonRight" = "Allow log on through Remote Desktop Services" - "SeServiceLogonRight" = "Log on as a service" - } - # Create type to invoke LookupPrivilegeDisplayName Win32 API - $Win32APISignature = @' -[DllImport("advapi32.dll", SetLastError=true)] -public static extern bool LookupPrivilegeDisplayName( - string systemName, - string privilegeName, - System.Text.StringBuilder displayName, - ref uint cbDisplayName, - out uint languageId -); -'@ - $AdvApi32 = Add-Type advapi32 $Win32APISignature -Namespace LookupPrivilegeDisplayName -PassThru - # Use LookupPrivilegeDisplayName Win32 API to get display name of privilege - # (except for user logon rights) - function Get-PrivilegeDisplayName - { - param ( - [String]$name - ) - $displayNameSB = New-Object System.Text.StringBuilder 1024 - $languageId = 0 - $ok = $AdvApi32::LookupPrivilegeDisplayName($null, $name, $displayNameSB, [Ref]$displayNameSB.Capacity, [Ref]$languageId) - if ($ok) - { - $displayNameSB.ToString() - } - else - { - # Doesn't lookup logon rights, so use hashtable for that - if ($UserLogonRights[$name]) - { - $UserLogonRights[$name] - } - else - { - $name - } - } - } - # Outputs list of hashtables as a PSObject - function Out-Object - { - param ( - [System.Collections.Hashtable[]]$hashData - ) - $order = @() - $result = @{ } - $hashData | ForEach-Object { - $order += ($_.Keys -as [Array])[0] - $result += $_ - } - $out = New-Object PSObject -Property $result | Select-Object $order - return $out - } - # Translates a SID in the form *S-1-5-... to its account name; - function Get-AccountName - { - param ( - [String]$principal - ) - try - { - $sid = New-Object System.Security.Principal.SecurityIdentifier($principal.Substring(1)) - $sid.Translate([Security.Principal.NTAccount]) - } - catch { $principal } - } - $TemplateFilename = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName()) - $LogFilename = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName()) - $StdOut = & $SecEdit /export /cfg $TemplateFilename /areas USER_RIGHTS /log $LogFilename - Write-Verbose "$StdOut" - if ($LASTEXITCODE -eq 0) - { - $dtable = $null - $dtable = New-Object System.Data.DataTable - $dtable.Columns.Add("Privilege", "System.String") | Out-Null - $dtable.Columns.Add("PrivilegeName", "System.String") | Out-Null - $dtable.Columns.Add("Principal", "System.String") | Out-Null - $dtable.Columns.Add("ComputerName", "System.String") | Out-Null - Select-String '^(Se\S+) = (\S+)' $TemplateFilename | Foreach-Object { - $Privilege = $_.Matches[0].Groups[1].Value - $Principals = $_.Matches[0].Groups[2].Value -split ',' - foreach ($Principal in $Principals) - { - $nRow = $dtable.NewRow() - $nRow.Privilege = $Privilege - $nRow.PrivilegeName = Get-PrivilegeDisplayName $Privilege - $nRow.Principal = Get-AccountName $Principal - $nRow.ComputerName = $env:COMPUTERNAME - $dtable.Rows.Add($nRow) - } - return $dtable - } - } - else - { - $OFS = "" - Write-Error "$StdOut" - } - Remove-Item $TemplateFilename, $LogFilename -ErrorAction SilentlyContinue - } - $localrights += Get-SecurityPolicy + $localrights += Get-SecurityPolicy -UserName $UserName } #endregion LocalMachine $output += $localrights if (!$PassThru) @@ -434,36 +458,38 @@ public static extern bool LookupPrivilegeDisplayName( else { #region FileOutputType - if ($FileOutputType -eq 'Text') - { - Write-Output "$(Time-Stamp)Writing output to `'$FileOutputPath\UserLogonRights.txt`'." - $output | Format-Table -AutoSize | Out-String -Width 2048 | Out-File "$FileOutputPath\UserLogonRights.txt" -Force - } - elseif ($FileOutputType -eq 'CSV') - { - Write-Output "$(Time-Stamp)Writing output to `'$FileOutputPath\UserLogonRights.csv`'." - $output | Export-CSV $FileOutputPath\UserLogonRights.csv -NoTypeInformation - } - else - { - Write-Output "Unsupported File Output Type." + switch ($FileOutputType) { + 'Text' { + Write-Output "$(Time-Stamp)Writing output to `'$FileOutputPath\UserLogonRights.txt`'." + $output | Format-Table -AutoSize | Out-String -Width 2048 | Out-File "$FileOutputPath\UserLogonRights.txt" -Force + } + 'CSV' { + Write-Output "$(Time-Stamp)Writing output to `'$FileOutputPath\UserLogonRights.csv`'." + $output | Export-CSV $FileOutputPath\UserLogonRights.csv -NoTypeInformation + } + default { + Write-Output "Unsupported File Output Type." + } } #endregion FileOutputType } } #endregion MainFunctionSection - if ($FileOutputPath -or $FileOutputType -or $ComputerName -or $PassThru) + if ($FileOutputPath -or $UserName -or $FileOutputType -or $ComputerName -or $PassThru) { - Get-UserRights -FileOutputPath:$FileOutputPath -FileOutputType:$FileOutputType -ComputerName:$ComputerName -PassThru:$PassThru + Get-UserRights -UserName $UserName -FileOutputPath:$FileOutputPath -FileOutputType:$FileOutputType -ComputerName:$ComputerName -PassThru:$PassThru } else { - <# Edit line 467 to modify the default command run when this script is executed. - Example for output multiple servers to a text file: - Get-UserRights -ComputerName MS01-2019, IIS-2019 -FileOutputPath C:\Temp -FileOutputType Text - Example for gathering locally: - Get-UserRights - #> + <# + Edit line 493 to modify the default command run when this script is executed. + Example: + - For outputting multiple servers to a text file: + Get-UserRights -ComputerName MS01-2019, IIS-2019 -FileOutputPath C:\Temp -FileOutputType Text + + - Example for gathering locally: + Get-UserRights + #> Get-UserRights } } @@ -471,218 +497,220 @@ END { Write-Verbose "$(Time-Stamp)Script Completed!" } - -# SIG # Begin signature block -# MIInlQYJKoZIhvcNAQcCoIInhjCCJ4ICAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBhR0JZ8h2Qz0Rd -# FP++DBymbhTy4yeaI/Eq85nv0wLCBKCCDXYwggX0MIID3KADAgECAhMzAAACy7d1 -# OfsCcUI2AAAAAALLMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD -# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy -# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p -# bmcgUENBIDIwMTEwHhcNMjIwNTEyMjA0NTU5WhcNMjMwNTExMjA0NTU5WjB0MQsw -# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u -# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy -# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -# AQC3sN0WcdGpGXPZIb5iNfFB0xZ8rnJvYnxD6Uf2BHXglpbTEfoe+mO//oLWkRxA -# wppditsSVOD0oglKbtnh9Wp2DARLcxbGaW4YanOWSB1LyLRpHnnQ5POlh2U5trg4 -# 3gQjvlNZlQB3lL+zrPtbNvMA7E0Wkmo+Z6YFnsf7aek+KGzaGboAeFO4uKZjQXY5 -# RmMzE70Bwaz7hvA05jDURdRKH0i/1yK96TDuP7JyRFLOvA3UXNWz00R9w7ppMDcN -# lXtrmbPigv3xE9FfpfmJRtiOZQKd73K72Wujmj6/Su3+DBTpOq7NgdntW2lJfX3X -# a6oe4F9Pk9xRhkwHsk7Ju9E/AgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE -# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUrg/nt/gj+BBLd1jZWYhok7v5/w4w -# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW -# MBQGA1UEBRMNMjMwMDEyKzQ3MDUyODAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci -# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j -# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG -# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu -# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 -# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAJL5t6pVjIRlQ8j4dAFJ -# ZnMke3rRHeQDOPFxswM47HRvgQa2E1jea2aYiMk1WmdqWnYw1bal4IzRlSVf4czf -# zx2vjOIOiaGllW2ByHkfKApngOzJmAQ8F15xSHPRvNMmvpC3PFLvKMf3y5SyPJxh -# 922TTq0q5epJv1SgZDWlUlHL/Ex1nX8kzBRhHvc6D6F5la+oAO4A3o/ZC05OOgm4 -# EJxZP9MqUi5iid2dw4Jg/HvtDpCcLj1GLIhCDaebKegajCJlMhhxnDXrGFLJfX8j -# 7k7LUvrZDsQniJZ3D66K+3SZTLhvwK7dMGVFuUUJUfDifrlCTjKG9mxsPDllfyck -# 4zGnRZv8Jw9RgE1zAghnU14L0vVUNOzi/4bE7wIsiRyIcCcVoXRneBA3n/frLXvd -# jDsbb2lpGu78+s1zbO5N0bhHWq4j5WMutrspBxEhqG2PSBjC5Ypi+jhtfu3+x76N -# mBvsyKuxx9+Hm/ALnlzKxr4KyMR3/z4IRMzA1QyppNk65Ui+jB14g+w4vole33M1 -# pVqVckrmSebUkmjnCshCiH12IFgHZF7gRwE4YZrJ7QjxZeoZqHaKsQLRMp653beB -# fHfeva9zJPhBSdVcCW7x9q0c2HVPLJHX9YCUU714I+qtLpDGrdbZxD9mikPqL/To -# /1lDZ0ch8FtePhME7houuoPcMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq -# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x -# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv -# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -# IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG -# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG -# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg -# Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -# CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 -# a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr -# rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg -# OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy -# 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 -# sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh -# dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k -# A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB -# w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn -# Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 -# lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w -# ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o -# ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD -# VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa -# BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny -# bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG -# AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t -# L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV -# HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 -# dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG -# AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl -# AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb -# C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l -# hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 -# I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 -# wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 -# STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam -# ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa -# J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah -# XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA -# 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt -# Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr -# /Xmfwb1tbWrJUnMTDXpQzTGCGXUwghlxAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw -# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN -# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp -# Z25pbmcgUENBIDIwMTECEzMAAALLt3U5+wJxQjYAAAAAAsswDQYJYIZIAWUDBAIB -# BQCggbAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO -# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIPN7PbSgF1cuGGyP7hwfc21P -# ng2apXjGVbhbBGMKB6gTMEQGCisGAQQBgjcCAQwxNjA0oBSAEgBNAGkAYwByAG8A -# cwBvAGYAdKEcgBpodHRwczovL3d3dy5taWNyb3NvZnQuY29tIDANBgkqhkiG9w0B -# AQEFAASCAQB31dkDpaEsSAJTIZonsJ0v4KPwRxTLCHypwvuHSfB2XuVj1UVut+gP -# oMJlY3coAR5DoDPp1E406HhpN1ndOFKVmVEGAKG1M+2mZEBsvcriVFit6Mggcr98 -# LYD5sHfvbZOUHDbtadJ3cLyCD4Rrw/FIHvjmLdEUpVdmB37GXIS6mUZCOviQ0kGR -# 6y58vCry2flPGtXyMvhOjT3AbcbVODtlkt2nP0jNN/UcqWYMI7rplr/S8dljGO2o -# zWTgTRK56ulhF/0eIuW6kdP+3mspVH9wYCBAwt8lmhpn6lmYXzbwUbGwhSdon2Ui -# W7DvIyOkcXxgh8E9cZaa5+aWJvKucYBsoYIW/TCCFvkGCisGAQQBgjcDAwExghbp -# MIIW5QYJKoZIhvcNAQcCoIIW1jCCFtICAQMxDzANBglghkgBZQMEAgEFADCCAVEG -# CyqGSIb3DQEJEAEEoIIBQASCATwwggE4AgEBBgorBgEEAYRZCgMBMDEwDQYJYIZI -# AWUDBAIBBQAEIDFKR2nlckUXMg5smGb/GFl7I+sQGps7xAhCwvSSe/zhAgZjbOxy -# qokYEzIwMjIxMTI5MjAzMDMyLjIzM1owBIACAfSggdCkgc0wgcoxCzAJBgNVBAYT -# AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD -# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBB -# bWVyaWNhIE9wZXJhdGlvbnMxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOjNCQkQt -# RTMzOC1FOUExMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNl -# oIIRVDCCBwwwggT0oAMCAQICEzMAAAHGMM0u1tOhwPQAAQAAAcYwDQYJKoZIhvcN -# AQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV -# BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQG -# A1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjIxMTA0MTkw -# MTM0WhcNMjQwMjAyMTkwMTM0WjCByjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh -# c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD -# b3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9u -# czEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046M0JCRC1FMzM4LUU5QTExJTAjBgNV -# BAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEB -# AQUAA4ICDwAwggIKAoICAQDvvSI6vq/geTWbdJmP7UFH+K6h+/5/p5VvsdzbVjHM -# DOujgbqQpcXjtgCwSCtZZPWiC+nQiugWbwJ1FlN/8OVDR9s0072kIDTUonTfMfzY -# KWaT3N72vWM8nVkloyexmYDLtWlj2Y2pf12E++dbX9nFtuIe/urDCDD1TZJPmZ9y -# k+62wj9Cv+AsLppMjdQJjOJU9n9B9qDw1CEqSkdk7cqvmvzdzLuPPg5Y/LkzZaK1 -# a/lsknmsFNbnXxA8TMXDOrx7w/vbYJYpkkWM3x60GCwrTmAd4do32SaWlgkkvzi/ -# 0mJpfs0UmQ5GECkQVmJQhpmgvEm3ilwEPN/5YP1QCNEoKsCx4n9yTNC86f3lfg63 -# hqyc642FwJ1xBZytmjKQWYRqhiSuwPuf/icUUfAkMpRoFhlkvA+Pu7HjxLVh75wx -# xwzF1FKO6gbiuomqkR3qDN/Pbf2/fov4u06VCF8vlydyWE1JZ2YrDVMfJ6Qf3pE2 -# 06kgTtz71Oey/VoT2GmF6Ms4nF+xdOTLDQUh2KVzQI/vPNSypoIYXaYVdHAviN9f -# VHJXtAYoR46m8ZmpAosdVlssPfbO1bwt+/33FDbh39MjE70tF64eyfCi2f7wGwKv -# O77/bi85wD1dyl3uQh5bjOZTGEWy/goJ+Koym1mGEwADRKoO6PbdyPXSyZdE4tSe -# FQIDAQABo4IBNjCCATIwHQYDVR0OBBYEFHFf+UeJKEQKnWfaUxrobW4u82CUMB8G -# A1UdIwQYMBaAFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCG -# Tmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUy -# MFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4w -# XAYIKwYBBQUHMAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2Vy -# dHMvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwG -# A1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQELBQAD -# ggIBAAvMXvbiNe6ANTjzo8wFhHsJzpoevackOcayeSrBliaNGLbyq/pLUvLvvbPC -# bkMjXz3OABD33GESNbq5iStflSu1W7slRA/psEEEn3xzbwUAg8grd+RA0K/avFGN -# 9AwlJ1zCwl5Mrst3T064DmFjg9YIGAml9jvUtxpfPcVHwA08VfrNwphuBg5mt6C2 -# kO5vfg3RCFHvBz8VyZX6Dgjch1MCgwPb9Yjlmx8pPMFSf9TcClSE3Bs6XlhIL5/1 -# LUtK1tkvA/MxL58s9clRJ7tJK+yl9Kyv9UR7ShCGZpH7m9yr7swvDzrVYFWFiknt -# MHlgFLk5E71d0htylsEXBwc+ZvyJmpIipb0mmAbvr7k1BQs9XNnvnPlbZHlmLJCS -# 2IekzCNfY47b1nz6dPDa06xUJzDMf0ugQt52/c+NylvA7IuO2bVPhcdh3ept30Ne -# gGM1iRKN2Lfuk2nny76shOW0so6ONAInCPUWme4FjzbkHkLS4L81gRIQqxOJwSOF -# L/i6MFctw0YOFUGXa8cTqpj9hbiTLW9zKm9SuwbzWCm/b7z+KE7CDjBMs7teqKR4 -# iJTdlYBQCg6lOXXi151CrFsdMO94lhHc5TTIoHbHB/zsRYIBvQImKaEObJBooS9J -# XR8tb2JXIjTBhwbhXZpU3pOtniav599qoNAP0X4ek+E/SmUDMIIHcTCCBVmgAwIB -# AgITMwAAABXF52ueAptJmQAAAAAAFTANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UE -# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc -# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0 -# IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMjEwOTMwMTgyMjI1 -# WhcNMzAwOTMwMTgzMjI1WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu -# Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv -# cmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCC -# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOThpkzntHIhC3miy9ckeb0O -# 1YLT/e6cBwfSqWxOdcjKNVf2AX9sSuDivbk+F2Az/1xPx2b3lVNxWuJ+Slr+uDZn -# hUYjDLWNE893MsAQGOhgfWpSg0S3po5GawcU88V29YZQ3MFEyHFcUTE3oAo4bo3t -# 1w/YJlN8OWECesSq/XJprx2rrPY2vjUmZNqYO7oaezOtgFt+jBAcnVL+tuhiJdxq -# D89d9P6OU8/W7IVWTe/dvI2k45GPsjksUZzpcGkNyjYtcI4xyDUoveO0hyTD4MmP -# frVUj9z6BVWYbWg7mka97aSueik3rMvrg0XnRm7KMtXAhjBcTyziYrLNueKNiOSW -# rAFKu75xqRdbZ2De+JKRHh09/SDPc31BmkZ1zcRfNN0Sidb9pSB9fvzZnkXftnIv -# 231fgLrbqn427DZM9ituqBJR6L8FA6PRc6ZNN3SUHDSCD/AQ8rdHGO2n6Jl8P0zb -# r17C89XYcz1DTsEzOUyOArxCaC4Q6oRRRuLRvWoYWmEBc8pnol7XKHYC4jMYcten -# IPDC+hIK12NvDMk2ZItboKaDIV1fMHSRlJTYuVD5C4lh8zYGNRiER9vcG9H9stQc -# xWv2XFJRXRLbJbqvUAV6bMURHXLvjflSxIUXk8A8FdsaN8cIFRg/eKtFtvUeh17a -# j54WcmnGrnu3tz5q4i6tAgMBAAGjggHdMIIB2TASBgkrBgEEAYI3FQEEBQIDAQAB -# MCMGCSsGAQQBgjcVAgQWBBQqp1L+ZMSavoKRPEY1Kc8Q/y8E7jAdBgNVHQ4EFgQU -# n6cVXQBeYl2D9OXSZacbUzUZ6XIwXAYDVR0gBFUwUzBRBgwrBgEEAYI3TIN9AQEw -# QTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9E -# b2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQB -# gjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/ -# MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJ -# oEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01p -# Y1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYB -# BQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9v -# Q2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqGSIb3DQEBCwUAA4ICAQCdVX38Kq3h -# LB9nATEkW+Geckv8qW/qXBS2Pk5HZHixBpOXPTEztTnXwnE2P9pkbHzQdTltuw8x -# 5MKP+2zRoZQYIu7pZmc6U03dmLq2HnjYNi6cqYJWAAOwBb6J6Gngugnue99qb74p -# y27YP0h1AdkY3m2CDPVtI1TkeFN1JFe53Z/zjj3G82jfZfakVqr3lbYoVSfQJL1A -# oL8ZthISEV09J+BAljis9/kpicO8F7BUhUKz/AyeixmJ5/ALaoHCgRlCGVJ1ijbC -# HcNhcy4sa3tuPywJeBTpkbKpW99Jo3QMvOyRgNI95ko+ZjtPu4b6MhrZlvSP9pEB -# 9s7GdP32THJvEKt1MMU0sHrYUP4KWN1APMdUbZ1jdEgssU5HLcEUBHG/ZPkkvnNt -# yo4JvbMBV0lUZNlz138eW0QBjloZkWsNn6Qo3GcZKCS6OEuabvshVGtqRRFHqfG3 -# rsjoiV5PndLQTHa1V1QJsWkBRH58oWFsc/4Ku+xBZj1p/cvBQUl+fpO+y/g75LcV -# v7TOPqUxUYS8vwLBgqJ7Fx0ViY1w/ue10CgaiQuPNtq6TPmb/wrpNPgkNWcr4A24 -# 5oyZ1uEi6vAnQj0llOZ0dFtq0Z4+7X6gMTN9vMvpe784cETRkPHIqzqKOghif9lw -# Y1NNje6CbaUFEMFxBmoQtB1VM1izoXBm8qGCAsswggI0AgEBMIH4oYHQpIHNMIHK -# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk -# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxN -# aWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMSYwJAYDVQQLEx1UaGFsZXMgVFNT -# IEVTTjozQkJELUUzMzgtRTlBMTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3Rh -# bXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUALTXK5iYhW+yiRJpwmZZ7wy7ZAW2g -# gYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G -# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYw -# JAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0B -# AQUFAAIFAOcwduUwIhgPMjAyMjExMjkyMDE3NDFaGA8yMDIyMTEzMDIwMTc0MVow -# dDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA5zB25QIBADAHAgEAAgIN+TAHAgEAAgIR -# 1DAKAgUA5zHIZQIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAow -# CAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBBQUAA4GBACtLkv3nfUlo -# zlZEkQW8zSZ61C7Y/HTNCzisSAu/jhP5IKzTxgvTHLN0MPDMNleofyEX6eTC2dTd -# W+kqqmHmSAckrfFoyxHT/SmkOmfkWPvtVHCpulMOEL/PW6u9jkt0VkLpB1cajfxI -# Wir6wRLHcoQsa5zhyuEtcujR03PBzm+YMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UE -# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc -# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0 -# IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAHGMM0u1tOhwPQAAQAAAcYwDQYJYIZI -# AWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG -# 9w0BCQQxIgQgyv2+wXrnyfKaZ2uJ+P1IR6r/CWgBVhsH48ArniKf0q0wgfoGCyqG -# SIb3DQEJEAIvMYHqMIHnMIHkMIG9BCBWMRNcVcm9mCnGJmqT8HANYDk/HDqF6FQu -# mQWv2uOvLTCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n -# dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y -# YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMz -# AAABxjDNLtbTocD0AAEAAAHGMCIEIHrbXOJO2hDklVfy03X5RY4OZVKo5h/03iC4 -# HvOjzTpvMA0GCSqGSIb3DQEBCwUABIICAGScLLvDYsYFOeMLczGQhGvZdvOoiM3b -# Ly+wDXiRITyEThUTrKB+0xu9kMyMRSKSYOX92eD7sXuX+W2Tq+AjhTaCZh/NYCsZ -# oqZwAViNiUWyO4/95/s+M3sv96d8j+xwPO+ZtjdDxTRqRckiEPn0Dt+ac53ELbZ9 -# Yd+gaZJhOIEzi67cQvZu/n3BF+d9YO6Jkh4ySx6zBA3UsFSLCkPHoJDN+mjxYauA -# +qlm1tMq/gjO1qhQy6ZP2nyQj7APhJ67QqiESSP/AeHuT9Yi/vzrEDVDDFu0j2DQ -# OiW3ywS3mKc1mOJx16FbNFTrPc13H4V9iRuPhTsAw+0/QZn6gy6HDYQF+ccxD20T -# iky+a/dA8eS1JaozCRiZ8xoCkHqrrY6SfaU/I+W/wsb+6n65pvtHBr0H88zLc8DO -# 6ild2yhxanKwxxyNEElcLkaC+GRmq+fQq4v4uqtbNEG93Ob4/aFBbMRB0cy3yJtO -# PRIva+2VXINo/Je3mgii0aBqFWWhiTMiZRCWVkxjBQ2xDQWFuseH7g5qEk4gcaEe -# CS2r52c0M95Ji1JXN0e4kSRvxFeoef+VGoCmvfJc2Cz5Nc7pRmgfe2Pswk9hBTpI -# kfyb9N5cRYzdm5MexA7uD39cr/bgb/qBCDWV767MGKKmuaciun2grLoYjwFQNxWT -# Q+BDYBzFXQWd -# SIG # End signature block +# SIG # Begin signature block +# MIIoLAYJKoZIhvcNAQcCoIIoHTCCKBkCAQExDzANBglghkgBZQMEAgEFADB5Bgor +# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG +# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDPUev2LU+LYSgW +# crI/Twa49PPriwKaWNVwqg2rs4T4jKCCDXYwggX0MIID3KADAgECAhMzAAAEBGx0 +# Bv9XKydyAAAAAAQEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD +# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy +# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p +# bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTE0WhcNMjUwOTExMjAxMTE0WjB0MQsw +# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u +# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy +# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +# AQC0KDfaY50MDqsEGdlIzDHBd6CqIMRQWW9Af1LHDDTuFjfDsvna0nEuDSYJmNyz +# NB10jpbg0lhvkT1AzfX2TLITSXwS8D+mBzGCWMM/wTpciWBV/pbjSazbzoKvRrNo +# DV/u9omOM2Eawyo5JJJdNkM2d8qzkQ0bRuRd4HarmGunSouyb9NY7egWN5E5lUc3 +# a2AROzAdHdYpObpCOdeAY2P5XqtJkk79aROpzw16wCjdSn8qMzCBzR7rvH2WVkvF +# HLIxZQET1yhPb6lRmpgBQNnzidHV2Ocxjc8wNiIDzgbDkmlx54QPfw7RwQi8p1fy +# 4byhBrTjv568x8NGv3gwb0RbAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE +# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU8huhNbETDU+ZWllL4DNMPCijEU4w +# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW +# MBQGA1UEBRMNMjMwMDEyKzUwMjkyMzAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci +# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j +# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG +# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu +# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 +# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAIjmD9IpQVvfB1QehvpC +# Ge7QeTQkKQ7j3bmDMjwSqFL4ri6ae9IFTdpywn5smmtSIyKYDn3/nHtaEn0X1NBj +# L5oP0BjAy1sqxD+uy35B+V8wv5GrxhMDJP8l2QjLtH/UglSTIhLqyt8bUAqVfyfp +# h4COMRvwwjTvChtCnUXXACuCXYHWalOoc0OU2oGN+mPJIJJxaNQc1sjBsMbGIWv3 +# cmgSHkCEmrMv7yaidpePt6V+yPMik+eXw3IfZ5eNOiNgL1rZzgSJfTnvUqiaEQ0X +# dG1HbkDv9fv6CTq6m4Ty3IzLiwGSXYxRIXTxT4TYs5VxHy2uFjFXWVSL0J2ARTYL +# E4Oyl1wXDF1PX4bxg1yDMfKPHcE1Ijic5lx1KdK1SkaEJdto4hd++05J9Bf9TAmi +# u6EK6C9Oe5vRadroJCK26uCUI4zIjL/qG7mswW+qT0CW0gnR9JHkXCWNbo8ccMk1 +# sJatmRoSAifbgzaYbUz8+lv+IXy5GFuAmLnNbGjacB3IMGpa+lbFgih57/fIhamq +# 5VhxgaEmn/UjWyr+cPiAFWuTVIpfsOjbEAww75wURNM1Imp9NJKye1O24EspEHmb +# DmqCUcq7NqkOKIG4PVm3hDDED/WQpzJDkvu4FrIbvyTGVU01vKsg4UfcdiZ0fQ+/ +# V0hf8yrtq9CkB8iIuk5bBxuPMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq +# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x +# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv +# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +# IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG +# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG +# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg +# Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +# CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 +# a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr +# rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg +# OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy +# 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 +# sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh +# dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k +# A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB +# w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn +# Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 +# lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w +# ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o +# ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD +# VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa +# BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny +# bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG +# AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t +# L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV +# HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 +# dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG +# AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl +# AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb +# C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l +# hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 +# I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 +# wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 +# STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam +# ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa +# J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah +# XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA +# 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt +# Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr +# /Xmfwb1tbWrJUnMTDXpQzTGCGgwwghoIAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw +# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN +# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp +# Z25pbmcgUENBIDIwMTECEzMAAAQEbHQG/1crJ3IAAAAABAQwDQYJYIZIAWUDBAIB +# BQCggbAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO +# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIPg9N2LWIDv8Ol6yaXwYzoRC +# uGpT65ffNV+Gn11N0L9PMEQGCisGAQQBgjcCAQwxNjA0oBSAEgBNAGkAYwByAG8A +# cwBvAGYAdKEcgBpodHRwczovL3d3dy5taWNyb3NvZnQuY29tIDANBgkqhkiG9w0B +# AQEFAASCAQBWHptQ3yJ8ukrEAQrar8C3R/qKwFKHA97cU5NxfudtWc9sNf7GjWJa +# x6F4+yc8n/e0qLdhW6KlyvhY22l2s+6ddd8PMPEtTXlIKGyLvwPk3HyKRERagnyu +# EfFQ0/7fYh1WtCyuaPo+PSnhwIIFEwY80qaZcZvlM7+KUz+xlDpTnSb2rOBEzC+U +# 1aB2fLpIi+D9SYOBfa1pQrgKIkZ4X1b02p0vVFT74VcB6NnAslNx9bjIIbcKGQOu +# JLYEwq2w1wnqo9+rv1tSRslRw6e9CHDDP97FoFq3KFCbl+doKfHicyrQRk4PgDgx +# jLHp2KL6X6GRCNa22EJfbD9zbYtTtZpMoYIXlDCCF5AGCisGAQQBgjcDAwExgheA +# MIIXfAYJKoZIhvcNAQcCoIIXbTCCF2kCAQMxDzANBglghkgBZQMEAgEFADCCAVIG +# CyqGSIb3DQEJEAEEoIIBQQSCAT0wggE5AgEBBgorBgEEAYRZCgMBMDEwDQYJYIZI +# AWUDBAIBBQAEIJS1QmW7MFCydtlurlgvF8pHTP9wBboty81zrnTM4sdlAgZnGoQ7 +# CPQYEzIwMjQxMTA1MjMxNTA5LjgzNFowBIACAfSggdGkgc4wgcsxCzAJBgNVBAYT +# AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD +# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBB +# bWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo3RjAw +# LTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vydmlj +# ZaCCEeowggcgMIIFCKADAgECAhMzAAAB8Cp8HVk75h+tAAEAAAHwMA0GCSqGSIb3 +# DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD +# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAk +# BgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTIzMTIwNjE4 +# NDU1MVoXDTI1MDMwNTE4NDU1MVowgcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX +# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg +# Q29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlv +# bnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo3RjAwLTA1RTAtRDk0NzElMCMG +# A1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCAiIwDQYJKoZIhvcN +# AQEBBQADggIPADCCAgoCggIBALUeLVOjOHc7RzMTzF9GevKaUk0JoZaiaY/LR4g1 +# /7gQmvut/y1LOWATwiXhmPjxPl9NM4CHqchNF/aUrv66lydn/GDQAqgNikFA5asv +# 05sVKHKUgd+v8NDg+xFfwZG0ie4mwyTBKDrdt8HhDZSKQwQ/8K1keLzFble0Aqn3 +# lyzea9QIy8gADzcmv9TIAMAIldVTiZpiKxzNTPsnXXV4PUqsb2ZD4hOCdFH9fbFM +# MwLP6KjxlkUcbARmD5ze+Y+nzubg6o4pbKFyoxS6k+947+BAL1G/izMs0YNqh494 +# rohTQmpwaNerFtwShL+zWEKA93tTHphZ5atRdrFtv4miyA5rNSBQazVqqmcuPPRg +# p9SqfyLlNuZHV2oSVHhAD45l95WGlOiesziwT8yUnUkulHYXAAgdR4x+i1c1CLK1 +# h9EFQ4kcV4lgR+VmBWTRfH/iRkF3OAVA85Z9V3Y2jNeULZ6ka1SNqW4Daiw69Adn +# MY6gpO9ZQ9f30yywY5s7TEkd3QPKA/8kBWn5tEYmpra7sCoubb60BPbrIjm95xwO +# Y1myDe8OHUdykIlr1ClFb8wPdr4AXbKBXWxGcZVRUbdU4NfcGEZPxMxT8aJTLeHs +# KVc7GZn7B4K4g7MKRMNsrk6UBLypI+mCn5caU4sQ9ozfUyB/phOmkBp4/SimHHfj +# miG3AgMBAAGjggFJMIIBRTAdBgNVHQ4EFgQU0IKyp1dHL8yaNkZVMC/HtgVamyUw +# HwYDVR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYDVR0fBFgwVjBUoFKg +# UIZOaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0 +# JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwGCCsGAQUFBwEBBGAw +# XjBcBggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j +# ZXJ0cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcnQw +# DAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8E +# BAMCB4AwDQYJKoZIhvcNAQELBQADggIBADgi9JueviMQ+CjlbjGPf/7R0IbCzPzr +# dAZnaYH1nhLC0YYsy/B+xFSzc0iU8P8uxYDF1VgeSUDPAtPBDkz49F3L3YMZ+3IQ +# 4Ywd+63sarwvdFRy+u+vQAv80218SlsASQIXOx57G1jmzeHOPetfbC+gFmbbK2HB +# wt5mYyAdAKaNmn/bR8dYmCuM9iOx7pEMm1ROW9SyOv7zvz+36+tAQiqWZ5sJ4SL5 +# VBXFzvAXQu4xPD+AJZ1yoeiovnYmi3ErNjyNlJDtxw0eELh4cYVGlop6JJDQZe2V +# sYhs/iRbU7cnOUqN/AbrY0JK9+YzWI8P3RdiIWbv/yaBHXoCap58Ox+MEJbB/eqF +# 4gx+BnNap4TPyVoWYzwN2ReO44JAT/YvRPGGuNS10yQBN9d1mNhGWxwEPKvzMYyW +# msULstzGoJeWHGG13YIz6alxNzxEHYPcSivRR2g/fpD2vhdYJVX/YqfQBe29bG8h +# /I4WblouXR4TOSF+/9eZSUF44ISVLuN111akGVCMm4cdQeM5UZeWslPtfiGJwXWj +# bfHlT6Puo8oFx6vI/b/WjF+Ydzq4FeVcEq6RX9AJkFUCIExgmGeS1qRYemj24h5K +# dhPpDHvB/ZFq5gcgRHxItGZuUzM86z4kdDOu+HvFK3HfXQs6n7QNo5ezzGNm+Gmf +# 5a5mKPlGZmKMMIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJmQAAAAAAFTANBgkq +# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x +# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv +# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +# IDIwMTAwHhcNMjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1WjB8MQswCQYDVQQG +# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG +# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg +# VGltZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +# ggIBAOThpkzntHIhC3miy9ckeb0O1YLT/e6cBwfSqWxOdcjKNVf2AX9sSuDivbk+ +# F2Az/1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhgfWpSg0S3po5GawcU +# 88V29YZQ3MFEyHFcUTE3oAo4bo3t1w/YJlN8OWECesSq/XJprx2rrPY2vjUmZNqY +# O7oaezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/dvI2k45GPsjksUZzp +# cGkNyjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7mka97aSueik3rMvrg0Xn +# Rm7KMtXAhjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKRHh09/SDPc31BmkZ1 +# zcRfNN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn427DZM9ituqBJR6L8FA6PRc6ZN +# N3SUHDSCD/AQ8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyOArxCaC4Q6oRRRuLR +# vWoYWmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2ZItboKaDIV1fMHSRlJTY +# uVD5C4lh8zYGNRiER9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6bMURHXLvjflSxIUX +# k8A8FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6tAgMBAAGjggHdMIIB +# 2TASBgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQWBBQqp1L+ZMSavoKR +# PEY1Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXAYDVR0g +# BFUwUzBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5t +# aWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQM +# MAoGCCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQE +# AwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQ +# W9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNv +# bS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBa +# BggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0 +# LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqG +# SIb3DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/qXBS2Pk5HZHixBpOX +# PTEztTnXwnE2P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7pZmc6U03dmLq2HnjYNi6c +# qYJWAAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2CDPVtI1TkeFN1JFe53Z/z +# jj3G82jfZfakVqr3lbYoVSfQJL1AoL8ZthISEV09J+BAljis9/kpicO8F7BUhUKz +# /AyeixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTpkbKpW99Jo3QMvOyR +# gNI95ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32THJvEKt1MMU0sHrYUP4KWN1APMdU +# bZ1jdEgssU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138eW0QBjloZkWsNn6Qo +# 3GcZKCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQTHa1V1QJsWkBRH58oWFsc/4K +# u+xBZj1p/cvBQUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7Fx0ViY1w/ue10Cga +# iQuPNtq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0llOZ0dFtq0Z4+7X6gMTN9 +# vMvpe784cETRkPHIqzqKOghif9lwY1NNje6CbaUFEMFxBmoQtB1VM1izoXBm8qGC +# A00wggI1AgEBMIH5oYHRpIHOMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz +# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv +# cnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25z +# MScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046N0YwMC0wNUUwLUQ5NDcxJTAjBgNV +# BAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMV +# AMIoBkoq/mWx0LbKgwYpiJDLv2n/oIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzAR +# BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p +# Y3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3Rh +# bXAgUENBIDIwMTAwDQYJKoZIhvcNAQELBQACBQDq1NPPMCIYDzIwMjQxMTA1MTcy +# NjM5WhgPMjAyNDExMDYxNzI2MzlaMHQwOgYKKwYBBAGEWQoEATEsMCowCgIFAOrU +# 088CAQAwBwIBAAICIrgwBwIBAAICFEAwCgIFAOrWJU8CAQAwNgYKKwYBBAGEWQoE +# AjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkq +# hkiG9w0BAQsFAAOCAQEAfaxQYUIynkkHxuPO9r+WC1oWfUZ+8U20Hz6AzdUOrLcI +# LVxZvK8UWJ9rSYJip20DAjBXj7mRXYhjib/9svVvSJpT45yiMzbhfIzHTvCrr2Kb +# cPUwh2UPKywIheju4sU+hV3G1L+eseOfK8gUpcO5lcbT9/UbcLd8fzFAI+eq84TP +# 74Yobjq5/pIxA5QwePj9oiivYgGWeig1j5HlwXO+B3IVVT/Fp02e5g4uAF3r3Klv +# 1oLvaPAMDbovR/1lkEYFVs1COuCcAdK/ctir41WW6evvzrkDaYf+aixyRU1Nl5mC +# XfKivqkJqZertiLnBFTVYoyIexsfRe9P7LDuzfbvDDGCBA0wggQJAgEBMIGTMHwx +# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt +# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p +# Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB8Cp8HVk75h+tAAEAAAHw +# MA0GCWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQw +# LwYJKoZIhvcNAQkEMSIEICWObyjISprgZEsBFjihZYta9GGQPKAb+LosQ+GH8AyX +# MIH6BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgXAGao6Vy/eRTuYAHmxZHvhAU +# CJLqZv4IzpqycUBlS4swgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK +# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 +# IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg +# MjAxMAITMwAAAfAqfB1ZO+YfrQABAAAB8DAiBCCnxc901Pkrn9N0t24WnjZgkaBW +# Sqo0zGZEMJrdBQmLUTANBgkqhkiG9w0BAQsFAASCAgAmhYiK8EtVfkzgC6d4vN6D +# dCApb/D76nWyVLvooPDZwLCmU3AvXjZAq1iC7gCQ+uqms3c4CD2QxD+MAGm7cP5s +# rzOPcsK9yvFFLcRAThGMNIHNNkLa8gFgOfzSAMB0rKGvogzJYIyMRtmY4QfjYGOK +# uwCVRKaG7L9Z7xXCDTaHTjhtz3F8g2RYrv0gEI+G00OCpf7ZM3qki/IC2bF0j+Dr +# usPmtamqzpDJiltBHM9PJVvxSfPSW8huYQkNBi68Nx/aF2W76K39lpqOHxueQaQm +# 5EG5jtquPAT9ldosAjfxbRnto32mHSLGTbzxA8SKmsyolml/GBgLK1vjR4PwdXTm +# mXyQTOVRQniYZLiwcAGkAdvl0PTHxfXXvwYppDTG+DmQ9R1RxLdzZ3n38dwcdno9 +# ShuFBdbok6kPFSQrv5Ed7HPpexLOfKn5bN8Pfg5qEdZL9u6dZWMOmzS4yghLLmCt +# aBrQlqn44buxci+g7gmbrr0Urt81fXIT1A0RmNuQ6G4CR0Vvb2g49hPdVO4SxLl+ +# CYrlztCN5w0ZTrWtgmbKnyqcVOxc3jwsCCxFjbahs+2xFbTq9wCTtLrLEfZlJk/S +# zunVR9kLz/MT7nRR0dGcziIp+7clUkcRUaHq8SVihhvingJ9Yq9vxjtLQJtFOKRk +# 6YFe1pHsoo378UdW5YSHSw== +# SIG # End signature block diff --git a/Powershell/General Functions/Readme.md b/Powershell/General Functions/Readme.md index e08c499..5da830e 100644 --- a/Powershell/General Functions/Readme.md +++ b/Powershell/General Functions/Readme.md @@ -1,2 +1,3 @@ # General Functions -This page contains General Functions useful for Windows Operating Systems. + +This page contains General Functions useful for Windows Operating Systems. \ No newline at end of file diff --git a/Powershell/General Functions/Set-UserRights.ps1 b/Powershell/General Functions/Set-UserRights.ps1 index 2ddafb9..a877df0 100644 --- a/Powershell/General Functions/Set-UserRights.ps1 +++ b/Powershell/General Functions/Set-UserRights.ps1 @@ -1,134 +1,215 @@ <# - .Synopsis - Add and Remove User Right(s) for defined user(s) and computer(s). - - .DESCRIPTION - Add and Remove User Rights via Powershell. - - .PARAMETER AddRight - You want to Add a user right. - - .Parameter ComputerName - Defines the name of the computer where the user right should be granted. This can be multiple values, comma seperated. - Default is the local computer on which the script is run. - - .PARAMETER RemoveRight - You want to Remove a user right. - - .Parameter Username - Defines the Username under which the service should run. This can be multiple values, comma seperated. - Use the form: domain\Username. - Default is the user under which the script is run. - - .PARAMETER UserRight - Defines the User Right you want to set. This can be multiple values, comma seperated. - Name of the right you want to add to: SeServiceLogonRight - There is no default for this argument - - All of the Options you can use: - Replace a process level token (SeAssignPrimaryTokenPrivilege) - Generate security audits (SeAuditPrivilege) - Back up files and directories (SeBackupPrivilege) - Log on as a batch job (SeBatchLogonRight) - Bypass traverse checking (SeChangeNotifyPrivilege) - Create global objects (SeCreateGlobalPrivilege) - Create a pagefile (SeCreatePagefilePrivilege) - Create permanent shared objects (SeCreatePermanentPrivilege) - Create symbolic links (SeCreateSymbolicLinkPrivilege) - Create a token object (SeCreateTokenPrivilege) - Debug programs (SeDebugPrivilege) - Obtain an impersonation token for another user in the same session (SeDelegateSessionUserImpersonatePrivilege) - Deny log on as a batch job (SeDenyBatchLogonRight) - Deny log on locally (SeDenyInteractiveLogonRight) - Deny access to this computer from the network (SeDenyNetworkLogonRight) - Deny log on through Remote Desktop Services (SeDenyRemoteInteractiveLogonRight) - Deny log on as a service (SeDenyServiceLogonRight) - Enable computer and user accounts to be trusted for delegation (SeEnableDelegationPrivilege) - Impersonate a client after authentication (SeImpersonatePrivilege) - Increase scheduling priority (SeIncreaseBasePriorityPrivilege) - Adjust memory quotas for a process (SeIncreaseQuotaPrivilege) - Increase a process working set (SeIncreaseWorkingSetPrivilege) - Allow log on locally (SeInteractiveLogonRight) - Load and unload device drivers (SeLoadDriverPrivilege) - Lock pages in memory (SeLockMemoryPrivilege) - Add workstations to domain (SeMachineAccountPrivilege) - Perform volume maintenance tasks (SeManageVolumePrivilege) - Access this computer from the network (SeNetworkLogonRight) - Profile single process (SeProfileSingleProcessPrivilege) - Modify an object label (SeRelabelPrivilege) - Allow log on through Remote Desktop Services (SeRemoteInteractiveLogonRight) - Force shutdown from a remote system (SeRemoteShutdownPrivilege) - Restore files and directories (SeRestorePrivilege) - Manage auditing and security log (SeSecurityPrivilege) - Log on as a service (SeServiceLogonRight) - Shut down the system (SeShutdownPrivilege) - Synchronize directory service data (SeSyncAgentPrivilege) - Modify firmware environment values (SeSystemEnvironmentPrivilege) - Profile system performance (SeSystemProfilePrivilege) - Change the system time (SeSystemtimePrivilege) - Take ownership of files or other objects (SeTakeOwnershipPrivilege) - Act as part of the operating system (SeTcbPrivilege) - Change the time zone (SeTimeZonePrivilege) - Access Credential Manager as a trusted caller (SeTrustedCredManAccessPrivilege) - Remove computer from docking station (SeUndockPrivilege) - - .Example - Usage: - Single Users - Add User Right "Log on as a service" for CONTOSO\User: - .\Set-UserRights.ps1 -AddRight -Username CONTOSO\User -UserRight SeServiceLogonRight - - Add User Right "Log on as a batch job" for CONTOSO\User: - .\Set-UserRights.ps1 -AddRight -Username CONTOSO\User -UserRight SeBatchLogonRight + .SYNOPSIS + Add and Remove User Right(s) for defined user(s) and computer(s). + + .DESCRIPTION + Add and Remove User Rights via PowerShell. + + .PARAMETER AddRight + Specifies that you want to add a user right. - Remove User Right "Log on as a batch job" for CONTOSO\User: - .\Set-UserRights.ps1 -RemoveRight -Username CONTOSO\User -UserRight SeBatchLogonRight - - Add User Right "Allow log on locally" for current user: - .\Set-UserRights.ps1 -AddRight -UserRight SeInteractiveLogonRight + .PARAMETER RemoveRight + Specifies that you want to remove a user right. + + .PARAMETER ComputerName + Defines the name of the computer where the user right should be granted. This can be multiple values, comma-separated. + Default is the local computer on which the script is run. + + .PARAMETER Username + Defines the username(s) for which the user rights should be modified. This can be multiple values, comma-separated. + Use the form: domain\Username when possible. + Default is the user under which the script is run. + + .PARAMETER UserRight + Defines the user right(s) you want to set. This can be multiple values, comma-separated. + There is no default for this parameter. + + **Available Options:** + - Replace a process level token (SeAssignPrimaryTokenPrivilege) + - Generate security audits (SeAuditPrivilege) + - Back up files and directories (SeBackupPrivilege) + - Log on as a batch job (SeBatchLogonRight) + - Bypass traverse checking (SeChangeNotifyPrivilege) + - Create global objects (SeCreateGlobalPrivilege) + - Create a pagefile (SeCreatePagefilePrivilege) + - Create permanent shared objects (SeCreatePermanentPrivilege) + - Create symbolic links (SeCreateSymbolicLinkPrivilege) + - Create a token object (SeCreateTokenPrivilege) + - Debug programs (SeDebugPrivilege) + - Obtain an impersonation token for another user in the same session (SeDelegateSessionUserImpersonatePrivilege) + - Deny log on as a batch job (SeDenyBatchLogonRight) + - Deny log on locally (SeDenyInteractiveLogonRight) + - Deny access to this computer from the network (SeDenyNetworkLogonRight) + - Deny log on through Remote Desktop Services (SeDenyRemoteInteractiveLogonRight) + - Deny log on as a service (SeDenyServiceLogonRight) + - Enable computer and user accounts to be trusted for delegation (SeEnableDelegationPrivilege) + - Impersonate a client after authentication (SeImpersonatePrivilege) + - Increase scheduling priority (SeIncreaseBasePriorityPrivilege) + - Adjust memory quotas for a process (SeIncreaseQuotaPrivilege) + - Increase a process working set (SeIncreaseWorkingSetPrivilege) + - Allow log on locally (SeInteractiveLogonRight) + - Load and unload device drivers (SeLoadDriverPrivilege) + - Lock pages in memory (SeLockMemoryPrivilege) + - Add workstations to domain (SeMachineAccountPrivilege) + - Perform volume maintenance tasks (SeManageVolumePrivilege) + - Access this computer from the network (SeNetworkLogonRight) + - Profile single process (SeProfileSingleProcessPrivilege) + - Modify an object label (SeRelabelPrivilege) + - Allow log on through Remote Desktop Services (SeRemoteInteractiveLogonRight) + - Force shutdown from a remote system (SeRemoteShutdownPrivilege) + - Restore files and directories (SeRestorePrivilege) + - Manage auditing and security log (SeSecurityPrivilege) + - Log on as a service (SeServiceLogonRight) + - Shut down the system (SeShutdownPrivilege) + - Synchronize directory service data (SeSyncAgentPrivilege) + - Modify firmware environment values (SeSystemEnvironmentPrivilege) + - Profile system performance (SeSystemProfilePrivilege) + - Change the system time (SeSystemtimePrivilege) + - Take ownership of files or other objects (SeTakeOwnershipPrivilege) + - Act as part of the operating system (SeTcbPrivilege) + - Change the time zone (SeTimeZonePrivilege) + - Access Credential Manager as a trusted caller (SeTrustedCredManAccessPrivilege) + - Remove computer from docking station (SeUndockPrivilege) + + .EXAMPLE + Add User Right "Log on as a service" for CONTOSO\User: + + .\Set-UserRights.ps1 -AddRight -Username CONTOSO\User -UserRight SeServiceLogonRight + + .EXAMPLE + Add User Right "Log on as a batch job" for CONTOSO\User: + + .\Set-UserRights.ps1 -AddRight -Username CONTOSO\User -UserRight SeBatchLogonRight + + .EXAMPLE + Remove User Right "Log on as a batch job" for CONTOSO\User: + + .\Set-UserRights.ps1 -RemoveRight -Username CONTOSO\User -UserRight SeBatchLogonRight + + .EXAMPLE + Add User Right "Allow log on locally" for current user: - Remove User Right "Allow log on locally" for current user: - .\Set-UserRights.ps1 -RemoveRight -UserRight SeInteractiveLogonRight + .\Set-UserRights.ps1 -AddRight -UserRight SeInteractiveLogonRight + + .EXAMPLE + Remove User Right "Allow log on locally" for current user: + + .\Set-UserRights.ps1 -RemoveRight -UserRight SeInteractiveLogonRight + + .EXAMPLE + Add User Right "Log on as a service" and "Log on as a batch job" for multiple users on local machine and SQL.contoso.com: + + .\Set-UserRights.ps1 -AddRight -UserRight "SeServiceLogonRight", "SeBatchLogonRight" -ComputerName "$env:COMPUTERNAME", "SQL.contoso.com" -Username "CONTOSO\User1", "CONTOSO\User2" + + .NOTES + Original Creator: Bill Loytty (weloytty) + Based on this script found here: https://github.com/weloytty/QuirkyPSFunctions/blob/main/Source/Users/Grant-LogOnAsService.ps1 + Modified by: Blake Drumm (blakedrumm@microsoft.com) + First Created on: January 5th, 2022 + Last Modified on: October 7th, 2024 - Multiple Users / Services / Computers - Add User Right "Log on as a service" and "Log on as a batch job" for CONTOSO\User and run on, local machine and SQL.contoso.com: - .\Set-UserRights.ps1 -AddRight -UserRight SeServiceLogonRight, SeBatchLogonRight -ComputerName $env:COMPUTERNAME, SQL.contoso.com -UserName CONTOSO\User1, CONTOSO\User2 - - .Notes - Original Creator: Bill Loytty (weloytty) - Based on this script found here: https://github.com/weloytty/QuirkyPSFunctions/blob/main/Source/Users/Grant-LogOnAsService.ps1 - I modified to my own needs: https://github.com/blakedrumm/SCOM-Scripts-and-SQL/blob/master/Powershell/General%20Functions/Set-UserRights.ps1 + ------------------------------------------------------------------------------ + + MIT License + Copyright (c) Microsoft + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - My blog post: https://blakedrumm.com/blog/set-and-check-user-rights-assignment/ + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. - Author: Blake Drumm (blakedrumm@microsoft.com) - First Created on: January 5th, 2022 - Last Modified on: October 12th, 2022 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + + .LINK + https://blakedrumm.com/blog/set-and-check-user-rights-assignment/ #> +[CmdletBinding()] param ( [Parameter(Position = 0, - HelpMessage = 'You want to Add a user right.')] - [Alias('add')] + HelpMessage = 'Specify this switch to add a user right.')] + [Alias('Add')] [switch]$AddRight, - [Parameter(Position = 1)] - [Alias('computer')] + [Parameter(Position = 1, + HelpMessage = 'Defines the computer(s) where the user right should be modified.')] + [Alias('Computers', 'Servers')] [array]$ComputerName, [Parameter(Position = 2, - HelpMessage = 'You want to Remove a user right.')] + HelpMessage = 'Specify this switch to remove a user right.')] + [Alias('Remove')] [switch]$RemoveRight, - [Parameter(Position = 3)] - [Alias('user')] + [Parameter(Position = 3, + HelpMessage = 'Defines the username(s) whose rights will be modified.')] + [Alias('User', 'Principal')] [array]$Username, [Parameter(Mandatory = $false, - Position = 4)] - [ValidateSet('SeNetworkLogonRight', 'SeBackupPrivilege', 'SeChangeNotifyPrivilege', 'SeSystemtimePrivilege', 'SeCreatePagefilePrivilege', 'SeDebugPrivilege', 'SeRemoteShutdownPrivilege', 'SeAuditPrivilege', 'SeIncreaseQuotaPrivilege', 'SeIncreaseBasePriorityPrivilege', 'SeLoadDriverPrivilege', 'SeBatchLogonRight', 'SeServiceLogonRight', 'SeInteractiveLogonRight', 'SeSecurityPrivilege', 'SeSystemEnvironmentPrivilege', 'SeProfileSingleProcessPrivilege', 'SeSystemProfilePrivilege', 'SeAssignPrimaryTokenPrivilege', 'SeRestorePrivilege', 'SeShutdownPrivilege', 'SeTakeOwnershipPrivilege', 'SeDenyNetworkLogonRight', 'SeDenyInteractiveLogonRight', 'SeUndockPrivilege', 'SeManageVolumePrivilege', 'SeRemoteInteractiveLogonRight', 'SeImpersonatePrivilege', 'SeCreateGlobalPrivilege', 'SeIncreaseWorkingSetPrivilege', 'SeTimeZonePrivilege', 'SeCreateSymbolicLinkPrivilege', 'SeDelegateSessionUserImpersonatePrivilege', 'SeMachineAccountPrivilege', 'SeTrustedCredManAccessPrivilege', 'SeTcbPrivilege', 'SeCreateTokenPrivilege', 'SeCreatePermanentPrivilege', 'SeDenyBatchLogonRight', 'SeDenyServiceLogonRight', 'SeDenyRemoteInteractiveLogonRight', 'SeEnableDelegationPrivilege', 'SeLockMemoryPrivilege', 'SeRelabelPrivilege', 'SeSyncAgentPrivilege', IgnoreCase = $true)] - [Alias('right')] + Position = 4, + HelpMessage = 'Specifies the user right(s) to modify.')] + [ValidateSet( + 'SeNetworkLogonRight', + 'SeBackupPrivilege', + 'SeChangeNotifyPrivilege', + 'SeSystemtimePrivilege', + 'SeCreatePagefilePrivilege', + 'SeDebugPrivilege', + 'SeRemoteShutdownPrivilege', + 'SeAuditPrivilege', + 'SeIncreaseQuotaPrivilege', + 'SeIncreaseBasePriorityPrivilege', + 'SeLoadDriverPrivilege', + 'SeBatchLogonRight', + 'SeServiceLogonRight', + 'SeInteractiveLogonRight', + 'SeSecurityPrivilege', + 'SeSystemEnvironmentPrivilege', + 'SeProfileSingleProcessPrivilege', + 'SeSystemProfilePrivilege', + 'SeAssignPrimaryTokenPrivilege', + 'SeRestorePrivilege', + 'SeShutdownPrivilege', + 'SeTakeOwnershipPrivilege', + 'SeDenyNetworkLogonRight', + 'SeDenyInteractiveLogonRight', + 'SeUndockPrivilege', + 'SeManageVolumePrivilege', + 'SeRemoteInteractiveLogonRight', + 'SeImpersonatePrivilege', + 'SeCreateGlobalPrivilege', + 'SeIncreaseWorkingSetPrivilege', + 'SeTimeZonePrivilege', + 'SeCreateSymbolicLinkPrivilege', + 'SeDelegateSessionUserImpersonatePrivilege', + 'SeMachineAccountPrivilege', + 'SeTrustedCredManAccessPrivilege', + 'SeTcbPrivilege', + 'SeCreateTokenPrivilege', + 'SeCreatePermanentPrivilege', + 'SeDenyBatchLogonRight', + 'SeDenyServiceLogonRight', + 'SeDenyRemoteInteractiveLogonRight', + 'SeEnableDelegationPrivilege', + 'SeLockMemoryPrivilege', + 'SeRelabelPrivilege', + 'SeSyncAgentPrivilege', + IgnoreCase = $true)] + [Alias('Right', 'Privilege')] [array]$UserRight ) + BEGIN { - + #region Initialization Write-Output '===================================================================' Write-Output '========================== Start of Script =======================' Write-Output '===================================================================' @@ -158,9 +239,11 @@ BEGIN $TimeStamp = Get-Date -UFormat "%B %d, %Y @ %r" return "$TimeStamp - " } + #endregion Initialization } PROCESS { + #region MainFunctionSection function Inner-SetUserRights { param @@ -232,18 +315,54 @@ PROCESS { $UserLogonRight = switch ($right) { - "SeBatchLogonRight" { "Log on as a batch job (SeBatchLogonRight)" } - "SeDenyBatchLogonRight" { "Deny log on as a batch job (SeDenyBatchLogonRight)" } - "SeDenyInteractiveLogonRight" { "Deny log on locally (SeDenyInteractiveLogonRight)" } - "SeDenyNetworkLogonRight" { "Deny access to this computer from the network (SeDenyNetworkLogonRight)" } - "SeDenyRemoteInteractiveLogonRight" { "Deny log on through Remote Desktop Services (SeDenyRemoteInteractiveLogonRight)" } - "SeDenyServiceLogonRight" { "Deny log on as a service (SeDenyServiceLogonRight)" } - "SeInteractiveLogonRight" { "Allow log on locally (SeInteractiveLogonRight)" } - "SeNetworkLogonRight" { "Access this computer from the network (SeNetworkLogonRight)" } - "SeRemoteInteractiveLogonRight" { "Allow log on through Remote Desktop Services (SeRemoteInteractiveLogonRight)" } - "SeServiceLogonRight" { "Log on as a service (SeServiceLogonRight)" } - Default { "($right)" } + "SeAssignPrimaryTokenPrivilege" { "Replace a process level token (SeAssignPrimaryTokenPrivilege)" } + "SeAuditPrivilege" { "Generate security audits (SeAuditPrivilege)" } + "SeBackupPrivilege" { "Back up files and directories (SeBackupPrivilege)" } + "SeBatchLogonRight" { "Log on as a batch job (SeBatchLogonRight)" } + "SeChangeNotifyPrivilege" { "Bypass traverse checking (SeChangeNotifyPrivilege)" } + "SeCreateGlobalPrivilege" { "Create global objects (SeCreateGlobalPrivilege)" } + "SeCreatePagefilePrivilege" { "Create a pagefile (SeCreatePagefilePrivilege)" } + "SeCreatePermanentPrivilege" { "Create permanent shared objects (SeCreatePermanentPrivilege)" } + "SeCreateSymbolicLinkPrivilege" { "Create symbolic links (SeCreateSymbolicLinkPrivilege)" } + "SeCreateTokenPrivilege" { "Create a token object (SeCreateTokenPrivilege)" } + "SeDebugPrivilege" { "Debug programs (SeDebugPrivilege)" } + "SeDelegateSessionUserImpersonatePrivilege" { "Obtain an impersonation token for another user in the same session (SeDelegateSessionUserImpersonatePrivilege)" } + "SeDenyBatchLogonRight" { "Deny log on as a batch job (SeDenyBatchLogonRight)" } + "SeDenyInteractiveLogonRight" { "Deny log on locally (SeDenyInteractiveLogonRight)" } + "SeDenyNetworkLogonRight" { "Deny access to this computer from the network (SeDenyNetworkLogonRight)" } + "SeDenyRemoteInteractiveLogonRight" { "Deny log on through Remote Desktop Services (SeDenyRemoteInteractiveLogonRight)" } + "SeDenyServiceLogonRight" { "Deny log on as a service (SeDenyServiceLogonRight)" } + "SeEnableDelegationPrivilege" { "Enable computer and user accounts to be trusted for delegation (SeEnableDelegationPrivilege)" } + "SeImpersonatePrivilege" { "Impersonate a client after authentication (SeImpersonatePrivilege)" } + "SeIncreaseBasePriorityPrivilege" { "Increase scheduling priority (SeIncreaseBasePriorityPrivilege)" } + "SeIncreaseQuotaPrivilege" { "Adjust memory quotas for a process (SeIncreaseQuotaPrivilege)" } + "SeIncreaseWorkingSetPrivilege" { "Increase a process working set (SeIncreaseWorkingSetPrivilege)" } + "SeInteractiveLogonRight" { "Allow log on locally (SeInteractiveLogonRight)" } + "SeLoadDriverPrivilege" { "Load and unload device drivers (SeLoadDriverPrivilege)" } + "SeLockMemoryPrivilege" { "Lock pages in memory (SeLockMemoryPrivilege)" } + "SeMachineAccountPrivilege" { "Add workstations to domain (SeMachineAccountPrivilege)" } + "SeManageVolumePrivilege" { "Perform volume maintenance tasks (SeManageVolumePrivilege)" } + "SeNetworkLogonRight" { "Access this computer from the network (SeNetworkLogonRight)" } + "SeProfileSingleProcessPrivilege" { "Profile single process (SeProfileSingleProcessPrivilege)" } + "SeRelabelPrivilege" { "Modify an object label (SeRelabelPrivilege)" } + "SeRemoteInteractiveLogonRight" { "Allow log on through Remote Desktop Services (SeRemoteInteractiveLogonRight)" } + "SeRemoteShutdownPrivilege" { "Force shutdown from a remote system (SeRemoteShutdownPrivilege)" } + "SeRestorePrivilege" { "Restore files and directories (SeRestorePrivilege)" } + "SeSecurityPrivilege" { "Manage auditing and security log (SeSecurityPrivilege)" } + "SeServiceLogonRight" { "Log on as a service (SeServiceLogonRight)" } + "SeShutdownPrivilege" { "Shut down the system (SeShutdownPrivilege)" } + "SeSyncAgentPrivilege" { "Synchronize directory service data (SeSyncAgentPrivilege)" } + "SeSystemEnvironmentPrivilege" { "Modify firmware environment values (SeSystemEnvironmentPrivilege)" } + "SeSystemProfilePrivilege" { "Profile system performance (SeSystemProfilePrivilege)" } + "SeSystemtimePrivilege" { "Change the system time (SeSystemtimePrivilege)" } + "SeTakeOwnershipPrivilege" { "Take ownership of files or other objects (SeTakeOwnershipPrivilege)" } + "SeTcbPrivilege" { "Act as part of the operating system (SeTcbPrivilege)" } + "SeTimeZonePrivilege" { "Change the time zone (SeTimeZonePrivilege)" } + "SeTrustedCredManAccessPrivilege" { "Access Credential Manager as a trusted caller (SeTrustedCredManAccessPrivilege)" } + "SeUndockPrivilege" { "Remove computer from docking station (SeUndockPrivilege)" } + Default { "($right)" } } + Write-Output ("$(Time-Stamp)$ActionType `"$UserLogonRight`" right for user account: '$Username' on host: '$env:COMPUTERNAME'") if ($Username -match "^S-.*-.*-.*$|^S-.*-.*-.*-.*-.*-.*$|^S-.*-.*-.*-.*-.*$|^S-.*-.*-.*-.*$") { @@ -412,10 +531,14 @@ PROCESS } } } - } + #endregion MainFunctionSection if ($ComputerName -or $Username -or $UserRight -or $RemoveRight) { + if (!$Username) + { + $Username = "$env:USERDOMAIN`\$env:USERNAME" + } foreach ($user in $Username) { Set-UserRights -ComputerName $ComputerName -Username $user -UserRight $UserRight -AddRight:$AddRight -RemoveRight:$RemoveRight @@ -423,17 +546,21 @@ PROCESS } else { + <# + Edit line 564 to modify the default command run when this script is executed. + Example: + - Add multiple user rights to specified users on specified computers: + Set-UserRights -AddRight -UserRight SeServiceLogonRight, SeBatchLogonRight -ComputerName $env:COMPUTERNAME, SQL.contoso.com -UserName CONTOSO\User1, CONTOSO\User2 + + - Add a single user right to a user identified by their Security Identifier (SID): + Set-UserRights -AddRight -UserRight SeBatchLogonRight -Username S-1-5-11 - <# Edit line 437 to modify the default command run when this script is executed. - Example: - Set-UserRights -AddRight -UserRight SeServiceLogonRight, SeBatchLogonRight -ComputerName $env:COMPUTERNAME, SQL.contoso.com -UserName CONTOSO\User1, CONTOSO\User2 - or - Set-UserRights -AddRight -UserRight SeBatchLogonRight -Username S-1-5-11 - or - Set-UserRights -RemoveRight -UserRight SeBatchLogonRight -Username CONTOSO\User2 - or - Set-UserRights -RemoveRight -UserRight SeServiceLogonRight, SeBatchLogonRight -Username CONTOSO\User1 - #> + - Remove a user right from a specified user: + Set-UserRights -RemoveRight -UserRight SeBatchLogonRight -Username CONTOSO\User2 + + - Remove multiple user rights from a specified user: + Set-UserRights -RemoveRight -UserRight SeServiceLogonRight, SeBatchLogonRight -Username CONTOSO\User1 + #> Set-UserRights } } @@ -441,3 +568,221 @@ END { Write-Output "$(Time-Stamp)Script Completed!" } + +# SIG # Begin signature block +# MIIoLwYJKoZIhvcNAQcCoIIoIDCCKBwCAQExDzANBglghkgBZQMEAgEFADB5Bgor +# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG +# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCC2oEAtHQyopXzN +# cQ1sOJxZS6mMLrnC/8ciuijk+2p9s6CCDXYwggX0MIID3KADAgECAhMzAAAEBGx0 +# Bv9XKydyAAAAAAQEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD +# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy +# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p +# bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTE0WhcNMjUwOTExMjAxMTE0WjB0MQsw +# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u +# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy +# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +# AQC0KDfaY50MDqsEGdlIzDHBd6CqIMRQWW9Af1LHDDTuFjfDsvna0nEuDSYJmNyz +# NB10jpbg0lhvkT1AzfX2TLITSXwS8D+mBzGCWMM/wTpciWBV/pbjSazbzoKvRrNo +# DV/u9omOM2Eawyo5JJJdNkM2d8qzkQ0bRuRd4HarmGunSouyb9NY7egWN5E5lUc3 +# a2AROzAdHdYpObpCOdeAY2P5XqtJkk79aROpzw16wCjdSn8qMzCBzR7rvH2WVkvF +# HLIxZQET1yhPb6lRmpgBQNnzidHV2Ocxjc8wNiIDzgbDkmlx54QPfw7RwQi8p1fy +# 4byhBrTjv568x8NGv3gwb0RbAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE +# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU8huhNbETDU+ZWllL4DNMPCijEU4w +# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW +# MBQGA1UEBRMNMjMwMDEyKzUwMjkyMzAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci +# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j +# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG +# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu +# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 +# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAIjmD9IpQVvfB1QehvpC +# Ge7QeTQkKQ7j3bmDMjwSqFL4ri6ae9IFTdpywn5smmtSIyKYDn3/nHtaEn0X1NBj +# L5oP0BjAy1sqxD+uy35B+V8wv5GrxhMDJP8l2QjLtH/UglSTIhLqyt8bUAqVfyfp +# h4COMRvwwjTvChtCnUXXACuCXYHWalOoc0OU2oGN+mPJIJJxaNQc1sjBsMbGIWv3 +# cmgSHkCEmrMv7yaidpePt6V+yPMik+eXw3IfZ5eNOiNgL1rZzgSJfTnvUqiaEQ0X +# dG1HbkDv9fv6CTq6m4Ty3IzLiwGSXYxRIXTxT4TYs5VxHy2uFjFXWVSL0J2ARTYL +# E4Oyl1wXDF1PX4bxg1yDMfKPHcE1Ijic5lx1KdK1SkaEJdto4hd++05J9Bf9TAmi +# u6EK6C9Oe5vRadroJCK26uCUI4zIjL/qG7mswW+qT0CW0gnR9JHkXCWNbo8ccMk1 +# sJatmRoSAifbgzaYbUz8+lv+IXy5GFuAmLnNbGjacB3IMGpa+lbFgih57/fIhamq +# 5VhxgaEmn/UjWyr+cPiAFWuTVIpfsOjbEAww75wURNM1Imp9NJKye1O24EspEHmb +# DmqCUcq7NqkOKIG4PVm3hDDED/WQpzJDkvu4FrIbvyTGVU01vKsg4UfcdiZ0fQ+/ +# V0hf8yrtq9CkB8iIuk5bBxuPMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq +# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x +# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv +# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +# IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG +# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG +# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg +# Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +# CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 +# a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr +# rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg +# OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy +# 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 +# sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh +# dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k +# A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB +# w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn +# Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 +# lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w +# ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o +# ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD +# VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa +# BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny +# bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG +# AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t +# L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV +# HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 +# dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG +# AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl +# AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb +# C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l +# hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 +# I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 +# wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 +# STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam +# ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa +# J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah +# XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA +# 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt +# Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr +# /Xmfwb1tbWrJUnMTDXpQzTGCGg8wghoLAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw +# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN +# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp +# Z25pbmcgUENBIDIwMTECEzMAAAQEbHQG/1crJ3IAAAAABAQwDQYJYIZIAWUDBAIB +# BQCggbAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO +# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIHsfRJKYMVIvVtkYPSPFQPqz +# mmotEK2DeAlUckpxf9dRMEQGCisGAQQBgjcCAQwxNjA0oBSAEgBNAGkAYwByAG8A +# cwBvAGYAdKEcgBpodHRwczovL3d3dy5taWNyb3NvZnQuY29tIDANBgkqhkiG9w0B +# AQEFAASCAQBfJjRoUGSfhCAFu/Dt4nOXe1o9WS2v0re+f14RvTXxPxlrJhYQvzIR +# XhwFKzrmKmIbYiPYllB3G3sS6sFGRwe+uYCEyrUALlWnY07CcVTnj6bncws3kM4S +# ZwVyDPDUDdFQDUiGBRQehygMteHJopQgOl4r3B1h9WOyJE4zPRX5C7LdwxTuR+O8 +# UoPL1EPiK2leQkjRs5z6VKOvvBg8+y3AhpcgTJHPOirlDcNvmoLAjGCPbG3pxZ2h +# ci9hDrQGwpbpWAFNKyQhMSZRDvrNtGKT1I4wX/NqnGzhelTvs2/BUkw/8tpq5Z+M +# Y1IRajp3d11DZYRxnWCH3wsqNkVQTWLhoYIXlzCCF5MGCisGAQQBgjcDAwExgheD +# MIIXfwYJKoZIhvcNAQcCoIIXcDCCF2wCAQMxDzANBglghkgBZQMEAgEFADCCAVIG +# CyqGSIb3DQEJEAEEoIIBQQSCAT0wggE5AgEBBgorBgEEAYRZCgMBMDEwDQYJYIZI +# AWUDBAIBBQAEIBd/688COT7A0N6GMz76rprFlbMkoFkRX1fobiaDv4gYAgZnGn56 +# pDwYEzIwMjQxMTA1MjMxNTExLjUxMVowBIACAfSggdGkgc4wgcsxCzAJBgNVBAYT +# AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD +# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBB +# bWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo4RDAw +# LTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vydmlj +# ZaCCEe0wggcgMIIFCKADAgECAhMzAAAB88UKQ64DzB0xAAEAAAHzMA0GCSqGSIb3 +# DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD +# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAk +# BgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTIzMTIwNjE4 +# NDYwMloXDTI1MDMwNTE4NDYwMlowgcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX +# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg +# Q29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlv +# bnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo4RDAwLTA1RTAtRDk0NzElMCMG +# A1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCAiIwDQYJKoZIhvcN +# AQEBBQADggIPADCCAgoCggIBAP6fptrhK4H2JI7lYyFueCpgBv7Pch/M2lkhZL+y +# B9eGUtiYaexS2sZfc5VyD7ySsl2LG41Qw7tkA6oJmxdSM7PzNyfVpQPkPavY+HNU +# qMe2K9YaAaPjHnCpZ7VCi/e8zPxYewqx9p0iVaN8EydUpWiY7JtDv7aNzhp/OPZc +# lBBKYT2NBGgGiAPCaplqR5icjHQSY665w+vrvhPr9hpM+IhiUZ/5dXa7qhAcCQwb +# nrFg9CKSK1COM1YcAN8GpsERqqmlqy3GlE1ziJ3ZLXFVDFxAZeOcCB55Vts9sCgQ +# uFvD7PdV61HC4QUlHNPqFtYSC/P0sxg9JuKgcvzD5mJajfG7DdHt8myp7umqyePC +# +eI/ux8TW61+LuTQ1Bkym+I6z//bf0fp4Dog5W0XzDrqKkTvURitxI2s4aVObm6q +# r6zI7W51k54ozTFjvbw1wYMWqeO4U9sQSbr561kp+1T2PEsJLOpc5U7N2oDw7ldr +# cTjWPezsyVMXhDsFitCZunGqFO9+4iVjAjYDN47c6K9x7MnAGPYVCBOJUdpy8xAO +# BIDsTm/K1qTT4wsGbQBxbgg96vwDiA4YP2hKmubIC7UnrAWQGt/ZKOf6J42roXHS +# 1aPwimDe5C9y6DfuNJp0XqrWtQRqg8hqNkIZWT6jnCfqu35zB0nf1ERTjdpYLCfQ +# L5fHAgMBAAGjggFJMIIBRTAdBgNVHQ4EFgQUw2QV9qURUQyMDcCmhTH2oOsNCiQw +# HwYDVR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYDVR0fBFgwVjBUoFKg +# UIZOaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0 +# JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwGCCsGAQUFBwEBBGAw +# XjBcBggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j +# ZXJ0cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcnQw +# DAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8E +# BAMCB4AwDQYJKoZIhvcNAQELBQADggIBAN/EHI/80f7v29zeWI7hzudcz9QoVwCb +# nDrUXFHE/EJdFeWI2NnuwOo0/QPNRMFT21LkOqSpFKIhXXmPurx7p6WDz9wPdu/S +# xbgaj0AwviWEDkwGDfDMp2KF8nQT8cipwdfXWbC1ulOILayABSHv45mdv1PAkTul +# sQE8lBTHG4KJLn+vSzZBWKkGaL/wwRbZ4iLiYn68cjkMJoAaihPgDXn/ug2P3PLN +# EAFNQgI02tLX0p+vIQ3l2HmSo4bhCBxr3DovsIv5K65NmLRJnxmrrmIraFDwgwA5 +# XF7AKkPiVkvo0OxU1LAE1c5SWzE4A7cbTA1P5wG6D8cPjcHsTah1V+zofYRgJnFR +# LWuBF4Z3a6pDGBDbCsy5NvnKQ76p37ieFp//1I3eB62ia1CfkjOF8KStpPUqdkXx +# MjfJ7Vnemd6vQKf+nXkfvA3AOQECJn7aLP01QR5gt8wab28SsNUENEyMawT8eqpj +# tBNJO0O9Tv7NnBE8aOJhhQVdP5WCR90eIWkrDjZeybQx8vlo5rfUXIIzXv+k9Mgp +# NGIqwMXfvRLAjBkCNXOIP/1CEQUG72miMVQs5m/O4vmJIQkhyqilUDB1s12uhmLY +# c3yd8OPMlrwIxORB5J9CxCkqvzc6EGYTcwXazPyCp7eWhzTkNbwk29nfbwmmzcsk +# IAu3StA8lic7MIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJmQAAAAAAFTANBgkq +# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x +# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv +# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +# IDIwMTAwHhcNMjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1WjB8MQswCQYDVQQG +# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG +# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg +# VGltZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +# ggIBAOThpkzntHIhC3miy9ckeb0O1YLT/e6cBwfSqWxOdcjKNVf2AX9sSuDivbk+ +# F2Az/1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhgfWpSg0S3po5GawcU +# 88V29YZQ3MFEyHFcUTE3oAo4bo3t1w/YJlN8OWECesSq/XJprx2rrPY2vjUmZNqY +# O7oaezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/dvI2k45GPsjksUZzp +# cGkNyjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7mka97aSueik3rMvrg0Xn +# Rm7KMtXAhjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKRHh09/SDPc31BmkZ1 +# zcRfNN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn427DZM9ituqBJR6L8FA6PRc6ZN +# N3SUHDSCD/AQ8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyOArxCaC4Q6oRRRuLR +# vWoYWmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2ZItboKaDIV1fMHSRlJTY +# uVD5C4lh8zYGNRiER9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6bMURHXLvjflSxIUX +# k8A8FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6tAgMBAAGjggHdMIIB +# 2TASBgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQWBBQqp1L+ZMSavoKR +# PEY1Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXAYDVR0g +# BFUwUzBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5t +# aWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQM +# MAoGCCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQE +# AwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQ +# W9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNv +# bS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBa +# BggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0 +# LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqG +# SIb3DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/qXBS2Pk5HZHixBpOX +# PTEztTnXwnE2P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7pZmc6U03dmLq2HnjYNi6c +# qYJWAAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2CDPVtI1TkeFN1JFe53Z/z +# jj3G82jfZfakVqr3lbYoVSfQJL1AoL8ZthISEV09J+BAljis9/kpicO8F7BUhUKz +# /AyeixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTpkbKpW99Jo3QMvOyR +# gNI95ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32THJvEKt1MMU0sHrYUP4KWN1APMdU +# bZ1jdEgssU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138eW0QBjloZkWsNn6Qo +# 3GcZKCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQTHa1V1QJsWkBRH58oWFsc/4K +# u+xBZj1p/cvBQUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7Fx0ViY1w/ue10Cga +# iQuPNtq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0llOZ0dFtq0Z4+7X6gMTN9 +# vMvpe784cETRkPHIqzqKOghif9lwY1NNje6CbaUFEMFxBmoQtB1VM1izoXBm8qGC +# A1AwggI4AgEBMIH5oYHRpIHOMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz +# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv +# cnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25z +# MScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046OEQwMC0wNUUwLUQ5NDcxJTAjBgNV +# BAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMV +# AG76BizYtGFrmkU7v2DcuR/ApGcooIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzAR +# BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p +# Y3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3Rh +# bXAgUENBIDIwMTAwDQYJKoZIhvcNAQELBQACBQDq1M4PMCIYDzIwMjQxMTA1MTcw +# MjA3WhgPMjAyNDExMDYxNzAyMDdaMHcwPQYKKwYBBAGEWQoEATEvMC0wCgIFAOrU +# zg8CAQAwCgIBAAICD7cCAf8wBwIBAAICEyswCgIFAOrWH48CAQAwNgYKKwYBBAGE +# WQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDAN +# BgkqhkiG9w0BAQsFAAOCAQEAbnzTrLoq6rMeJfAz0idpKs7GoHgm/ckXRvsbQWpK +# RPawMXMO4u345T16X2Vuriiyc1kmLCJuKggzs5nyyFoAdFDpHN7IDQxmXX4PrUxD +# Oy89ICac3PSPlvSgXMAEU0BeuHjdATbGz+o2CrWywdk2sbfmBe6YZUM12vIg08LB +# eOBnCLOa9z0lnYqdIGJ/gi/xAC5pyEDeQoytfRA16nrAjRdB5qyZlceVassYZqIT +# MFN4BwmMVLXZSxktIFw8bDN2bI91xpIsK9ce38bI5bHXleC/qlDijOVe2BZ5Fdlh +# ibROEGQOo+5rlMin/zmjXR472gbggA3YYYXpCPWRJChgJzGCBA0wggQJAgEBMIGT +# MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS +# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMT +# HU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB88UKQ64DzB0xAAEA +# AAHzMA0GCWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQ +# AQQwLwYJKoZIhvcNAQkEMSIEIKa4ENkUK8c3c4E29PP+SgACy4D1MKZEiTVdy45x +# ClN6MIH6BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgGLzZNIu24bhWSnzAGYmT +# 9P5ECHzjWwb9oM7DGDo7YugwgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UE +# CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z +# b2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQ +# Q0EgMjAxMAITMwAAAfPFCkOuA8wdMQABAAAB8zAiBCC3KY2Mdu7eE4IGG83OG80z +# QQi2MnVGyeTLy5E6afN6TzANBgkqhkiG9w0BAQsFAASCAgDX7dq08GS7aSkuL1Fw +# GG7/ovEdXfQfr8+9ew9Nt7K+4xjWdQQ7Ctop2xXdcn0dHbJQMoPeAJOVxcqF/i7h +# ohADp1Zdif9hYRQEonekaXkgACbQiY1ldVKSDCa490JE32lNW8rxkas1VpcsQ5Dh +# ocoMlz/3jgiL9f/el3BOH9x4jybKx+x4jmmUgnUEBVX4J/vgZKNrvNQ2SY1z/8uL +# iQnJSLMUk/9bkznjEXm3bktNDCrvpdm7x1hnoYF7nBT6vTkJtVLUapA2fzEmarkz +# cd0fj0V/0sYXJoYLhFrkdonPlnfCAxCfWoiN4TVJzHB2M7A+UbNoNMeyeNum1sdP +# HxM3fiJGgU7aygH171dT72wrXSHAcQOvu5EM/kVHA7EmhwOJfTkbwNlPXnJL9xBE +# kF0/oI3N6ccmPLtGJxoUzTvlnQnkfnpwUEXcwI17XRFCS1PNV9RvEcJoLNjNmPik +# l/NXWq7r4cu5iNam9yxCoaOZ1gWzW+UALHmFE3kzDrHrZ426Ke3Z+95kzsOPvhQF +# PUYid9kdywMYIa3gqVDDVXr5826uvov8fyzBCNHGPVR6V7p77W9O3nKV5hKAEmxf +# SQi6Fr3B6k2ifuKEoa8A1MhJEeAwR2OVKb+YYlMPM7YW18Fbx3I+eKpaeumrgQTl +# 9WVsSaEb4H+KnaO5VYyU1zuiBw== +# SIG # End signature block diff --git a/Powershell/Get-ProductVersion.ps1 b/Powershell/Get-ProductVersion.ps1 index a50edfb..34b8a4b 100644 --- a/Powershell/Get-ProductVersion.ps1 +++ b/Powershell/Get-ProductVersion.ps1 @@ -10,9 +10,9 @@ function Get-ProductVersion ) #Author: Blake Drumm (blakedrumm@microsoft.com) #Website: https://blakedrumm.com/ - + #Last Updated SQL Server List on: March 22nd, 2024 - #Last Updated SCOM Version List on: March 22nd, 2024 + #Last Updated SCOM Version List on: May 9th, 2024 #Last Updated SSRS Version List on: March 22nd, 2024 $matched = $false if ($Product -eq 'SCOM') @@ -45,15 +45,18 @@ function Get-ProductVersion <# System Center Operations Manager 2022 Versions #> - '10.22.1070.0' { "Update Rollup 2 - Hotfix - 1.8.1-0 / 2024 March"; $matched = $true } #SCX Agent + '10.22.10684.0' { "SCOM 2022 Update Rollup 2 Hotfix - Introduces support for crypto policies in FIPS mode, specifically tailored for users monitoring Linux workloads / 2024 April"; $matched = $true } + '10.22.1072.0' { "SCOM 2022 FIPS Crypto Policy Support - 1.9.0-0 / 2024 April"; $matched = $true } #SCX Agent + '10.22.1070.0' { "SCOM 2022 Update Rollup 2 - Hotfix - 1.8.1-0 / 2024 March"; $matched = $true } #SCX Agent + '10.22.10618.0' { "SCOM 2022 Update Rollup 2 Hotfix - Addresses Linux monitoring issues / 2023 December"; $matched = $true } '10.22.10208.0' { "SCOM 2022 Update Rollup 2 / 2023 November"; $matched = $true } #Agent - '10.22.10610.0' { "Update Rollup 2 / 2023 November "; $matched = $true } - '10.22.1055.0' { "OMI Vulnerability Fix - 1.7.3-0 / 2023 November"; $matched = $true } #SCX Agent - '10.22.1052.0' { "Update Rollup 1 - Hotfix - 1.7.1-0 / 2023 August"; $matched = $true } #SCX Agent - '10.22.10560.0' { "SCX Compiler Mitigated Packages / 2023 August"; $matched = $true } #SCX Agent - '10.22.10565.0' { "Discover Azure Migrate in Operations Manager / 2023 July"; $matched = $true } - '10.22.10575.0' { "GB compliance / 2023 July"; $matched = $true } - '10.22.1044.0' { "Update Rollup 1 - OpenSSL 3.0 - 1.7.0-0 / 2023 March"; $matched = $true } #SCX Agent + '10.22.10610.0' { "SCOM 2022 Update Rollup 2 / 2023 November "; $matched = $true } + '10.22.1055.0' { "SCOM 2022 OMI Vulnerability Fix - 1.7.3-0 / 2023 November"; $matched = $true } #SCX Agent + '10.22.1052.0' { "SCOM 2022 Update Rollup 1 - Hotfix - 1.7.1-0 / 2023 August"; $matched = $true } #SCX Agent + '10.22.10560.0' { "SCOM 2022 SCX Compiler Mitigated Packages / 2023 August"; $matched = $true } #SCX Agent + '10.22.10565.0' { "SCOM 2022 Discover Azure Migrate in Operations Manager / 2023 July"; $matched = $true } + '10.22.10575.0' { "SCOM 2022 GB compliance / 2023 July"; $matched = $true } + '10.22.1044.0' { "SCOM 2022 Update Rollup 1 - OpenSSL 3.0 - 1.7.0-0 / 2023 March"; $matched = $true } #SCX Agent '10.22.1042.0' { "SCOM 2022 Update Rollup 1 - Hotfix - 1.6.12-1 / 2023 February"; $matched = $true } #SCX Agent '10.22.1039.0' { "SCOM 2022 Update Rollup 1 - 1.6.11-0 / 2022 December"; $matched = $true } #SCX Agent '10.22.10337.0' { "SCOM 2022 Update Rollup 1 - Console Hotfix / 2022 December"; $matched = $true } @@ -67,19 +70,23 @@ function Get-ProductVersion <# System Center Operations Manager 2019 Versions #> - '10.19.1253.0' { "Update Rollup 6 - 1.8.1-0 / 2024 March"; $matched = $true } #SCX Agent - '10.19.1234.0' { "OMI Vulnerability Fix - 1.7.3-0 / 2023 November"; $matched = $true } #SCX Agent - '10.19.1226.0' { "Update Rollup 5 - Hotfix - 1.7.1-0 / 2023 August"; $matched = $true } #SCX Agent - '10.19.10618.0' { "SCX Compiler Mitigated Packages / 2023 August"; $matched = $true } - '10.19.10616.0' { "Discover Azure Migrate in Operations Manager / 2023 July"; $matched = $true } - '10.19.10615.0' { "GB compliance / 2023 July"; $matched = $true } - '10.19.10211.0' { "Update Rollup 5 / 2023 April"; $matched = $true } #Agent - '10.19.10606.0' { "Update Rollup 5 / 2023 April"; $matched = $true } - '10.19.1214.0' { "Update Rollup 4 - OpenSSL 3.0 - 1.7.0-0 / 2023 March"; $matched = $true } #SCX Agent - '10.19.1195.0' { "Update Rollup 4 - Hotfix - 1.6.12-1 / 2023 February"; $matched = $true } #SCX Agent - '10.19.1167.0' { "Update Rollup 4 - Hotfix - 1.6.11-0 / 2022 December"; $matched = $true } #SCX Agent - '10.19.10576.0' { "Update Rollup 4 - Hotfix for Operations Console Performance issue / 2022 July"; $matched = $true } - '10.19.1158.0' { "Update Rollup 4 - OMI Vulnerability Fix - 1.6.10-2 / 2022 August"; $matched = $true } #SCX Agent + '10.19.10652.0' { "SCOM 2019 Update Rollup 6 Hotfix - Introduces support for crypto policies in FIPS mode, specifically tailored for users monitoring Linux workloads / 2024 April"; $matched = $true } + '10.19.1254.0' { "SCOM 2019 FIPS Crypto Policy Support - 1.9.0-0 / 2024 April"; $matched = $true } #SCX Agent + '10.19.1253.0' { "SCOM 2019 Update Rollup 6 - 1.8.1-0 / 2024 March"; $matched = $true } #SCX Agent + '10.19.10253.0' { "SCOM 2019 Update Rollup 6 / 2024 March"; $matched = $true } #Agent + '10.19.10649.0' { "SCOM 2019 Update Rollup 6 / 2024 March"; $matched = $true } + '10.19.1234.0' { "SCOM 2019 OMI Vulnerability Fix - 1.7.3-0 / 2023 November"; $matched = $true } #SCX Agent + '10.19.1226.0' { "SCOM 2019 Update Rollup 5 - Hotfix - 1.7.1-0 / 2023 August"; $matched = $true } #SCX Agent + '10.19.10618.0' { "SCOM 2019 SCX Compiler Mitigated Packages / 2023 August"; $matched = $true } + '10.19.10616.0' { "SCOM 2019 Discover Azure Migrate in Operations Manager / 2023 July"; $matched = $true } + '10.19.10615.0' { "SCOM 2019 GB compliance / 2023 July"; $matched = $true } + '10.19.10211.0' { "SCOM 2019 Update Rollup 5 / 2023 April"; $matched = $true } #Agent + '10.19.10606.0' { "SCOM 2019 Update Rollup 5 / 2023 April"; $matched = $true } + '10.19.1214.0' { "SCOM 2019 Update Rollup 4 - OpenSSL 3.0 - 1.7.0-0 / 2023 March"; $matched = $true } #SCX Agent + '10.19.1195.0' { "SCOM 2019 Update Rollup 4 - Hotfix - 1.6.12-1 / 2023 February"; $matched = $true } #SCX Agent + '10.19.1167.0' { "SCOM 2019 Update Rollup 4 - Hotfix - 1.6.11-0 / 2022 December"; $matched = $true } #SCX Agent + '10.19.10576.0' { "SCOM 2019 Update Rollup 4 - Hotfix for Operations Console Performance issue / 2022 July"; $matched = $true } + '10.19.1158.0' { "SCOM 2019 Update Rollup 4 - OMI Vulnerability Fix - 1.6.10-2 / 2022 August"; $matched = $true } #SCX Agent '10.19.1150.0' { "SCOM 2019 Update Rollup 4 - 1.6.10-1 / 2022 June"; $matched = $true } #SCX Agent '10.19.10200.0' { "SCOM 2019 Update Rollup 4 / 2022 June"; $matched = $true } #Agent '10.19.10569.0' { "SCOM 2019 Update Rollup 4 / 2022 June"; $matched = $true } @@ -104,20 +111,21 @@ function Get-ProductVersion <# System Center Operations Manager 2016 Versions #> - '7.6.1197.0' { "Update Rollup 10 - Hotfix - 1.8.1-0 / 2024 March"; $matched = $true } #SCX Agent - '7.6.1189.0' { "OMI Vulnerability Fix - 1.7.3-0 / 2023 November"; $matched = $true } #SCX Agent - '7.6.1185.0' { "Update Rollup 10 - Hotfix - 1.7.1-0 / 2023 August"; $matched = $true } #SCX Agent - '7.6.1164.0' { "Update Rollup 10 - Hotfix - 1.6.12-1 / 2023 February"; $matched = $true } #SCX Agent - '7.6.1113.0' { "Update Rollup 10 - OMI Vulnerability Fix - 1.6.10-2 / 2022 August"; $matched = $true } #SCX Agent - '7.6.1108.0' { "Update Rollup 10 - OMI Vulnerability Fix - 1.6.9-2 / 2022 May"; $matched = $true } #SCX Agent - '7.6.1105.0' { "Update Rollup 10 - 1.6.8-1 / 2021 September"; $matched = $true } #SCX Agent - '7.6.1092.0' { "Update Rollup 9 - 1.6.2-343 / 2020 March"; $matched = $true } #SCX Agent - '7.6.1076.0' { "Update Rollup 3 - 1.6.2-339 / 2017 May"; $matched = $true } #SCX Agent - '7.6.1072.0' { "Update Rollup 2 - 1.6.2-338 / 2017 February"; $matched = $true } #SCX Agent - '7.6.1067.0' { "Update Rollup 1 - 1.6.2-337 / 2016 October"; $matched = $true } #SCX Agent - '7.6.1064.0' { "General Availability release - 1.6.2-336 / 2016 September"; $matched = $true } #SCX Agent - '7.2.12345.0' { "SCX Compiler Mitigated Packages / 2023 August"; $matched = $true } - '7.2.12335.0' { "Update Rollup 10 - Web Console IDOR Vulnerability Fix / 2021 October"; $matched = $true } + '7.6.1201.0' { "SCOM 2016 FIPS Crypto Policy Support - 1.9.0-0 / 2024 April"; $matched = $true } #SCX Agent + '7.6.1197.0' { "SCOM 2016 Update Rollup 10 - Hotfix - 1.8.1-0 / 2024 March"; $matched = $true } #SCX Agent + '7.6.1189.0' { "SCOM 2016 OMI Vulnerability Fix - 1.7.3-0 / 2023 November"; $matched = $true } #SCX Agent + '7.6.1185.0' { "SCOM 2016 Update Rollup 10 - Hotfix - 1.7.1-0 / 2023 August"; $matched = $true } #SCX Agent + '7.6.1164.0' { "SCOM 2016 Update Rollup 10 - Hotfix - 1.6.12-1 / 2023 February"; $matched = $true } #SCX Agent + '7.6.1113.0' { "SCOM 2016 Update Rollup 10 - OMI Vulnerability Fix - 1.6.10-2 / 2022 August"; $matched = $true } #SCX Agent + '7.6.1108.0' { "SCOM 2016 Update Rollup 10 - OMI Vulnerability Fix - 1.6.9-2 / 2022 May"; $matched = $true } #SCX Agent + '7.6.1105.0' { "SCOM 2016 Update Rollup 10 - 1.6.8-1 / 2021 September"; $matched = $true } #SCX Agent + '7.6.1092.0' { "SCOM 2016 Update Rollup 9 - 1.6.2-343 / 2020 March"; $matched = $true } #SCX Agent + '7.6.1076.0' { "SCOM 2016 Update Rollup 3 - 1.6.2-339 / 2017 May"; $matched = $true } #SCX Agent + '7.6.1072.0' { "SCOM 2016 Update Rollup 2 - 1.6.2-338 / 2017 February"; $matched = $true } #SCX Agent + '7.6.1067.0' { "SCOM 2016 Update Rollup 1 - 1.6.2-337 / 2016 October"; $matched = $true } #SCX Agent + '7.6.1064.0' { "SCOM 2016 General Availability release - 1.6.2-336 / 2016 September"; $matched = $true } #SCX Agent + '7.2.12345.0' { "SCOM 2016 SCX Compiler Mitigated Packages / 2023 August"; $matched = $true } + '7.2.12335.0' { "SCOM 2016 Update Rollup 10 - Web Console IDOR Vulnerability Fix / 2021 October"; $matched = $true } '8.0.11057.0' { "SCOM 2016 Update Rollup 10 / 2020 November 19"; $matched = $true } #Agent '7.2.12324.0' { "SCOM 2016 Update Rollup 10 / 2020 November 19"; $matched = $true } '8.0.11049.0' { "SCOM 2016 Update Rollup 9 / 2020 March 24"; $matched = $true } #Agent @@ -218,7 +226,7 @@ function Get-ProductVersion <# Azure Log Analytics #> - "10.20.*" { "Azure Log Analytics Agent / Unknown Release Date" } #Agent + "10.20.*" { "Azure Log Analytics Agent / Unknown Release Date" } #Agent default { "Unknown Version" } } return $Output diff --git a/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x64/SCOM-ReconfigureDatabaseLocations.exe b/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x64/SCOM-ReconfigureDatabaseLocations.exe index 1b5d71b..12f489b 100644 Binary files a/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x64/SCOM-ReconfigureDatabaseLocations.exe and b/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x64/SCOM-ReconfigureDatabaseLocations.exe differ diff --git a/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x64/SCOM-ReconfigureDatabaseLocations.exe.md5 b/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x64/SCOM-ReconfigureDatabaseLocations.exe.md5 index c283c51..5f7315d 100644 --- a/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x64/SCOM-ReconfigureDatabaseLocations.exe.md5 +++ b/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x64/SCOM-ReconfigureDatabaseLocations.exe.md5 @@ -1 +1 @@ -6532f5a5111d52e7f63fe93f67f77a30 \ No newline at end of file +05eca23798929b097bba2c2beafc49a4 \ No newline at end of file diff --git a/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x86/SCOM-ReconfigureDatabaseLocations.exe b/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x86/SCOM-ReconfigureDatabaseLocations.exe index 37033ba..6e1162e 100644 Binary files a/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x86/SCOM-ReconfigureDatabaseLocations.exe and b/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x86/SCOM-ReconfigureDatabaseLocations.exe differ diff --git a/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x86/SCOM-ReconfigureDatabaseLocations.exe.md5 b/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x86/SCOM-ReconfigureDatabaseLocations.exe.md5 index 358ca14..9419425 100644 --- a/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x86/SCOM-ReconfigureDatabaseLocations.exe.md5 +++ b/Powershell/SCOM-Reconfigure-DB-Move/Executable (EXE)/x86/SCOM-ReconfigureDatabaseLocations.exe.md5 @@ -1 +1 @@ -4a70706393cfcebef8b4b000a87b6858 \ No newline at end of file +85be79af58518d0d1565b92f0599f4c0 \ No newline at end of file diff --git a/Powershell/SCOM-Reconfigure-DB-Move/Installer (MSI)/SCOM-ReconfigureDatabaseLocations.msi b/Powershell/SCOM-Reconfigure-DB-Move/Installer (MSI)/SCOM-ReconfigureDatabaseLocations.msi index 9dc34d1..225ba0f 100644 Binary files a/Powershell/SCOM-Reconfigure-DB-Move/Installer (MSI)/SCOM-ReconfigureDatabaseLocations.msi and b/Powershell/SCOM-Reconfigure-DB-Move/Installer (MSI)/SCOM-ReconfigureDatabaseLocations.msi differ diff --git a/Powershell/SCOM-Reconfigure-DB-Move/Installer (MSI)/SCOM-ReconfigureDatabaseLocations.msi.md5 b/Powershell/SCOM-Reconfigure-DB-Move/Installer (MSI)/SCOM-ReconfigureDatabaseLocations.msi.md5 index f6a6802..692565e 100644 --- a/Powershell/SCOM-Reconfigure-DB-Move/Installer (MSI)/SCOM-ReconfigureDatabaseLocations.msi.md5 +++ b/Powershell/SCOM-Reconfigure-DB-Move/Installer (MSI)/SCOM-ReconfigureDatabaseLocations.msi.md5 @@ -1 +1 @@ -7b83cad98771156ca1843aa129a836b9 \ No newline at end of file +9f300ca25352b2d8f8e807336abf2453 \ No newline at end of file diff --git a/Powershell/SCOM-Reconfigure-DB-Move/Source (PS1)/SCOM-ReconfigureDatabaseLocations.ps1 b/Powershell/SCOM-Reconfigure-DB-Move/Source (PS1)/SCOM-ReconfigureDatabaseLocations.ps1 index 28680ef..ce3a4b9 100644 Binary files a/Powershell/SCOM-Reconfigure-DB-Move/Source (PS1)/SCOM-ReconfigureDatabaseLocations.ps1 and b/Powershell/SCOM-Reconfigure-DB-Move/Source (PS1)/SCOM-ReconfigureDatabaseLocations.ps1 differ diff --git a/Powershell/TLS 1.2 Enforcement/Invoke-EnforceSCOMTLS1.2.ps1 b/Powershell/TLS 1.2 Enforcement/Invoke-EnforceSCOMTLS1.2.ps1 index d814c3a..2212f30 100644 --- a/Powershell/TLS 1.2 Enforcement/Invoke-EnforceSCOMTLS1.2.ps1 +++ b/Powershell/TLS 1.2 Enforcement/Invoke-EnforceSCOMTLS1.2.ps1 @@ -20,8 +20,8 @@ .PARAMETER SkipDownloadPrerequisites Skip downloading the prerequisite files to current directory: - - msoledbsql.msi (https://learn.microsoft.com/sql/connect/oledb/release-notes-for-oledb-driver-for-sql-server?branch=main&branchFallbackFrom=pr-en-us-5180&view=sql-server-ver16#1867) - - msodbcsql.msi (https://learn.microsoft.com/sql/connect/odbc/windows/release-notes-odbc-sql-server-windows?branch=main&branchFallbackFrom=pr-en-us-5180&view=sql-server-ver16#17105) + - msoledbsql.msi (https://learn.microsoft.com/sql/connect/oledb/release-notes-for-oledb-driver-for-sql-server#1874) + - msodbcsql.msi (https://learn.microsoft.com/sql/connect/odbc/windows/release-notes-odbc-sql-server-windows?view=sql-server-ver16#17105) - sqlncli.msi (https://www.microsoft.com/download/details.aspx?id=50402) .PARAMETER SkipModifyRegistry @@ -40,19 +40,18 @@ Skip SCOM Version Check step. .EXAMPLE - Example 1 - Normal run: - PS C:\> .\Invoke-EnforceSCOMTLS1.2.ps1 + .\Invoke-EnforceSCOMTLS1.2.ps1 + Normal run - Example 2: - Set the prerequisites folder: - PS C:\> .\Invoke-EnforceSCOMTLS1.2.ps1 -DirectoryForPrerequisites "C:\Temp" + .EXAMPLE + .\Invoke-EnforceSCOMTLS1.2.ps1 -DirectoryForPrerequisites "C:\Temp" + Set the prerequisites folder: .NOTES ================================================================================= SCOM TLS 1.2 / 1.3 Configuration Script - v 2.4 + v 2.5 This script supports: SCOM 2012R2, 2016, 1801, 1807, 2019, and 2022 SQL 2008R2 through 2022 @@ -61,7 +60,7 @@ Original Author: Kevin Holman (https://kevinholman.com/) Author: Blake Drumm (https://blakedrumm.com/) - Last Updated: May 7th, 2024 + Last Updated: October 9th, 2024 Blog Post: https://blakedrumm.com/blog/enforce-tls-1-2-scom/ @@ -321,16 +320,16 @@ function Start-SCOMTLSEnforcement #> try { - # MSOLEDB 18.6.7 - $releaseDownloadLink = 'https://go.microsoft.com/fwlink/?linkid=2242656' - $filename = 'msoledbsql_18.6.7' - Write-ScriptLog -Step Prerequisites -LogString "Downloading MSOLEDB 18.6.7 automatically from: '$releaseDownloadLink'" -ForegroundColor Cyan + # MSOLEDB 18.7.4 + $releaseDownloadLink = 'https://go.microsoft.com/fwlink/?linkid=2278907' + $filename = 'msoledbsql_18.7.4' + Write-ScriptLog -Step Prerequisites -LogString "Downloading MSOLEDB 18.7.4 automatically from: '$releaseDownloadLink'" -ForegroundColor Cyan Start-BitsTransfer -Source $releaseDownloadLink -Destination "$DirectoryForPrerequisites\$filename.msi" -ErrorAction Stop - Out-File -FilePath "$DirectoryForPrerequisites\$filename-Released-October 10 2023" + Out-File -FilePath "$DirectoryForPrerequisites\$filename-Released-July 09 2024" } catch { - Write-ScriptLog -Step Prerequisites -LogString "Unable to download MSOLEDB 18.6.7 automatically from: 'https://learn.microsoft.com/sql/connect/oledb/download-oledb-driver-for-sql-server'" -ForegroundColor Red -Status Error + Write-ScriptLog -Step Prerequisites -LogString "Unable to download MSOLEDB 18.7.4 automatically from: 'https://learn.microsoft.com/sql/connect/oledb/download-oledb-driver-for-sql-server'" -ForegroundColor Red -Status Error } #ODBC @@ -354,7 +353,7 @@ function Start-SCOMTLSEnforcement } catch { - Write-ScriptLog -Step Prerequisites -LogString "Unable to download ODBC 17.10.5 automatically from: 'https://learn.microsoft.com/sql/connect/odbc/windows/release-notes-odbc-sql-server-windows?branch=main&branchFallbackFrom=pr-en-us-5180&view=sql-server-ver16#17105'" -ForegroundColor Red -Status Error + Write-ScriptLog -Step Prerequisites -LogString "Unable to download ODBC 17.10.5 automatically from: 'https://learn.microsoft.com/sql/connect/odbc/windows/release-notes-odbc-sql-server-windows'" -ForegroundColor Red -Status Error } # SQL Server 2012 Native Client diff --git a/SQL Queries/Data Warehouse/DW_Events_ByTotalEvents.sql b/SQL Queries/Data Warehouse/DW_Events_ByTotalEvents.sql index d69bde9..f0cd239 100644 --- a/SQL Queries/Data Warehouse/DW_Events_ByTotalEvents.sql +++ b/SQL Queries/Data Warehouse/DW_Events_ByTotalEvents.sql @@ -3,34 +3,40 @@ -- -- Description: -- This SQL script retrieves the top 100 most common events from the event logging system, providing --- insights into the events that occur most frequently. The query returns the event display number, raw description --- of the event, the computer name where the event was logged, and the total number of occurrences of each event. --- Additionally, it calculates the span of days over which each event has been logged, helping identify long-running --- or persistent issues. This query is designed to assist in identifying patterns or anomalies in event logs, particularly --- useful in large-scale environments where understanding event noise and distribution can aid in proactive management and troubleshooting. +-- insights into the events that occur most frequently. The query returns the event display number, the rendered +-- description of the event, the computer name where the event was logged, and the total number of occurrences +-- of each event. Additionally, it calculates the span of days over which each event has been logged, helping +-- identify long-running or persistent issues. This query is especially useful in large-scale environments +-- where understanding event noise and distribution can aid in proactive management and troubleshooting. -- -- Author: Blake Drumm (blakedrumm@microsoft.com) -- Date Created: May 7th, 2024 +-- Date Modified: May 8th, 2024 -- Original query: https://kevinholman.com/2016/11/11/scom-sql-queries/#:~:text=Events%20Section%20(Warehouse) ---------------------------------------------------------------------------------------------------------------- -- Selects the top 100 records from the result set SELECT TOP 100 - evt.EventDisplayNumber, -- Display number of the event - evtd.RawDescription, -- Raw description of the event - evtlc.ComputerName, -- Name of the computer logging the event - COUNT(*) AS TotalEvents, -- Total number of events aggregated by display number, description, and computer name + evt.EventDisplayNumber, -- Display number of the event + evtd.RenderedDescription, -- Rendered description of the event + evtlc.ComputerName, -- Name of the computer logging the event + COUNT(*) AS TotalEvents, -- Total number of events aggregated by display number, description, and computer name DATEDIFF(DAY, MIN(evt.DateTime), MAX(evt.DateTime)) + 1 AS DaysOfData -- Calculates the span of days between the earliest and latest event dates for each group FROM - Event.vEvent AS evt -- From the main events table + Event.vEvent AS evt -- From the main events table INNER JOIN - Event.vEventDetail AS evtd -- Joined with event details on EventOriginId + Event.vEventDetail AS evtd -- Joined with event details on EventOriginId ON evt.EventOriginId = evtd.EventOriginId INNER JOIN - vEventLoggingComputer AS evtlc -- Joined with the event logging computer table on LoggingComputerRowId + vEventLoggingComputer AS evtlc -- Joined with the event logging computer table on LoggingComputerRowId ON evt.LoggingComputerRowId = evtlc.EventLoggingComputerRowId +/* +WHERE + evt.DateTime > GETUTCDATE() -- Filters to include only events with dates greater than now +*/ GROUP BY - evt.EventDisplayNumber, -- Groups the results by event display number, - evtd.RawDescription, -- raw event description, - evtlc.ComputerName -- and computer name + evt.EventDisplayNumber, + evtd.RenderedDescription, -- Rendered event description + evtlc.ComputerName -- and computer name ORDER BY - TotalEvents DESC -- Orders the results by the total number of events, in descending order + DaysOfData DESC, -- Orders the results by the span of days, descending + TotalEvents DESC -- and then by the total number of events, descending