From ee747af6771ec9a2f5ab8abb2e968e2ed4fb0681 Mon Sep 17 00:00:00 2001 From: DellProSupportGse <79069476+DellProSupportGse@users.noreply.github.com> Date: Sun, 14 Feb 2021 21:06:35 -0600 Subject: [PATCH 001/127] Update PrivateCloud.DiagnosticInfo.psm1 Fixed command prompt popup for SystemInfo.exe Added a new $LocalFile parser to allow for the use of Invoke-Command for cmdlets that do not have -cimsession Fixed Get-ComputerInfo by running it with Invoke-Command because it does not have -cimsession Added the following cmdlets: Get-NetFirewallProfile - to see firewall profile info Get-NetFirewallRule - to see firewall rules Get-NetConnectionProfile - to see which connection profile a NIC is using Get-SmbMultichannelConnection - to see which IP/NICs are being used for SBL Get-SmbClientConfiguration - to see if client SMB signing is enabled Get-SmbServerConfiguration - to see if server SMB signing is enabled Get-VMSwitchTeam -CimSession C -SwitchName ((Get-VMSwitch -CimSession C | Where-Object {$_.EmbeddedTeamingEnabled -eq $true}).Name) -ErrorAction SilentlyContinue' - to see the teamed VMSwitches Get-VMHost - to see the VM Host info Get-VMNetworkAdapterVlan - to see which vLANs the vNICs are using Get-VMNetworkAdapterTeamMapping - to see the vNIC to pNIC relationship Invoke-Command -ComputerName C {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters} - to see the hardware timeout for the Spaces port Get-StorageNode - to see the storage by node Change iex alias to Invoke-Expression --- .../PrivateCloud.DiagnosticInfo.psm1 | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 19d7765..f67c551 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2056,7 +2056,8 @@ function Get-SddcDiagnosticInfo # Text-only conventional commands # # Gather SYSTEMINFO.EXE output for a given node - SystemInfo.exe /S $using:NodeName > (Join-Path (Get-NodePath $using:Path $using:NodeName) "SystemInfo.TXT") + $SysInfoOut=(Join-Path (Get-NodePath $using:Path $using:NodeName) "SystemInfo.TXT") + Start-Process -FilePath "$env:comspec" -ArgumentList "/c SystemInfo.exe /S $using:NodeName > $SysInfoOut" -WindowStyle Hidden -Wait # Cmdlets to drop in TXT and XML forms # @@ -2093,6 +2094,14 @@ function Get-SddcDiagnosticInfo 'Get-ScheduledTask -CimSession _C_ | Get-ScheduledTaskInfo -CimSession _C_', 'Get-SmbServerNetworkInterface -CimSession _C_', 'Get-StorageFaultDomain -CimSession _A_ -Type StorageScaleUnit |? FriendlyName -eq _N_ | Get-StorageFaultDomain -CimSession _A_' + 'Get-NetFirewallProfile -CimSession _C_', + 'Get-NetFirewallRule -CimSession _C_', + 'Get-NetConnectionProfile -CimSession _C_', + 'Get-SmbMultichannelConnection -CimSession _C_ -SmbInstance SBL', + 'Get-SmbClientConfiguration -CimSession _C_', + 'Get-SmbServerConfiguration -CimSession _C_', + 'Invoke-Command -ComputerName _C_ {Get-ComputerInfo}', + 'Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}' # These commands are specific to optional modules, add only if present # - DcbQos: RoCE environments primarily @@ -2107,16 +2116,20 @@ function Get-SddcDiagnosticInfo $CmdsToLog += 'Get-VM -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMNetworkAdapter -All -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMSwitch -CimSession _C_ -ErrorAction SilentlyContinue' + 'Get-VMSwitchTeam -CimSession _C_ -SwitchName ((Get-VMSwitch -CimSession _C_ | Where-Object {$_.EmbeddedTeamingEnabled -eq $true}).Name) -ErrorAction SilentlyContinue', + 'Get-VMHost -CimSession _C_ -ErrorAction SilentlyContinue', + 'Get-VMNetworkAdapterVlan -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue', + 'Get-VMNetworkAdapterTeamMapping -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue' } foreach ($cmd in $CmdsToLog) { # truncate cmd string to the cmd itself - $LocalFile = (Join-Path $LocalNodeDir (($cmd.split(' '))[0] -replace "-","")) + $LocalFile = (Join-Path $LocalNodeDir ([regex]::match(($cmd.split() | Where-Object {$_ -imatch 'Get-'}),'Get-[a-zA-Z0-9]*').value -replace "-","")) try { $cmdex = $cmd -replace '_C_',$using:NodeName -replace '_N_',$using:NodeName -replace '_A_',$using:AccessNode - $out = iex $cmdex + $out = Invoke-Expression $cmdex # capture as txt and xml for quick analysis according to taste $out | ft -AutoSize | Out-File -Width 9999 -Encoding ascii -FilePath "$LocalFile.txt" @@ -2475,6 +2488,13 @@ function Get-SddcDiagnosticInfo Show-Update "Storage Pool & Tiers" + # Storage Node information + + try { + Get-StorageNode -CimSession $AccessNode | + Export-Clixml ($Path + "GetStorageNode.XML") } + catch { Show-Warning("Unable to get Storage Nodes. `nError="+$_.Exception.Message) } + # Storage tier information try { From 593612816f4ef0263b6aef258e02754231e92a00 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Wed, 24 Feb 2021 12:15:30 -0600 Subject: [PATCH 002/127] Update PrivateCloud.DiagnosticInfo.psm1 Added missing commas for CmdsToLog array to allow the new adds to run --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index f67c551..46c23a6 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2093,7 +2093,7 @@ function Get-SddcDiagnosticInfo 'Get-NetTcpSetting -CimSession _C_', 'Get-ScheduledTask -CimSession _C_ | Get-ScheduledTaskInfo -CimSession _C_', 'Get-SmbServerNetworkInterface -CimSession _C_', - 'Get-StorageFaultDomain -CimSession _A_ -Type StorageScaleUnit |? FriendlyName -eq _N_ | Get-StorageFaultDomain -CimSession _A_' + 'Get-StorageFaultDomain -CimSession _A_ -Type StorageScaleUnit |? FriendlyName -eq _N_ | Get-StorageFaultDomain -CimSession _A_', 'Get-NetFirewallProfile -CimSession _C_', 'Get-NetFirewallRule -CimSession _C_', 'Get-NetConnectionProfile -CimSession _C_', @@ -2115,7 +2115,7 @@ function Get-SddcDiagnosticInfo if (Get-Module Hyper-V -ErrorAction SilentlyContinue) { $CmdsToLog += 'Get-VM -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMNetworkAdapter -All -CimSession _C_ -ErrorAction SilentlyContinue', - 'Get-VMSwitch -CimSession _C_ -ErrorAction SilentlyContinue' + 'Get-VMSwitch -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMSwitchTeam -CimSession _C_ -SwitchName ((Get-VMSwitch -CimSession _C_ | Where-Object {$_.EmbeddedTeamingEnabled -eq $true}).Name) -ErrorAction SilentlyContinue', 'Get-VMHost -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMNetworkAdapterVlan -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue', From 4d3ac19dbbaaafc3d4e91b147f17fc999e37031d Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 25 Feb 2021 21:50:01 -0600 Subject: [PATCH 003/127] Update PrivateCloud.DiagnosticInfo.psm1 Added ClusterNetworkLiveMigrationInformation --- .../PrivateCloud.DiagnosticInfo.psm1 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 46c23a6..50814ba 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1783,7 +1783,15 @@ function Get-SddcDiagnosticInfo $o | Export-Clixml ($using:Path + "GetClusterNetwork.XML") } catch { Show-Warning("Could not get Cluster Nodes. `nError="+$_.Exception.Message) } - } + } + + $JobStatic += start-job -Name ClusterNetworkLiveMigrationInformation { + try { + $o = Get-ClusterResourceType -Name 'Virtual Machine' -Cluster $using:AccessNode | Get-ClusterParameter + $o | Export-Clixml ($using:Path + "ClusterNetworkLiveMigration.XML") + } + catch { Show-Warning("Could not get Cluster Network Live Migration Information. `nError="+$_.Exception.Message) } + } $JobStatic += start-job -Name ClusterResource { try { From ac85761d90acb2f8cc0ee19c900d6fe8813422e9 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Mon, 1 Mar 2021 18:52:59 -0600 Subject: [PATCH 004/127] Update PrivateCloud.DiagnosticInfo.psm1 Added SMBSigning registry --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 50814ba..2c3be0d 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2109,7 +2109,7 @@ function Get-SddcDiagnosticInfo 'Get-SmbClientConfiguration -CimSession _C_', 'Get-SmbServerConfiguration -CimSession _C_', 'Invoke-Command -ComputerName _C_ {Get-ComputerInfo}', - 'Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}' + 'Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters,HKLM:\System\CurrentControlSet\Services\LanManServer\Parameters}' # These commands are specific to optional modules, add only if present # - DcbQos: RoCE environments primarily From 8ae46b3fecff59fc5096088a4dfda2a626bfce04 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Mon, 1 Mar 2021 19:49:34 -0600 Subject: [PATCH 005/127] Update PrivateCloud.DiagnosticInfo.psm1 Removed --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 2c3be0d..50814ba 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2109,7 +2109,7 @@ function Get-SddcDiagnosticInfo 'Get-SmbClientConfiguration -CimSession _C_', 'Get-SmbServerConfiguration -CimSession _C_', 'Invoke-Command -ComputerName _C_ {Get-ComputerInfo}', - 'Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters,HKLM:\System\CurrentControlSet\Services\LanManServer\Parameters}' + 'Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}' # These commands are specific to optional modules, add only if present # - DcbQos: RoCE environments primarily From 7b71b0508665b16b99eaba6d2ceb7d0581e0d94b Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Mon, 10 May 2021 19:48:42 -0500 Subject: [PATCH 006/127] Update PrivateCloud.DiagnosticInfo.psm1 Added MSINFO32 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 50814ba..2611758 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2066,6 +2066,10 @@ function Get-SddcDiagnosticInfo # Gather SYSTEMINFO.EXE output for a given node $SysInfoOut=(Join-Path (Get-NodePath $using:Path $using:NodeName) "SystemInfo.TXT") Start-Process -FilePath "$env:comspec" -ArgumentList "/c SystemInfo.exe /S $using:NodeName > $SysInfoOut" -WindowStyle Hidden -Wait + + # Gather MSINFO32.EXE output for a given node + $MSINFO32Out=(Join-Path (Get-NodePath $using:Path $using:NodeName) "MSINFO32.TXT") + Start-Process -FilePath "$env:comspec" -ArgumentList "/c MSINFO32.exe /nfo /Computer $using:NodeName > $MSINFO32Out" -WindowStyle Hidden -Wait # Cmdlets to drop in TXT and XML forms # From 403933afba6f55f0908dc5028b5317dd4c3ce459 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Mon, 10 May 2021 20:03:59 -0500 Subject: [PATCH 007/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 2611758..fd7814c 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2068,7 +2068,7 @@ function Get-SddcDiagnosticInfo Start-Process -FilePath "$env:comspec" -ArgumentList "/c SystemInfo.exe /S $using:NodeName > $SysInfoOut" -WindowStyle Hidden -Wait # Gather MSINFO32.EXE output for a given node - $MSINFO32Out=(Join-Path (Get-NodePath $using:Path $using:NodeName) "MSINFO32.TXT") + $MSINFO32Out=(Join-Path (Get-NodePath $using:Path $using:NodeName) "MSINFO32.NFO") Start-Process -FilePath "$env:comspec" -ArgumentList "/c MSINFO32.exe /nfo /Computer $using:NodeName > $MSINFO32Out" -WindowStyle Hidden -Wait # Cmdlets to drop in TXT and XML forms From 0e1dfd7e0532d9d38a66c872fb117d5f4390d8b3 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Mon, 10 May 2021 20:19:32 -0500 Subject: [PATCH 008/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index fd7814c..56821a5 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2069,7 +2069,7 @@ function Get-SddcDiagnosticInfo # Gather MSINFO32.EXE output for a given node $MSINFO32Out=(Join-Path (Get-NodePath $using:Path $using:NodeName) "MSINFO32.NFO") - Start-Process -FilePath "$env:comspec" -ArgumentList "/c MSINFO32.exe /nfo /Computer $using:NodeName > $MSINFO32Out" -WindowStyle Hidden -Wait + Start-Process -FilePath "$env:comspec" -ArgumentList "/c MSINFO32.exe /nfo $MSINFO32Out /Computer $using:NodeName" -WindowStyle Hidden -Wait # Cmdlets to drop in TXT and XML forms # From 227f381a777733d60667a4569b4ae9929a5f9658 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Mon, 10 May 2021 21:48:46 -0500 Subject: [PATCH 009/127] Update PrivateCloud.DiagnosticInfo.psm1 remove MSinfo32 for time testing --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 56821a5..f02b3cd 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2068,8 +2068,8 @@ function Get-SddcDiagnosticInfo Start-Process -FilePath "$env:comspec" -ArgumentList "/c SystemInfo.exe /S $using:NodeName > $SysInfoOut" -WindowStyle Hidden -Wait # Gather MSINFO32.EXE output for a given node - $MSINFO32Out=(Join-Path (Get-NodePath $using:Path $using:NodeName) "MSINFO32.NFO") - Start-Process -FilePath "$env:comspec" -ArgumentList "/c MSINFO32.exe /nfo $MSINFO32Out /Computer $using:NodeName" -WindowStyle Hidden -Wait + #$MSINFO32Out=(Join-Path (Get-NodePath $using:Path $using:NodeName) "MSINFO32.NFO") + #Start-Process -FilePath "$env:comspec" -ArgumentList "/c MSINFO32.exe /nfo $MSINFO32Out /Computer $using:NodeName" -WindowStyle Hidden -Wait # Cmdlets to drop in TXT and XML forms # From 50447ddbf5e01c0016c12f55d7101b9a3691b676 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 30 Sep 2021 20:03:34 -0500 Subject: [PATCH 010/127] Modified VMSwitchTeam --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 5e07b47..f5270f3 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2242,7 +2242,7 @@ function Get-SddcDiagnosticInfo $CmdsToLog += 'Get-VM -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMNetworkAdapter -All -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMSwitch -CimSession _C_ -ErrorAction SilentlyContinue', - 'Get-VMSwitchTeam -CimSession _C_ -SwitchName ((Get-VMSwitch -CimSession _C_ | Where-Object {$_.EmbeddedTeamingEnabled -eq $true}).Name) -ErrorAction SilentlyContinue', + '((Get-VMSwitch -CimSession _C_ | Where-Object {$_.EmbeddedTeamingEnabled -eq $true}).Name) | %{Get-VMSwitchTeam -CimSession _C_ -SwitchName $_ -ErrorAction SilentlyContinue}', 'Get-VMHost -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMNetworkAdapterVlan -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue', 'Get-VMNetworkAdapterTeamMapping -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue' @@ -6156,4 +6156,4 @@ Export-ModuleMember -Alias * -Function 'Get-SddcDiagnosticInfo', 'Show-StorageCounters', 'Get-SpacesTimeline', 'Set-SddcDiagnosticArchiveJobParameters', - 'Get-SddcDiagnosticArchiveJobParameters' \ No newline at end of file + 'Get-SddcDiagnosticArchiveJobParameters' From bbef5e4590f13d9a9c77b498c49cb258e4df37a8 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 1 Oct 2021 17:33:09 -0500 Subject: [PATCH 011/127] rolled back the vmswitchteam change for now --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index f5270f3..d707bd5 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2242,7 +2242,7 @@ function Get-SddcDiagnosticInfo $CmdsToLog += 'Get-VM -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMNetworkAdapter -All -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMSwitch -CimSession _C_ -ErrorAction SilentlyContinue', - '((Get-VMSwitch -CimSession _C_ | Where-Object {$_.EmbeddedTeamingEnabled -eq $true}).Name) | %{Get-VMSwitchTeam -CimSession _C_ -SwitchName $_ -ErrorAction SilentlyContinue}', + 'Get-VMSwitchTeam -CimSession _C_ -SwitchName ((Get-VMSwitch -CimSession _C_ | Where-Object {$_.EmbeddedTeamingEnabled -eq $true}).Name) -ErrorAction SilentlyContinue', 'Get-VMHost -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMNetworkAdapterVlan -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue', 'Get-VMNetworkAdapterTeamMapping -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue' From 72bbfdd332e536bcb04758c239511d293156acd3 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 1 Oct 2021 17:45:48 -0500 Subject: [PATCH 012/127] added support for more than one vmswitchteam --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index d707bd5..98f8e0f 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2242,7 +2242,7 @@ function Get-SddcDiagnosticInfo $CmdsToLog += 'Get-VM -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMNetworkAdapter -All -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMSwitch -CimSession _C_ -ErrorAction SilentlyContinue', - 'Get-VMSwitchTeam -CimSession _C_ -SwitchName ((Get-VMSwitch -CimSession _C_ | Where-Object {$_.EmbeddedTeamingEnabled -eq $true}).Name) -ErrorAction SilentlyContinue', + 'Echo Get-VMSwitchTeam; Get-VMSwitch -CimSession _C_ | Where-Object {$_.EmbeddedTeamingEnabled -eq $true} | %{Get-VMSwitchTeam -CimSession _C_ -SwitchName $_.name}', 'Get-VMHost -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMNetworkAdapterVlan -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue', 'Get-VMNetworkAdapterTeamMapping -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue' From 7fc3dafa52af1e427acf398dd4fbc37fcde56f15 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 28 Oct 2021 10:37:13 -0500 Subject: [PATCH 013/127] Added\Changed Reg Keys Added the OEMInformation registry key Changed the SpacePort\Parameters output file name --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 98f8e0f..047eafd 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2227,7 +2227,8 @@ function Get-SddcDiagnosticInfo 'Get-SmbClientConfiguration -CimSession _C_', 'Get-SmbServerConfiguration -CimSession _C_', 'Invoke-Command -ComputerName _C_ {Get-ComputerInfo}', - 'Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}' + 'Echo Reg-SpacePortParameters;Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}' + 'Echo Reg-OEMInformation;Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation}' # These commands are specific to optional modules, add only if present # - DcbQos: RoCE environments primarily From 74a4af618acb949c44c4a75153c2766c4963bb56 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 28 Oct 2021 10:45:00 -0500 Subject: [PATCH 014/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 047eafd..90afa9e 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2227,8 +2227,8 @@ function Get-SddcDiagnosticInfo 'Get-SmbClientConfiguration -CimSession _C_', 'Get-SmbServerConfiguration -CimSession _C_', 'Invoke-Command -ComputerName _C_ {Get-ComputerInfo}', - 'Echo Reg-SpacePortParameters;Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}' - 'Echo Reg-OEMInformation;Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation}' + 'Invoke-Command -ComputerName _C_ {Echo Reg-SpacePortParameters;Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}' + 'Invoke-Command -ComputerName _C_ {Echo Reg-OEMInformation;Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation}' # These commands are specific to optional modules, add only if present # - DcbQos: RoCE environments primarily From 16c69a3cb533cf231cb21f7226c17131a3969afa Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 28 Oct 2021 11:07:30 -0500 Subject: [PATCH 015/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 90afa9e..f5826ef 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2227,8 +2227,8 @@ function Get-SddcDiagnosticInfo 'Get-SmbClientConfiguration -CimSession _C_', 'Get-SmbServerConfiguration -CimSession _C_', 'Invoke-Command -ComputerName _C_ {Get-ComputerInfo}', - 'Invoke-Command -ComputerName _C_ {Echo Reg-SpacePortParameters;Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}' - 'Invoke-Command -ComputerName _C_ {Echo Reg-OEMInformation;Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation}' + 'Invoke-Command -ComputerName _C_ {Echo Get-RegSpacePortParameters;Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}' + 'Invoke-Command -ComputerName _C_ {Echo Get-RegOEMInformation;Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation}' # These commands are specific to optional modules, add only if present # - DcbQos: RoCE environments primarily From c67e3b658cc4db4e3bac20a8b0af86173a72c532 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 28 Oct 2021 15:33:27 -0500 Subject: [PATCH 016/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index f5826ef..a8c6dc8 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2227,7 +2227,8 @@ function Get-SddcDiagnosticInfo 'Get-SmbClientConfiguration -CimSession _C_', 'Get-SmbServerConfiguration -CimSession _C_', 'Invoke-Command -ComputerName _C_ {Get-ComputerInfo}', - 'Invoke-Command -ComputerName _C_ {Echo Get-RegSpacePortParameters;Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}' + 'Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}', + 'Invoke-Command -ComputerName _C_ {Echo Get-RegSpacePortParameters;Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}', 'Invoke-Command -ComputerName _C_ {Echo Get-RegOEMInformation;Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation}' # These commands are specific to optional modules, add only if present From 29b09aa07908987a9864e79cb3b1072ddaeece7e Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Tue, 30 Nov 2021 13:45:24 -0600 Subject: [PATCH 017/127] Add checks for compellent storage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit netsh int tcp show global Get-WmiObject win32_networkadapter -filter "NetConnectionID = 'iSCSI_NIC'" Get-ItemProperty -path HKLM:\System\CurrentControlSet\services\Tcpip\Parameters\Interfaces\* Get-MSDSMSupportedHW Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters Get-ItemProperty –Path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*" --- .../PrivateCloud.DiagnosticInfo.psm1 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index a8c6dc8..5503999 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2229,7 +2229,13 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Get-ComputerInfo}', 'Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}', 'Invoke-Command -ComputerName _C_ {Echo Get-RegSpacePortParameters;Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}', - 'Invoke-Command -ComputerName _C_ {Echo Get-RegOEMInformation;Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation}' + 'Invoke-Command -ComputerName _C_ {Echo Get-RegOEMInformation;Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation}', + 'Invoke-Command -ComputerName _C_ {Echo Get-netsh;netsh int tcp show global}', + 'Invoke-Command -ComputerName _C_ {Echo Get-iSCSINics;Get-WmiObject win32_networkadapter -filter "NetConnectionID = 'iSCSI_NIC'"}', + 'Invoke-Command -ComputerName _C_ {Echo Get-TcpipParametersInterfaces;Get-ItemProperty -path HKLM:\System\CurrentControlSet\services\Tcpip\Parameters\Interfaces\*}', + 'Invoke-Command -ComputerName _C_ {Echo Get-mpioParameters;Get-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters}', + 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"' + 'Get-MSDSMSupportedHW -CimSession _C_' # These commands are specific to optional modules, add only if present # - DcbQos: RoCE environments primarily From d18351ded42cafecda92161b99b9af7cb7333f42 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Tue, 30 Nov 2021 13:48:40 -0600 Subject: [PATCH 018/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 5503999..15096b4 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2231,7 +2231,7 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Echo Get-RegSpacePortParameters;Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}', 'Invoke-Command -ComputerName _C_ {Echo Get-RegOEMInformation;Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation}', 'Invoke-Command -ComputerName _C_ {Echo Get-netsh;netsh int tcp show global}', - 'Invoke-Command -ComputerName _C_ {Echo Get-iSCSINics;Get-WmiObject win32_networkadapter -filter "NetConnectionID = 'iSCSI_NIC'"}', + 'Invoke-Command -ComputerName _C_ {Echo Get-win32_networkadapter;Get-WmiObject win32_networkadapter}', 'Invoke-Command -ComputerName _C_ {Echo Get-TcpipParametersInterfaces;Get-ItemProperty -path HKLM:\System\CurrentControlSet\services\Tcpip\Parameters\Interfaces\*}', 'Invoke-Command -ComputerName _C_ {Echo Get-mpioParameters;Get-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters}', 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"' From e8a4dd2de104325e3553688746604199cf9ec506 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Mon, 31 Jan 2022 14:39:07 -0600 Subject: [PATCH 019/127] Added Get-NetAdapterQos Get-NetAdapterQos so we can check QOS settings on all NICs --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 1 + 1 file changed, 1 insertion(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 15096b4..b868f83 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2213,6 +2213,7 @@ function Get-SddcDiagnosticInfo 'Get-NetOffloadGlobalSetting -CimSession _C_', 'Get-NetPrefixPolicy -CimSession _C_', 'Get-NetQosPolicy -CimSession _C_', + 'Get-NetAdapterQos -CimSession _C_', 'Get-NetRoute -CimSession _C_', 'Get-Disk -CimSession _C_', 'Get-NetTcpConnection -CimSession _C_', From ff9b52242f7554f1299c6447ecdd5b058fc6f2d8 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Mon, 7 Feb 2022 13:27:02 -0600 Subject: [PATCH 020/127] added dedup check --- .../PrivateCloud.DiagnosticInfo.psm1 | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index b868f83..9fab810 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2255,8 +2255,14 @@ function Get-SddcDiagnosticInfo 'Get-VMHost -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMNetworkAdapterVlan -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue', 'Get-VMNetworkAdapterTeamMapping -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue' - } - + } + + #Added to gather DeDup info if installed + If (Get-Module Deduplication -ErrorAction SilentlyContinue){ + $clusterCimSession = New-CimSession -ComputerName $ClusterName + $CmdsToLog += "Get-DedupVolume -CimSession $clusterCimSession" + } + foreach ($cmd in $CmdsToLog) { # truncate cmd string to the cmd itself From 857c7a75b202c529da501442fb9f3c89aa333d15 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Mon, 7 Feb 2022 15:10:28 -0600 Subject: [PATCH 021/127] Added MSInfo32 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 9fab810..ff95247 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2281,6 +2281,10 @@ function Get-SddcDiagnosticInfo } } + #Add MSInfo32 + $LocalFile = (Join-Path $LocalNodeDir "\msinfo.nfo") + Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computername $using:NodeName /nfo $LocalFile" -Wait + $NodeSystemRootPath = Invoke-Command -ComputerName $using:NodeName -ConfigurationName $using:SessionConfigurationName { $env:SystemRoot } # Avoid to use 'Join-Path' because the drive of path may not exist on the local machine. From 54b805bf5ed3ac97cbb405d2e789cb388bc37726 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Mon, 7 Feb 2022 15:37:58 -0600 Subject: [PATCH 022/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index ff95247..c9747ad 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2283,7 +2283,7 @@ function Get-SddcDiagnosticInfo #Add MSInfo32 $LocalFile = (Join-Path $LocalNodeDir "\msinfo.nfo") - Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computername $using:NodeName /nfo $LocalFile" -Wait + Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer $using:NodeName /nfo $LocalFile" -Wait $NodeSystemRootPath = Invoke-Command -ComputerName $using:NodeName -ConfigurationName $using:SessionConfigurationName { $env:SystemRoot } From 8911a7c56ace6f80e9cb7433aa80864573d2b391 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Mon, 9 May 2022 12:00:59 -0500 Subject: [PATCH 023/127] Added Get-NetIPConfiguration --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 1 + 1 file changed, 1 insertion(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index c9747ad..e37492d 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2227,6 +2227,7 @@ function Get-SddcDiagnosticInfo 'Get-SmbMultichannelConnection -CimSession _C_ -SmbInstance SBL', 'Get-SmbClientConfiguration -CimSession _C_', 'Get-SmbServerConfiguration -CimSession _C_', + 'Get-NetIPConfiguration -CimSession _C_', 'Invoke-Command -ComputerName _C_ {Get-ComputerInfo}', 'Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}', 'Invoke-Command -ComputerName _C_ {Echo Get-RegSpacePortParameters;Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}', From cdd40d00626d6fcf0955867dc896cb5d2428c7cb Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Mon, 23 May 2022 17:33:40 -0500 Subject: [PATCH 024/127] added d to version to know its the Dell version --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 9e837ab..08e23c9 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.1.37' +ModuleVersion = '1.1.37d' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' @@ -107,4 +107,4 @@ AliasesToExport = 'gsddcdi', # Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. # DefaultCommandPrefix = '' -} \ No newline at end of file +} From fe407ab4d12ea69c7434d19a7f1ec9a1b42c1ec9 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Tue, 24 May 2022 08:04:13 -0500 Subject: [PATCH 025/127] removed d from version --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 08e23c9..78ebff6 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.1.37d' +ModuleVersion = '1.1.37' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' From cb76164dd7771227f81eb8f82176c064e0d97c91 Mon Sep 17 00:00:00 2001 From: JosiahBroege <78816331+JosiahBroege@users.noreply.github.com> Date: Tue, 7 Jun 2022 17:04:18 -0500 Subject: [PATCH 026/127] Update PrivateCloud.DiagnosticInfo.psm1 Added RDMA activity and network card activity (for vendor specific counters mellanox and marvell(qlogic)) for counters collected. --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index e37492d..4b78154 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2946,7 +2946,7 @@ function Get-SddcDiagnosticInfo } else { Show-Update "Get counter sets" - $set = Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk" -ComputerName $ClusterNodes.Name + $set = Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk","RDMA*","Mellanox*","Marvell*" -ComputerName $ClusterNodes.Name Show-Update "Start monitoring ($($PerfSamples)s)" $PerfRaw = Get-Counter -Counter $set.Paths -SampleInterval 1 -MaxSamples $PerfSamples -ErrorAction Ignore -WarningAction Ignore Show-Update "Exporting counters" From 5857818b6cab859d4e8f7352dbe5be55a341c703 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Wed, 8 Jun 2022 13:35:52 -0500 Subject: [PATCH 027/127] added ,"RDMA*","Mellanox*","Marvell*" counters --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index e37492d..4b78154 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2946,7 +2946,7 @@ function Get-SddcDiagnosticInfo } else { Show-Update "Get counter sets" - $set = Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk" -ComputerName $ClusterNodes.Name + $set = Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk","RDMA*","Mellanox*","Marvell*" -ComputerName $ClusterNodes.Name Show-Update "Start monitoring ($($PerfSamples)s)" $PerfRaw = Get-Counter -Counter $set.Paths -SampleInterval 1 -MaxSamples $PerfSamples -ErrorAction Ignore -WarningAction Ignore Show-Update "Exporting counters" From 93d618e95e65d4e74755724950b28ef82b36df8b Mon Sep 17 00:00:00 2001 From: JosiahBroege <78816331+JosiahBroege@users.noreply.github.com> Date: Wed, 29 Jun 2022 14:58:01 -0500 Subject: [PATCH 028/127] Add upload of SSDC diagnostics to storage blob --- .../PrivateCloud.DiagnosticInfo.psm1 | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 4b78154..c58e012 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -3151,7 +3151,19 @@ function Get-SddcDiagnosticInfo Show-Update "Cleaning up CimSessions" Get-CimSession | Remove-CimSession +#Get the File-Name without path +$name = (Get-Item $ZipPath).Name +#The target URL wit SAS Token +$uri = "https://gsetools.blob.core.windows.net/sddcdata/$($name)?sp=acw&st=2022-06-28T17:26:35Z&se=2032-06-29T01:26:35Z&spr=https&sv=2021-06-08&sr=c&sig=4gtvKkicwS%2BcD6BSBgapTziNrfar11CL%2B6hsVHWzJXI%3D" + +#Define required Headers +$headers = @{ + 'x-ms-blob-type' = 'BlockBlob' + } + +#Upload File... +Invoke-RestMethod -Uri $uri -Method Put -Headers $headers -InFile $ZipPath -ErrorAction Continue Show-Update "COMPLETE ($(((Get-Date) - $TodayDate).ToString("m'm's\.f's'")))" -ForegroundColor Green } From d4c7caf91b025a7e791a1e7ddfd95d0b3784e6e9 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Wed, 6 Jul 2022 14:49:19 -0500 Subject: [PATCH 029/127] added Dell SDDC Version to transcript --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 1 + 1 file changed, 1 insertion(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index c58e012..6acd29f 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1680,6 +1680,7 @@ function Get-SddcDiagnosticInfo $transcriptFile = Join-Path $Path "0_CloudHealthGatherTranscript.log" try { Start-Transcript -Path $transcriptFile -Force + Write-host "Dell SDDC Version" } catch { # show error and rethrow to terminate Show-Error "Unable to start transcript at $transcriptFile" $_ From ed056947adcfbef5eb59fa7d7803f93505a40eba Mon Sep 17 00:00:00 2001 From: JosiahBroege <78816331+JosiahBroege@users.noreply.github.com> Date: Wed, 17 Aug 2022 17:18:23 -0500 Subject: [PATCH 030/127] Update PrivateCloud.DiagnosticInfo.psm1 Remove upload so that upload only happens once. --- .../PrivateCloud.DiagnosticInfo.psm1 | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 6acd29f..1f6c0da 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -3152,19 +3152,6 @@ function Get-SddcDiagnosticInfo Show-Update "Cleaning up CimSessions" Get-CimSession | Remove-CimSession -#Get the File-Name without path -$name = (Get-Item $ZipPath).Name - -#The target URL wit SAS Token -$uri = "https://gsetools.blob.core.windows.net/sddcdata/$($name)?sp=acw&st=2022-06-28T17:26:35Z&se=2032-06-29T01:26:35Z&spr=https&sv=2021-06-08&sr=c&sig=4gtvKkicwS%2BcD6BSBgapTziNrfar11CL%2B6hsVHWzJXI%3D" - -#Define required Headers -$headers = @{ - 'x-ms-blob-type' = 'BlockBlob' - } - -#Upload File... -Invoke-RestMethod -Uri $uri -Method Put -Headers $headers -InFile $ZipPath -ErrorAction Continue Show-Update "COMPLETE ($(((Get-Date) - $TodayDate).ToString("m'm's\.f's'")))" -ForegroundColor Green } From 588e59321a75bc9420fe2ffc04925545064b2097 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Tue, 6 Sep 2022 16:21:04 -0500 Subject: [PATCH 031/127] Added Get-NetNeighbor --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 1f6c0da..8de7e4f 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2237,8 +2237,9 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Echo Get-win32_networkadapter;Get-WmiObject win32_networkadapter}', 'Invoke-Command -ComputerName _C_ {Echo Get-TcpipParametersInterfaces;Get-ItemProperty -path HKLM:\System\CurrentControlSet\services\Tcpip\Parameters\Interfaces\*}', 'Invoke-Command -ComputerName _C_ {Echo Get-mpioParameters;Get-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters}', - 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"' - 'Get-MSDSMSupportedHW -CimSession _C_' + 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"', + 'Get-MSDSMSupportedHW -CimSession _C_', + 'Get-NetNeighbor -CimSession _C_' # These commands are specific to optional modules, add only if present # - DcbQos: RoCE environments primarily From 996900ec2c9ae587ee8b3e7a741583583a492187 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 10 Mar 2023 17:32:58 -0600 Subject: [PATCH 032/127] Update PrivateCloud.DiagnosticInfo.psm1 added missing closing } on mpioSettings --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 8de7e4f..d9e2d49 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2237,7 +2237,7 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Echo Get-win32_networkadapter;Get-WmiObject win32_networkadapter}', 'Invoke-Command -ComputerName _C_ {Echo Get-TcpipParametersInterfaces;Get-ItemProperty -path HKLM:\System\CurrentControlSet\services\Tcpip\Parameters\Interfaces\*}', 'Invoke-Command -ComputerName _C_ {Echo Get-mpioParameters;Get-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters}', - 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"', + 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"}', 'Get-MSDSMSupportedHW -CimSession _C_', 'Get-NetNeighbor -CimSession _C_' From 0565702e9b43ce812434731d7e8982b254561f74 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 23 Mar 2023 14:51:04 -0500 Subject: [PATCH 033/127] Added NetATC Support --- .../PrivateCloud.DiagnosticInfo.psm1 | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index d9e2d49..f3d3fa0 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1929,6 +1929,25 @@ function Get-SddcDiagnosticInfo catch { Show-Warning("Unable to get Cluster Shared Volumes. `nError="+$_.Exception.Message) } } + + Show-Update "Start gather of Network ATC information..." + + $JobStatic += start-job -Name NetIntentStatus { + try { + $o = Get-NetIntentStatus -ClusterName $using:AccessNode + $o | Export-Clixml ($using:Path + "GetNetIntentStatus.XML") + } + catch { Show-Warning("Unable to get NetIntentStatus. `nError="+$_.Exception.Message) } + + } + $JobStatic += start-job -Name NetIntent { + try { + $o = Get-NetIntent -ClusterName $using:AccessNode + $o | Export-Clixml ($using:Path + "GetNetIntent.XML") + } + catch { Show-Warning("Unable to get NetIntent. `nError="+$_.Exception.Message) } + + } } else { Show-Update "... Skip gather of cluster configuration since cluster is not available" } From 44509a8741454391cfb7101bb67368c9369e4bd7 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Tue, 4 Apr 2023 21:49:28 -0500 Subject: [PATCH 034/127] Added Get-NetIntent -GlobalOverrides --- .../PrivateCloud.DiagnosticInfo.psm1 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index f3d3fa0..1419e21 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1947,6 +1947,14 @@ function Get-SddcDiagnosticInfo } catch { Show-Warning("Unable to get NetIntent. `nError="+$_.Exception.Message) } + } + $JobStatic += start-job -Name NetIntentGlobalOverrides { + try { + $o = Get-NetIntent -GlobalOverrides -ClusterName $using:AccessNode + $o | Export-Clixml ($using:Path + "GetNetIntentGlobalOverrides.XML") + } + catch { Show-Warning("Unable to get NetIntent -GlobalOverrides. `nError="+$_.Exception.Message) } + } } else { Show-Update "... Skip gather of cluster configuration since cluster is not available" From d0c47f3ce0d9926f9aa18653e2a6bbe26ed707cb Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Wed, 5 Apr 2023 16:54:26 -0500 Subject: [PATCH 035/127] Added Get-NetIntentStatus -GlobalOverrides --- .../PrivateCloud.DiagnosticInfo.psm1 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 1419e21..3d46960 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1940,6 +1940,14 @@ function Get-SddcDiagnosticInfo catch { Show-Warning("Unable to get NetIntentStatus. `nError="+$_.Exception.Message) } } + $JobStatic += start-job -Name NetIntentStatus -GlobalOverrides { + try { + $o = Get-NetIntentStatus -GlobalOverrides -ClusterName $using:AccessNode + $o | Export-Clixml ($using:Path + "GetNetIntentStatusGlobalOverrides.XML") + } + catch { Show-Warning("Unable to get NetIntentStatus -GlobalOverrides. `nError="+$_.Exception.Message) } + + } $JobStatic += start-job -Name NetIntent { try { $o = Get-NetIntent -ClusterName $using:AccessNode From 904bfebabb99d7281e348db0488ba43c3a63b2bf Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 6 Apr 2023 16:30:23 -0500 Subject: [PATCH 036/127] NetIntentStatusGlobalOverrides Removed extra - in start-job -Name NetIntentStatusGlobalOverrides --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 3d46960..9403e33 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1940,7 +1940,7 @@ function Get-SddcDiagnosticInfo catch { Show-Warning("Unable to get NetIntentStatus. `nError="+$_.Exception.Message) } } - $JobStatic += start-job -Name NetIntentStatus -GlobalOverrides { + $JobStatic += start-job -Name NetIntentStatusGlobalOverrides { try { $o = Get-NetIntentStatus -GlobalOverrides -ClusterName $using:AccessNode $o | Export-Clixml ($using:Path + "GetNetIntentStatusGlobalOverrides.XML") From 474de4c285e410a31b21ea9f8da8bf1e8b7b9a16 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 11 May 2023 15:27:04 -0500 Subject: [PATCH 037/127] Update PrivateCloud.DiagnosticInfo.psm1 added 25gigisthenew10gig --- .../PrivateCloud.DiagnosticInfo.psm1 | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 9403e33..7c3f5b3 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1963,7 +1963,64 @@ function Get-SddcDiagnosticInfo } catch { Show-Warning("Unable to get NetIntent -GlobalOverrides. `nError="+$_.Exception.Message) } - } + } + Show-Update "Start gather of Cluster Perfomance information..." + $JobStatic += start-job -Name 25gigisthenew10gig { + try { + #Sample 4: As they say, "25-gig is the new 10-gig" + #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-4-as-they-say-25-gig-is-the-new-10-gig + $o = Invoke-Command (Get-ClusterNode -ClusterName $using:AccessNode).Name { + + Function Format-BitsPerSec { + Param ( + $RawValue + ) + $i = 0 ; $Labels = ("bps", "kbps", "Mbps", "Gbps", "Tbps", "Pbps") # Petabits, just in case! + Do { $RawValue /= 1000 ; $i++ } While ( $RawValue -Gt 1000 ) + # Return + [String][Math]::Round($RawValue) + " " + $Labels[$i] + } + + Get-NetAdapter | ForEach-Object { + + $Inbound = $_ | Get-ClusterPerf -NetAdapterSeriesName "NetAdapter.Bandwidth.Inbound" -TimeFrame "LastDay" + $Outbound = $_ | Get-ClusterPerf -NetAdapterSeriesName "NetAdapter.Bandwidth.Outbound" -TimeFrame "LastDay" + + If ($Inbound -Or $Outbound) { + + $InterfaceDescription = $_.InterfaceDescription + $LinkSpeed = $_.LinkSpeed + + $MeasureInbound = $Inbound | Measure-Object -Property Value -Maximum + $MaxInbound = $MeasureInbound.Maximum * 8 # Multiply to bits/sec + + $MeasureOutbound = $Outbound | Measure-Object -Property Value -Maximum + $MaxOutbound = $MeasureOutbound.Maximum * 8 # Multiply to bits/sec + + $Saturated = $False + + # Speed property is Int, e.g. 10000000000 + If (($MaxInbound -Gt (0.90 * $_.Speed)) -Or ($MaxOutbound -Gt (0.90 * $_.Speed))) { + $Saturated = $True + Write-Warning "In the last day, adapter '$InterfaceDescription' on server '$Env:ComputerName' exceeded 90% of its '$LinkSpeed' theoretical maximum bandwidth. In general, network saturation leads to higher latency and diminished reliability. Not good!" + } + + [PsCustomObject]@{ + "NetAdapter" = $InterfaceDescription + "LinkSpeed" = $LinkSpeed + "MaxInbound" = Format-BitsPerSec $MaxInbound + "MaxOutbound" = Format-BitsPerSec $MaxOutbound + "Saturated" = $Saturated + } + } + } + } + + $o | Sort-Object PsComputerName, InterfaceDescription | Export-Clixml ($using:Path + "25gigisthenew10gig.xml") + } + catch { Show-Warning("Unable to get 25gigisthenew10gig Data. `nError="+$_.Exception.Message) } + + } } else { Show-Update "... Skip gather of cluster configuration since cluster is not available" } From 6a34dae6beec7daf47124d8a8a57033efa514848 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 11 May 2023 16:10:28 -0500 Subject: [PATCH 038/127] Update PrivateCloud.DiagnosticInfo.psm1 Moved 25-gig is the new 10-gig --- .../PrivateCloud.DiagnosticInfo.psm1 | 112 +++++++++--------- 1 file changed, 54 insertions(+), 58 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 7c3f5b3..cab3b71 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1962,64 +1962,6 @@ function Get-SddcDiagnosticInfo $o | Export-Clixml ($using:Path + "GetNetIntentGlobalOverrides.XML") } catch { Show-Warning("Unable to get NetIntent -GlobalOverrides. `nError="+$_.Exception.Message) } - - } - Show-Update "Start gather of Cluster Perfomance information..." - $JobStatic += start-job -Name 25gigisthenew10gig { - try { - #Sample 4: As they say, "25-gig is the new 10-gig" - #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-4-as-they-say-25-gig-is-the-new-10-gig - $o = Invoke-Command (Get-ClusterNode -ClusterName $using:AccessNode).Name { - - Function Format-BitsPerSec { - Param ( - $RawValue - ) - $i = 0 ; $Labels = ("bps", "kbps", "Mbps", "Gbps", "Tbps", "Pbps") # Petabits, just in case! - Do { $RawValue /= 1000 ; $i++ } While ( $RawValue -Gt 1000 ) - # Return - [String][Math]::Round($RawValue) + " " + $Labels[$i] - } - - Get-NetAdapter | ForEach-Object { - - $Inbound = $_ | Get-ClusterPerf -NetAdapterSeriesName "NetAdapter.Bandwidth.Inbound" -TimeFrame "LastDay" - $Outbound = $_ | Get-ClusterPerf -NetAdapterSeriesName "NetAdapter.Bandwidth.Outbound" -TimeFrame "LastDay" - - If ($Inbound -Or $Outbound) { - - $InterfaceDescription = $_.InterfaceDescription - $LinkSpeed = $_.LinkSpeed - - $MeasureInbound = $Inbound | Measure-Object -Property Value -Maximum - $MaxInbound = $MeasureInbound.Maximum * 8 # Multiply to bits/sec - - $MeasureOutbound = $Outbound | Measure-Object -Property Value -Maximum - $MaxOutbound = $MeasureOutbound.Maximum * 8 # Multiply to bits/sec - - $Saturated = $False - - # Speed property is Int, e.g. 10000000000 - If (($MaxInbound -Gt (0.90 * $_.Speed)) -Or ($MaxOutbound -Gt (0.90 * $_.Speed))) { - $Saturated = $True - Write-Warning "In the last day, adapter '$InterfaceDescription' on server '$Env:ComputerName' exceeded 90% of its '$LinkSpeed' theoretical maximum bandwidth. In general, network saturation leads to higher latency and diminished reliability. Not good!" - } - - [PsCustomObject]@{ - "NetAdapter" = $InterfaceDescription - "LinkSpeed" = $LinkSpeed - "MaxInbound" = Format-BitsPerSec $MaxInbound - "MaxOutbound" = Format-BitsPerSec $MaxOutbound - "Saturated" = $Saturated - } - } - } - } - - $o | Sort-Object PsComputerName, InterfaceDescription | Export-Clixml ($using:Path + "25gigisthenew10gig.xml") - } - catch { Show-Warning("Unable to get 25gigisthenew10gig Data. `nError="+$_.Exception.Message) } - } } else { Show-Update "... Skip gather of cluster configuration since cluster is not available" @@ -2850,6 +2792,60 @@ function Get-SddcDiagnosticInfo } catch { Show-Warning "Gathering S2D connectivity failed" } + + Show-Update "Start gather of Cluster Performance information..." + try { + #Sample 4: As they say, "25-gig is the new 10-gig" + #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-4-as-they-say-25-gig-is-the-new-10-gig + $o = Invoke-Command (Get-ClusterNode -ClusterName $AccessNode).Name { + + Function Format-BitsPerSec { + Param ( + $RawValue + ) + $i = 0 ; $Labels = ("bps", "kbps", "Mbps", "Gbps", "Tbps", "Pbps") # Petabits, just in case! + Do { $RawValue /= 1000 ; $i++ } While ( $RawValue -Gt 1000 ) + # Return + [String][Math]::Round($RawValue) + " " + $Labels[$i] + } + + Get-NetAdapter | ForEach-Object { + + $Inbound = $_ | Get-ClusterPerf -NetAdapterSeriesName "NetAdapter.Bandwidth.Inbound" -TimeFrame "LastDay" + $Outbound = $_ | Get-ClusterPerf -NetAdapterSeriesName "NetAdapter.Bandwidth.Outbound" -TimeFrame "LastDay" + + If ($Inbound -Or $Outbound) { + + $InterfaceDescription = $_.InterfaceDescription + $LinkSpeed = $_.LinkSpeed + + $MeasureInbound = $Inbound | Measure-Object -Property Value -Maximum + $MaxInbound = $MeasureInbound.Maximum * 8 # Multiply to bits/sec + + $MeasureOutbound = $Outbound | Measure-Object -Property Value -Maximum + $MaxOutbound = $MeasureOutbound.Maximum * 8 # Multiply to bits/sec + + $Saturated = $False + + # Speed property is Int, e.g. 10000000000 + If (($MaxInbound -Gt (0.90 * $_.Speed)) -Or ($MaxOutbound -Gt (0.90 * $_.Speed))) { + $Saturated = $True + } + + [PsCustomObject]@{ + "NetAdapter" = $InterfaceDescription + "LinkSpeed" = $LinkSpeed + "MaxInbound" = Format-BitsPerSec $MaxInbound + "MaxOutbound" = Format-BitsPerSec $MaxOutbound + "Saturated" = $Saturated + } + } + } + } + + $o | Sort-Object PsComputerName, InterfaceDescription | Export-Clixml ($Path + "25gigisthenew10gig.xml") + } + catch { Show-Warning("Unable to get 25gigisthenew10gig Data. `nError="+$_.Exception.Message) } } #### From 62c313dd9fdb5b6b5376375a4fa660ffb6b19ab5 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 11 May 2023 16:36:05 -0500 Subject: [PATCH 039/127] Update PrivateCloud.DiagnosticInfo.psm1 resolved cluster name for Cluster Performance information --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index cab3b71..9606594 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2797,7 +2797,7 @@ function Get-SddcDiagnosticInfo try { #Sample 4: As they say, "25-gig is the new 10-gig" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-4-as-they-say-25-gig-is-the-new-10-gig - $o = Invoke-Command (Get-ClusterNode -ClusterName $AccessNode).Name { + $o = Invoke-Command (Get-ClusterNode -ClusterName $ClusterName).Name { Function Format-BitsPerSec { Param ( From 9dc25eaba62463d6ee982ebbb2b2f159eedc14dc Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 19 May 2023 11:08:13 -0500 Subject: [PATCH 040/127] Update PrivateCloud.DiagnosticInfo.psm1 BugFix: Only get MPIO settings when the role is installed BugFix: Only get OEMInformation when the OS is HCI NewFeature: Added get-NetQosDcbxSetting per NIC --- .../PrivateCloud.DiagnosticInfo.psm1 | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 9606594..dee4b2b 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2266,12 +2266,12 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Get-ComputerInfo}', 'Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}', 'Invoke-Command -ComputerName _C_ {Echo Get-RegSpacePortParameters;Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}', - 'Invoke-Command -ComputerName _C_ {Echo Get-RegOEMInformation;Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation}', + 'Invoke-Command -ComputerName _C_ {Echo Get-RegOEMInformation;IF((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation}}', 'Invoke-Command -ComputerName _C_ {Echo Get-netsh;netsh int tcp show global}', 'Invoke-Command -ComputerName _C_ {Echo Get-win32_networkadapter;Get-WmiObject win32_networkadapter}', 'Invoke-Command -ComputerName _C_ {Echo Get-TcpipParametersInterfaces;Get-ItemProperty -path HKLM:\System\CurrentControlSet\services\Tcpip\Parameters\Interfaces\*}', - 'Invoke-Command -ComputerName _C_ {Echo Get-mpioParameters;Get-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters}', - 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"}', + 'Invoke-Command -ComputerName _C_ {Echo Get-mpioParameters;IF((Get-WindowsFeature -Name 'Multipath-IO').Installed -eq 'True'){Get-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters}}', + 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;IF((Get-WindowsFeature -Name 'Multipath-IO').Installed -eq 'True'){Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"}}', 'Get-MSDSMSupportedHW -CimSession _C_', 'Get-NetNeighbor -CimSession _C_' @@ -2279,9 +2279,10 @@ function Get-SddcDiagnosticInfo # - DcbQos: RoCE environments primarily # - Hyper-V: may be ommitted in SOFS-only cases if (Get-Module DcbQos -ErrorAction SilentlyContinue) { - $CmdsToLog += 'Get-NetQosDcbxSetting -CimSession _C_', - 'Get-NetQosFlowControl -CimSession _C_', - 'Get-NetQosTrafficClass -CimSession _C_' + $CmdsToLog += 'Invoke-Command -ComputerName _C_ {Echo Get-NetQosDcbxSettingPerNic;Get-NetAdapter | Get-NetQosDcbxSetting}', + 'Get-NetQosDcbxSetting -CimSession _C_', + 'Get-NetQosFlowControl -CimSession _C_', + 'Get-NetQosTrafficClass -CimSession _C_' } if (Get-Module Hyper-V -ErrorAction SilentlyContinue) { From ecd9687f27cdb87b4e0727d69ff3edd99ce48f68 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 19 May 2023 11:17:54 -0500 Subject: [PATCH 041/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index dee4b2b..de1a532 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2270,8 +2270,8 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Echo Get-netsh;netsh int tcp show global}', 'Invoke-Command -ComputerName _C_ {Echo Get-win32_networkadapter;Get-WmiObject win32_networkadapter}', 'Invoke-Command -ComputerName _C_ {Echo Get-TcpipParametersInterfaces;Get-ItemProperty -path HKLM:\System\CurrentControlSet\services\Tcpip\Parameters\Interfaces\*}', - 'Invoke-Command -ComputerName _C_ {Echo Get-mpioParameters;IF((Get-WindowsFeature -Name 'Multipath-IO').Installed -eq 'True'){Get-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters}}', - 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;IF((Get-WindowsFeature -Name 'Multipath-IO').Installed -eq 'True'){Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"}}', + 'Invoke-Command -ComputerName _C_ {Echo Get-mpioParameters;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters}}', + 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"}}',11ce-bfc1-08002be10318}\000*"}}', 'Get-MSDSMSupportedHW -CimSession _C_', 'Get-NetNeighbor -CimSession _C_' From 0e34d35a5290c00df7793247454687ba180169e1 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 19 May 2023 11:23:16 -0500 Subject: [PATCH 042/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index de1a532..724ead4 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2271,7 +2271,7 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Echo Get-win32_networkadapter;Get-WmiObject win32_networkadapter}', 'Invoke-Command -ComputerName _C_ {Echo Get-TcpipParametersInterfaces;Get-ItemProperty -path HKLM:\System\CurrentControlSet\services\Tcpip\Parameters\Interfaces\*}', 'Invoke-Command -ComputerName _C_ {Echo Get-mpioParameters;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters}}', - 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"}}',11ce-bfc1-08002be10318}\000*"}}', + 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"}}', 'Get-MSDSMSupportedHW -CimSession _C_', 'Get-NetNeighbor -CimSession _C_' From 1b58f06b9c49cb288ef5f944598e85d279c3c8bf Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Wed, 24 May 2023 15:44:52 -0500 Subject: [PATCH 043/127] Update PrivateCloud.DiagnosticInfo.psm1 Added Get-VMNetworkAdapterIsolation -ManagementOS to support Mgmt vLAN for NetworkATC --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 724ead4..da46fa5 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2273,7 +2273,8 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Echo Get-mpioParameters;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters}}', 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"}}', 'Get-MSDSMSupportedHW -CimSession _C_', - 'Get-NetNeighbor -CimSession _C_' + 'Get-NetNeighbor -CimSession _C_', + 'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' # These commands are specific to optional modules, add only if present # - DcbQos: RoCE environments primarily From 07e1fc245b33018e780bcb3c8feb6f92c4aa9b17 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 25 May 2023 11:01:01 -0500 Subject: [PATCH 044/127] Update PrivateCloud.DiagnosticInfo.psm1 Breakfix for Sample 4: As they say, "25-gig is the new 10-gig" --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index da46fa5..854917d 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2799,6 +2799,8 @@ function Get-SddcDiagnosticInfo try { #Sample 4: As they say, "25-gig is the new 10-gig" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-4-as-they-say-25-gig-is-the-new-10-gig + $Cluster = Get-cluster + $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue $o = Invoke-Command (Get-ClusterNode -ClusterName $ClusterName).Name { Function Format-BitsPerSec { From 106ba48b080a6b6e64d429e82995da8fa1760cad Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 25 May 2023 11:07:00 -0500 Subject: [PATCH 045/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 854917d..d501827 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2801,7 +2801,7 @@ function Get-SddcDiagnosticInfo #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-4-as-they-say-25-gig-is-the-new-10-gig $Cluster = Get-cluster $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue - $o = Invoke-Command (Get-ClusterNode -ClusterName $ClusterName).Name { + $o = Invoke-Command $ClusterNodes.Name { Function Format-BitsPerSec { Param ( From ae1bb1109c815ec9ff79fafcd195fdf9bbb6d7f4 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 25 May 2023 14:07:17 -0500 Subject: [PATCH 046/127] Update PrivateCloud.DiagnosticInfo.psm1 added Sample 1: CPU, I see you! added Sample 2: Fire, fire, latency outlier added Sample 3: Noisy neighbor? That's write! added Sample 5: Make storage trendy again! added Sample 6: Memory hog, you can run but you can't hide Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting --- .../PrivateCloud.DiagnosticInfo.psm1 | 277 +++++++++++++++++- 1 file changed, 276 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index d501827..2eb9341 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2797,7 +2797,162 @@ function Get-SddcDiagnosticInfo Show-Update "Start gather of Cluster Performance information..." try { - #Sample 4: As they say, "25-gig is the new 10-gig" + Show-Update " Gathering Sample 1: CPU, I see you!" + #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-1-cpu-i-see-you + $Output =@() + Function Format-Hours { + Param ( + $RawValue + ) + # Weekly timeframe has frequency 15 minutes = 4 points per hour + [Math]::Round($RawValue/4) + } + + Function Format-Percent { + Param ( + $RawValue + ) + [String][Math]::Round($RawValue) + " " + "%" + } + + $Output = Get-ClusterNode | ForEach-Object { + $Data = $_ | Get-ClusterPerf -ClusterNodeSeriesName "ClusterNode.Cpu.Usage" -TimeFrame "LastWeek" + + $Measure = $Data | Measure-Object -Property Value -Minimum -Maximum -Average + $Min = $Measure.Minimum + $Max = $Measure.Maximum + $Avg = $Measure.Average + + [PsCustomObject]@{ + "ClusterNode" = $_.Name + "MinCpuObserved" = Format-Percent $Min + "MaxCpuObserved" = Format-Percent $Max + "AvgCpuObserved" = Format-Percent $Avg + "HrsOver25%" = Format-Hours ($Data | Where-Object Value -Gt 25).Length + "HrsOver50%" = Format-Hours ($Data | Where-Object Value -Gt 50).Length + "HrsOver75%" = Format-Hours ($Data | Where-Object Value -Gt 75).Length + } + } + $Output | Sort-Object ClusterNode | Export-Clixml ($Path + "CPUIseeyou.xml") + }catch { Show-Warning("Unable to get CPU, I see you Data. `nError="+$_.Exception.Message) } + + try { + Show-Update " Gathering Sample 2: Fire, fire, latency outlier" + #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-2-fire-fire-latency-outlier + + $Cluster = Get-cluster + $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue + $o = Invoke-Command $ClusterNodes.Name { Function Format-Latency { + Param ( + $RawValue + ) + $i = 0 ; $Labels = ("s", "ms", "μs", "ns") # Petabits, just in case! + Do { $RawValue *= 1000 ; $i++ } While ( $RawValue -Lt 1 ) + # Return + [String][Math]::Round($RawValue, 2) + " " + $Labels[$i] + } + + Function Format-StandardDeviation { + Param ( + $RawValue + ) + If ($RawValue -Gt 0) { + $Sign = "+" + } + Else { + $Sign = "-" + } + # Return + $Sign + [String][Math]::Round([Math]::Abs($RawValue), 2) + "σ" + } + + $HDD = Get-StorageSubSystem Cluster* | Get-PhysicalDisk + + $Output = $HDD | ForEach-Object { + + $Iops = $_ | Get-ClusterPerf -PhysicalDiskSeriesName "PhysicalDisk.Iops.Total" -TimeFrame "LastWeek" + $AvgIops = ($Iops | Measure-Object -Property Value -Average).Average + + If ($AvgIops -Gt 1) { # Exclude idle or nearly idle drives + + $Latency = $_ | Get-ClusterPerf -PhysicalDiskSeriesName "PhysicalDisk.Latency.Average" -TimeFrame "LastWeek" + $AvgLatency = ($Latency | Measure-Object -Property Value -Average).Average + + [PsCustomObject]@{ + "FriendlyName" = $_.FriendlyName + "SerialNumber" = $_.SerialNumber + "MediaType" = $_.MediaType + "AvgLatencyPopulation" = $null # Set below + "AvgLatencyThisHDD" = Format-Latency $AvgLatency + "RawAvgLatencyThisHDD" = $AvgLatency + "Deviation" = $null # Set below + "RawDeviation" = $null # Set below + } + } + } + + If ($Output.Length -Ge 3) { # Minimum population requirement + + # Find mean μ and standard deviation σ + $μ = ($Output | Measure-Object -Property RawAvgLatencyThisHDD -Average).Average + $d = $Output | ForEach-Object { ($_.RawAvgLatencyThisHDD - $μ) * ($_.RawAvgLatencyThisHDD - $μ) } + $σ = [Math]::Sqrt(($d | Measure-Object -Sum).Sum / $Output.Length) + + $FoundOutlier = $False + + $Output | ForEach-Object { + $Deviation = ($_.RawAvgLatencyThisHDD - $μ) / $σ + $_.AvgLatencyPopulation = Format-Latency $μ + $_.Deviation = Format-StandardDeviation $Deviation + $_.RawDeviation = $Deviation + # If distribution is Normal, expect >99% within 3σ + If ($Deviation -Gt 3) { + $FoundOutlier = $True + } + } + } + } + $output | Sort-Object PsComputerName | Export-Clixml ($Path + "latencyoutlier.xml") + } catch { Show-Warning("Unable to get latency outlier Data. `nError="+$_.Exception.Message) } + try { + Show-Update " Gathering Sample 3: Noisy neighbor? That's write!" + #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-3-noisy-neighbor-thats-write + $Cluster = Get-cluster + $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue + $o = Invoke-Command $ClusterNodes.Name { + + + Function Format-Iops { + Param ( + $RawValue + ) + $i = 0 ; $Labels = (" ", "K", "M", "B", "T") # Thousands, millions, billions, trillions... + Do { if($RawValue -Gt 1000){$RawValue /= 1000 ; $i++ } } While ( $RawValue -Gt 1000 ) + # Return + [String][Math]::Round($RawValue) + " " + $Labels[$i] + } + + Get-VM | ForEach-Object { + $IopsTotal = $_ | Get-ClusterPerf -VMSeriesName "VHD.Iops.Total" + $IopsRead = $_ | Get-ClusterPerf -VMSeriesName "VHD.Iops.Read" + $IopsWrite = $_ | Get-ClusterPerf -VMSeriesName "VHD.Iops.Write" + [PsCustomObject]@{ + "VM" = $_.Name + "IopsTotal" = Format-Iops $IopsTotal.Value + "IopsRead" = Format-Iops $IopsRead.Value + "IopsWrite" = Format-Iops $IopsWrite.Value + "RawIopsTotal" = $IopsTotal.Value # For sorting... + } + } + + } + + $o | Sort-Object RawIopsTotal -Descending | Select-Object -First 10 | Format-Table PsComputerName, VM, IopsTotal, IopsRead, IopsWrite | Export-Clixml ($Path + "Noisyneighbor.xml") + } + catch { Show-Warning("Unable to get Noisy neighbor Data. `nError="+$_.Exception.Message) } + + try { + Show-Update " Gathering Sample 4: As they say, 25-gig is the new 10-gig" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-4-as-they-say-25-gig-is-the-new-10-gig $Cluster = Get-cluster $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue @@ -2850,6 +3005,126 @@ function Get-SddcDiagnosticInfo $o | Sort-Object PsComputerName, InterfaceDescription | Export-Clixml ($Path + "25gigisthenew10gig.xml") } catch { Show-Warning("Unable to get 25gigisthenew10gig Data. `nError="+$_.Exception.Message) } + + try { + Show-Update " Gathering Sample 5: Make storage trendy again!" + #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-6-memory-hog-you-can-run-but-you-cant-hide + Function Format-Bytes { + Param ( + $RawValue + ) + $i = 0 ; $Labels = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") + Do { $RawValue /= 1024 ; $i++ } While ( $RawValue -Gt 1024 ) + # Return + [String][Math]::Round($RawValue) + " " + $Labels[$i] + } + + Function Format-Trend { + Param ( + $RawValue + ) + If ($RawValue -Eq 0) { + "0" + } + Else { + If ($RawValue -Gt 0) { + $Sign = "+" + } + Else { + $Sign = "-" + } + # Return + $Sign + $(Format-Bytes [Math]::Abs($RawValue)) + "/day" + } + } + + Function Format-Days { + Param ( + $RawValue + ) + [Math]::Round($RawValue) + } + + $CSV = Get-Volume | Where-Object FileSystem -Like "*CSV*" + + $Output = $CSV | ForEach-Object { + + $N = 14 # Require 14 days of history + + $Data = $_ | Get-ClusterPerf -VolumeSeriesName "Volume.Size.Available" -TimeFrame "LastYear" | Sort-Object Time | Select-Object -Last $N + + If ($Data.Length -Ge $N) { + + # Last N days as (x, y) points + $PointsXY = @() + 1..$N | ForEach-Object { + $PointsXY += [PsCustomObject]@{ "X" = $_ ; "Y" = $Data[$_-1].Value } + } + + # Linear (y = ax + b) least squares algorithm + $MeanX = ($PointsXY | Measure-Object -Property X -Average).Average + $MeanY = ($PointsXY | Measure-Object -Property Y -Average).Average + $XX = $PointsXY | ForEach-Object { $_.X * $_.X } + $XY = $PointsXY | ForEach-Object { $_.X * $_.Y } + $SSXX = ($XX | Measure-Object -Sum).Sum - $N * $MeanX * $MeanX + $SSXY = ($XY | Measure-Object -Sum).Sum - $N * $MeanX * $MeanY + $A = ($SSXY / $SSXX) + $B = ($MeanY - $A * $MeanX) + $RawTrend = -$A # Flip to get daily increase in Used (vs decrease in Remaining) + $Trend = Format-Trend $RawTrend + + If ($RawTrend -Gt 0) { + $DaysToFull = Format-Days ($_.SizeRemaining / $RawTrend) + } + Else { + $DaysToFull = "-" + } + } + Else { + $Trend = "InsufficientHistory" + $DaysToFull = "-" + } + + [PsCustomObject]@{ + "Volume" = $_.FileSystemLabel + "Size" = Format-Bytes ($_.Size) + "Used" = Format-Bytes ($_.Size - $_.SizeRemaining) + "Trend" = $Trend + "DaysToFull" = $DaysToFull + } + } + $Output | Sort-Object ClusterNode | Export-Clixml ($Path + "trendyagain.xml") + }catch { Show-Warning("Unable to get Make storage trendy again! Data. `nError="+$_.Exception.Message) } + + try { + Show-Update " Gathering Sample 6: Memory hog, you can run but you can't hide" + #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-6-memory-hog-you-can-run-but-you-cant-hide + $Output = Invoke-Command (Get-ClusterNode).Name { + Function Format-Bytes { + Param ( + $RawValue + ) + $i = 0 ; $Labels = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") + Do { if( $RawValue -Gt 1024 ){ $RawValue /= 1024 ; $i++ } } While ( $RawValue -Gt 1024 ) + # Return + [String][Math]::Round($RawValue) + " " + $Labels[$i] + } + + Get-VM | ForEach-Object { + $Data = $_ | Get-ClusterPerf -VMSeriesName "VM.Memory.Assigned" -TimeFrame "LastMonth" + If ($Data) { + $AvgMemoryUsage = ($Data | Measure-Object -Property Value -Average).Average + [PsCustomObject]@{ + "VM" = $_.Name + "AvgMemoryUsage" = Format-Bytes $AvgMemoryUsage.Value + "RawAvgMemoryUsage" = $AvgMemoryUsage.Value # For sorting... + } + } + } + } + $Output | Sort-Object RawAvgMemoryUsage -Descending | Select-Object -First 10 | Format-Table PsComputerName, VM, AvgMemoryUsage | Export-Clixml ($Path + "Memoryhog.xml") + }catch { Show-Warning("Unable to get Memory hog Data. `nError="+$_.Exception.Message) } + } #### From b20be6d90c972e582af84b55a50ec82597dafb63 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 25 May 2023 14:12:47 -0500 Subject: [PATCH 047/127] Update PrivateCloud.DiagnosticInfo.psm1 fixed special chars --- .../PrivateCloud.DiagnosticInfo.psm1 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 2eb9341..9579be4 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2893,19 +2893,19 @@ function Get-SddcDiagnosticInfo If ($Output.Length -Ge 3) { # Minimum population requirement - # Find mean μ and standard deviation σ - $μ = ($Output | Measure-Object -Property RawAvgLatencyThisHDD -Average).Average - $d = $Output | ForEach-Object { ($_.RawAvgLatencyThisHDD - $μ) * ($_.RawAvgLatencyThisHDD - $μ) } - $σ = [Math]::Sqrt(($d | Measure-Object -Sum).Sum / $Output.Length) + # Find mean u and standard deviation o + $u = ($Output | Measure-Object -Property RawAvgLatencyThisHDD -Average).Average + $d = $Output | ForEach-Object { ($_.RawAvgLatencyThisHDD - $u) * ($_.RawAvgLatencyThisHDD - $u) } + $o = [Math]::Sqrt(($d | Measure-Object -Sum).Sum / $Output.Length) $FoundOutlier = $False $Output | ForEach-Object { - $Deviation = ($_.RawAvgLatencyThisHDD - $μ) / $σ - $_.AvgLatencyPopulation = Format-Latency $μ + $Deviation = ($_.RawAvgLatencyThisHDD - $u) / $o + $_.AvgLatencyPopulation = Format-Latency $u $_.Deviation = Format-StandardDeviation $Deviation $_.RawDeviation = $Deviation - # If distribution is Normal, expect >99% within 3σ + # If distribution is Normal, expect >99% within 3 devations If ($Deviation -Gt 3) { $FoundOutlier = $True } From f79c9427fee0772c7146989537a1a54ccdfb2cee Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 25 May 2023 14:35:28 -0500 Subject: [PATCH 048/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 9579be4..53f4396 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2799,7 +2799,7 @@ function Get-SddcDiagnosticInfo try { Show-Update " Gathering Sample 1: CPU, I see you!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-1-cpu-i-see-you - $Output =@() + $Output ="" Function Format-Hours { Param ( $RawValue @@ -2863,7 +2863,7 @@ function Get-SddcDiagnosticInfo $Sign = "-" } # Return - $Sign + [String][Math]::Round([Math]::Abs($RawValue), 2) + "σ" + $Sign + [String][Math]::Round([Math]::Abs($RawValue), 2) } $HDD = Get-StorageSubSystem Cluster* | Get-PhysicalDisk From 8b6eebdbc752b7930d21112cf21e4ec6c8134156 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 26 May 2023 11:07:48 -0500 Subject: [PATCH 049/127] Update PrivateCloud.DiagnosticInfo.psm1 1. Only run Get-MSDSMSupportedHW if MPIO is installed 2. Added Get-AzureStackHCI and Get-AzureStackHCIArcIntegration 3. Added Get-VMProcessor --- .../PrivateCloud.DiagnosticInfo.psm1 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 53f4396..a62ff4d 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2272,7 +2272,7 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Echo Get-TcpipParametersInterfaces;Get-ItemProperty -path HKLM:\System\CurrentControlSet\services\Tcpip\Parameters\Interfaces\*}', 'Invoke-Command -ComputerName _C_ {Echo Get-mpioParameters;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters}}', 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"}}', - 'Get-MSDSMSupportedHW -CimSession _C_', + 'Invoke-Command -ComputerName _C_ {Echo Get-MSDSMSupportedHW;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-MSDSMSupportedHW -CimSession _C_}}', 'Get-NetNeighbor -CimSession _C_', 'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' @@ -2288,6 +2288,7 @@ function Get-SddcDiagnosticInfo if (Get-Module Hyper-V -ErrorAction SilentlyContinue) { $CmdsToLog += 'Get-VM -CimSession _C_ -ErrorAction SilentlyContinue', + 'Invoke-Command -ComputerName _C_ {Echo Get-vmprocessor;'Get-VM -CimSession _C_ | Get-VMProcessor -ErrorAction SilentlyContinue'}', 'Get-VMNetworkAdapter -All -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMSwitch -CimSession _C_ -ErrorAction SilentlyContinue', 'Echo Get-VMSwitchTeam; Get-VMSwitch -CimSession _C_ | Where-Object {$_.EmbeddedTeamingEnabled -eq $true} | %{Get-VMSwitchTeam -CimSession _C_ -SwitchName $_.name}', @@ -2301,6 +2302,11 @@ function Get-SddcDiagnosticInfo $clusterCimSession = New-CimSession -ComputerName $ClusterName $CmdsToLog += "Get-DedupVolume -CimSession $clusterCimSession" } + #Added to gather AzureStack HCI info + If ((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){ + $CmdsToLog += "Get-AzureStackHCI" + $CmdsToLog += "Get-AzureStackHCIArcIntegration" + } foreach ($cmd in $CmdsToLog) { From a0c3cd6fbe2cf4dbf64c87ac369f1adfb593a1ab Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 26 May 2023 11:10:28 -0500 Subject: [PATCH 050/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index a62ff4d..511f836 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2288,7 +2288,7 @@ function Get-SddcDiagnosticInfo if (Get-Module Hyper-V -ErrorAction SilentlyContinue) { $CmdsToLog += 'Get-VM -CimSession _C_ -ErrorAction SilentlyContinue', - 'Invoke-Command -ComputerName _C_ {Echo Get-vmprocessor;'Get-VM -CimSession _C_ | Get-VMProcessor -ErrorAction SilentlyContinue'}', + 'Invoke-Command -ComputerName _C_ {Echo Get-vmprocessor;Get-VM -CimSession _C_ | Get-VMProcessor -ErrorAction SilentlyContinue}', 'Get-VMNetworkAdapter -All -CimSession _C_ -ErrorAction SilentlyContinue', 'Get-VMSwitch -CimSession _C_ -ErrorAction SilentlyContinue', 'Echo Get-VMSwitchTeam; Get-VMSwitch -CimSession _C_ | Where-Object {$_.EmbeddedTeamingEnabled -eq $true} | %{Get-VMSwitchTeam -CimSession _C_ -SwitchName $_.name}', From 9ffc7aab679aedbe69698844a9085554ad7ba2d1 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 26 May 2023 12:17:17 -0500 Subject: [PATCH 051/127] Update PrivateCloud.DiagnosticInfo.psm1 --- .../PrivateCloud.DiagnosticInfo.psm1 | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 511f836..4f754ef 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2800,8 +2800,21 @@ function Get-SddcDiagnosticInfo } catch { Show-Warning "Gathering S2D connectivity failed" } - + + Show-Update "AzureStack HCI info" + #Added by JG + try { + If ((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){ + Get-AzureStackHCI| Export-Clixml ($Path + "GetAzureStackHCI.xml") + Get-AzureStackHCIArcIntegration| Export-Clixml ($Path + "AzureStackHCIArcIntegration.xml") + } + } catch { + Show-Warning("Unable to get AzureStack HCI info. `nError="+$_.Exception.Message) + } + + Show-Update "Start gather of Cluster Performance information..." + #Added by JG try { Show-Update " Gathering Sample 1: CPU, I see you!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-1-cpu-i-see-you @@ -2821,8 +2834,8 @@ function Get-SddcDiagnosticInfo [String][Math]::Round($RawValue) + " " + "%" } - $Output = Get-ClusterNode | ForEach-Object { - $Data = $_ | Get-ClusterPerf -ClusterNodeSeriesName "ClusterNode.Cpu.Usage" -TimeFrame "LastWeek" + $Output = $ClusterNodes | ForEach-Object { + $Data = $_ | Get-ClusterPerf -ClusterNodeSeriesName "ClusterNode.Cpu.Usage" -TimeFrame "LastWeek" -ErrorAction SilentlyContinue $Measure = $Data | Measure-Object -Property Value -Minimum -Maximum -Average $Min = $Measure.Minimum From e788b9d1fe3b9a2b54bad050bffb2034e7815f32 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 26 May 2023 12:46:59 -0500 Subject: [PATCH 052/127] Update PrivateCloud.DiagnosticInfo.psm1 --- .../PrivateCloud.DiagnosticInfo.psm1 | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 4f754ef..32e61d6 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2819,13 +2819,6 @@ function Get-SddcDiagnosticInfo Show-Update " Gathering Sample 1: CPU, I see you!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-1-cpu-i-see-you $Output ="" - Function Format-Hours { - Param ( - $RawValue - ) - # Weekly timeframe has frequency 15 minutes = 4 points per hour - [Math]::Round($RawValue/4) - } Function Format-Percent { Param ( @@ -2847,9 +2840,9 @@ function Get-SddcDiagnosticInfo "MinCpuObserved" = Format-Percent $Min "MaxCpuObserved" = Format-Percent $Max "AvgCpuObserved" = Format-Percent $Avg - "HrsOver25%" = Format-Hours ($Data | Where-Object Value -Gt 25).Length - "HrsOver50%" = Format-Hours ($Data | Where-Object Value -Gt 50).Length - "HrsOver75%" = Format-Hours ($Data | Where-Object Value -Gt 75).Length + "HrsOver25%" = [Math]::Round(($Data | Where-Object Value -Gt 25).value/4) + "HrsOver50%" = [Math]::Round(($Data | Where-Object Value -Gt 50).value/4) + "HrsOver75%" = [Math]::Round(($Data | Where-Object Value -Gt 75).value/4) } } $Output | Sort-Object ClusterNode | Export-Clixml ($Path + "CPUIseeyou.xml") From 15445e3cb4d47354450ab3a63ed172d858eb3e47 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 26 May 2023 14:24:09 -0500 Subject: [PATCH 053/127] Update PrivateCloud.DiagnosticInfo.psm1 --- .../PrivateCloud.DiagnosticInfo.psm1 | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 32e61d6..2a961ac 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2820,13 +2820,6 @@ function Get-SddcDiagnosticInfo #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-1-cpu-i-see-you $Output ="" - Function Format-Percent { - Param ( - $RawValue - ) - [String][Math]::Round($RawValue) + " " + "%" - } - $Output = $ClusterNodes | ForEach-Object { $Data = $_ | Get-ClusterPerf -ClusterNodeSeriesName "ClusterNode.Cpu.Usage" -TimeFrame "LastWeek" -ErrorAction SilentlyContinue @@ -2834,16 +2827,17 @@ function Get-SddcDiagnosticInfo $Min = $Measure.Minimum $Max = $Measure.Maximum $Avg = $Measure.Average - + + $data | %{ [PsCustomObject]@{ "ClusterNode" = $_.Name - "MinCpuObserved" = Format-Percent $Min - "MaxCpuObserved" = Format-Percent $Max - "AvgCpuObserved" = Format-Percent $Avg - "HrsOver25%" = [Math]::Round(($Data | Where-Object Value -Gt 25).value/4) - "HrsOver50%" = [Math]::Round(($Data | Where-Object Value -Gt 50).value/4) - "HrsOver75%" = [Math]::Round(($Data | Where-Object Value -Gt 75).value/4) - } + "MinCpuObserved" = [String][Math]::Round($Min) + " " + "%" + "MaxCpuObserved" = [String][Math]::Round($Max) + " " + "%" + "AvgCpuObserved" = [String][Math]::Round($Avg) + " " + "%" + "HrsOver25%" = [Math]::Round(($_ | Where-Object Value -Gt 25).value/4) + "HrsOver50%" = [Math]::Round(($_ | Where-Object Value -Gt 50).value/4) + "HrsOver75%" = [Math]::Round(($_ | Where-Object Value -Gt 75).value/4) + }} } $Output | Sort-Object ClusterNode | Export-Clixml ($Path + "CPUIseeyou.xml") }catch { Show-Warning("Unable to get CPU, I see you Data. `nError="+$_.Exception.Message) } From 7fd0f14de1e4a92585b54c37de9d4cb3a861b563 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 26 May 2023 14:32:41 -0500 Subject: [PATCH 054/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 2a961ac..1ba336f 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2827,10 +2827,11 @@ function Get-SddcDiagnosticInfo $Min = $Measure.Minimum $Max = $Measure.Maximum $Avg = $Measure.Average + $ClusterNode = $_.Name - $data | %{ + $data | ForEach-Object{ [PsCustomObject]@{ - "ClusterNode" = $_.Name + "ClusterNode" = $ClusterNode "MinCpuObserved" = [String][Math]::Round($Min) + " " + "%" "MaxCpuObserved" = [String][Math]::Round($Max) + " " + "%" "AvgCpuObserved" = [String][Math]::Round($Avg) + " " + "%" From d0b9ee2fd15cd2e13c2d9a250c660fc800491622 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 26 May 2023 14:43:37 -0500 Subject: [PATCH 055/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 1ba336f..ae683cb 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2815,8 +2815,9 @@ function Get-SddcDiagnosticInfo Show-Update "Start gather of Cluster Performance information..." #Added by JG - try { + #try { Show-Update " Gathering Sample 1: CPU, I see you!" + Show-Update "$ClusterNodes" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-1-cpu-i-see-you $Output ="" @@ -2841,7 +2842,7 @@ function Get-SddcDiagnosticInfo }} } $Output | Sort-Object ClusterNode | Export-Clixml ($Path + "CPUIseeyou.xml") - }catch { Show-Warning("Unable to get CPU, I see you Data. `nError="+$_.Exception.Message) } + #}catch { Show-Warning("Unable to get CPU, I see you Data. `nError="+$_.Exception.Message) } try { Show-Update " Gathering Sample 2: Fire, fire, latency outlier" From 2d736b941bef5ec0a3bec40f27f92cb6d0e13f39 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 26 May 2023 14:48:04 -0500 Subject: [PATCH 056/127] Update PrivateCloud.DiagnosticInfo.psm1 --- .../PrivateCloud.DiagnosticInfo.psm1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index ae683cb..3b06965 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2836,9 +2836,9 @@ function Get-SddcDiagnosticInfo "MinCpuObserved" = [String][Math]::Round($Min) + " " + "%" "MaxCpuObserved" = [String][Math]::Round($Max) + " " + "%" "AvgCpuObserved" = [String][Math]::Round($Avg) + " " + "%" - "HrsOver25%" = [Math]::Round(($_ | Where-Object Value -Gt 25).value/4) - "HrsOver50%" = [Math]::Round(($_ | Where-Object Value -Gt 50).value/4) - "HrsOver75%" = [Math]::Round(($_ | Where-Object Value -Gt 75).value/4) + "HrsOver25%" = try{[Math]::Round(($_ | Where-Object Value -Gt 25).value/4)} Catch{} + "HrsOver50%" = try{[Math]::Round(($_ | Where-Object Value -Gt 50).value/4)} Catch{} + "HrsOver75%" = try{[Math]::Round(($_ | Where-Object Value -Gt 75).value/4)} Catch{} }} } $Output | Sort-Object ClusterNode | Export-Clixml ($Path + "CPUIseeyou.xml") From cc20a676a14030d5d77ba99008027211b0b957e6 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 26 May 2023 15:01:35 -0500 Subject: [PATCH 057/127] Update PrivateCloud.DiagnosticInfo.psm1 --- .../PrivateCloud.DiagnosticInfo.psm1 | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 3b06965..31176eb 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2820,26 +2820,8 @@ function Get-SddcDiagnosticInfo Show-Update "$ClusterNodes" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-1-cpu-i-see-you $Output ="" - $Output = $ClusterNodes | ForEach-Object { - $Data = $_ | Get-ClusterPerf -ClusterNodeSeriesName "ClusterNode.Cpu.Usage" -TimeFrame "LastWeek" -ErrorAction SilentlyContinue - - $Measure = $Data | Measure-Object -Property Value -Minimum -Maximum -Average - $Min = $Measure.Minimum - $Max = $Measure.Maximum - $Avg = $Measure.Average - $ClusterNode = $_.Name - - $data | ForEach-Object{ - [PsCustomObject]@{ - "ClusterNode" = $ClusterNode - "MinCpuObserved" = [String][Math]::Round($Min) + " " + "%" - "MaxCpuObserved" = [String][Math]::Round($Max) + " " + "%" - "AvgCpuObserved" = [String][Math]::Round($Avg) + " " + "%" - "HrsOver25%" = try{[Math]::Round(($_ | Where-Object Value -Gt 25).value/4)} Catch{} - "HrsOver50%" = try{[Math]::Round(($_ | Where-Object Value -Gt 50).value/4)} Catch{} - "HrsOver75%" = try{[Math]::Round(($_ | Where-Object Value -Gt 75).value/4)} Catch{} - }} + $_ | Get-ClusterPerf -ClusterNodeSeriesName "ClusterNode.Cpu.Usage" -TimeFrame "LastWeek" -ErrorAction SilentlyContinue } $Output | Sort-Object ClusterNode | Export-Clixml ($Path + "CPUIseeyou.xml") #}catch { Show-Warning("Unable to get CPU, I see you Data. `nError="+$_.Exception.Message) } From 639e8a10d3cd53265d0a5bce0c3bed37a0040c38 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 26 May 2023 15:25:11 -0500 Subject: [PATCH 058/127] Update PrivateCloud.DiagnosticInfo.psm1 --- .../PrivateCloud.DiagnosticInfo.psm1 | 87 +------------------ 1 file changed, 1 insertion(+), 86 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 31176eb..c76c25a 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2817,7 +2817,6 @@ function Get-SddcDiagnosticInfo #Added by JG #try { Show-Update " Gathering Sample 1: CPU, I see you!" - Show-Update "$ClusterNodes" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-1-cpu-i-see-you $Output ="" $Output = $ClusterNodes | ForEach-Object { @@ -2999,91 +2998,7 @@ function Get-SddcDiagnosticInfo try { Show-Update " Gathering Sample 5: Make storage trendy again!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-6-memory-hog-you-can-run-but-you-cant-hide - Function Format-Bytes { - Param ( - $RawValue - ) - $i = 0 ; $Labels = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") - Do { $RawValue /= 1024 ; $i++ } While ( $RawValue -Gt 1024 ) - # Return - [String][Math]::Round($RawValue) + " " + $Labels[$i] - } - - Function Format-Trend { - Param ( - $RawValue - ) - If ($RawValue -Eq 0) { - "0" - } - Else { - If ($RawValue -Gt 0) { - $Sign = "+" - } - Else { - $Sign = "-" - } - # Return - $Sign + $(Format-Bytes [Math]::Abs($RawValue)) + "/day" - } - } - - Function Format-Days { - Param ( - $RawValue - ) - [Math]::Round($RawValue) - } - - $CSV = Get-Volume | Where-Object FileSystem -Like "*CSV*" - - $Output = $CSV | ForEach-Object { - - $N = 14 # Require 14 days of history - - $Data = $_ | Get-ClusterPerf -VolumeSeriesName "Volume.Size.Available" -TimeFrame "LastYear" | Sort-Object Time | Select-Object -Last $N - - If ($Data.Length -Ge $N) { - - # Last N days as (x, y) points - $PointsXY = @() - 1..$N | ForEach-Object { - $PointsXY += [PsCustomObject]@{ "X" = $_ ; "Y" = $Data[$_-1].Value } - } - - # Linear (y = ax + b) least squares algorithm - $MeanX = ($PointsXY | Measure-Object -Property X -Average).Average - $MeanY = ($PointsXY | Measure-Object -Property Y -Average).Average - $XX = $PointsXY | ForEach-Object { $_.X * $_.X } - $XY = $PointsXY | ForEach-Object { $_.X * $_.Y } - $SSXX = ($XX | Measure-Object -Sum).Sum - $N * $MeanX * $MeanX - $SSXY = ($XY | Measure-Object -Sum).Sum - $N * $MeanX * $MeanY - $A = ($SSXY / $SSXX) - $B = ($MeanY - $A * $MeanX) - $RawTrend = -$A # Flip to get daily increase in Used (vs decrease in Remaining) - $Trend = Format-Trend $RawTrend - - If ($RawTrend -Gt 0) { - $DaysToFull = Format-Days ($_.SizeRemaining / $RawTrend) - } - Else { - $DaysToFull = "-" - } - } - Else { - $Trend = "InsufficientHistory" - $DaysToFull = "-" - } - - [PsCustomObject]@{ - "Volume" = $_.FileSystemLabel - "Size" = Format-Bytes ($_.Size) - "Used" = Format-Bytes ($_.Size - $_.SizeRemaining) - "Trend" = $Trend - "DaysToFull" = $DaysToFull - } - } - $Output | Sort-Object ClusterNode | Export-Clixml ($Path + "trendyagain.xml") + Get-Volume | Where-Object FileSystem -Like "*CSV*" | %{$_ | Get-ClusterPerf -VolumeSeriesName "Volume.Size.Available" -TimeFrame "LastYear" | Sort-Object Time | Select-Object -Last 14} | Sort-Object ClusterNode | Export-Clixml ($Path + "trendyagain.xml") }catch { Show-Warning("Unable to get Make storage trendy again! Data. `nError="+$_.Exception.Message) } try { From ddeba8f8f674ba17619aeee093b975c5fd21881f Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Tue, 30 May 2023 14:55:21 -0500 Subject: [PATCH 059/127] Update PrivateCloud.DiagnosticInfo.psm1 Resolved Fire, fire, latency outlier outputting CPU, I see you! --- .../PrivateCloud.DiagnosticInfo.psm1 | 136 +++++++++--------- 1 file changed, 70 insertions(+), 66 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index c76c25a..1bc1247 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2831,77 +2831,81 @@ function Get-SddcDiagnosticInfo $Cluster = Get-cluster $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue - $o = Invoke-Command $ClusterNodes.Name { Function Format-Latency { - Param ( - $RawValue - ) - $i = 0 ; $Labels = ("s", "ms", "μs", "ns") # Petabits, just in case! - Do { $RawValue *= 1000 ; $i++ } While ( $RawValue -Lt 1 ) - # Return - [String][Math]::Round($RawValue, 2) + " " + $Labels[$i] - } - - Function Format-StandardDeviation { - Param ( - $RawValue - ) - If ($RawValue -Gt 0) { - $Sign = "+" - } - Else { - $Sign = "-" - } - # Return - $Sign + [String][Math]::Round([Math]::Abs($RawValue), 2) - } - - $HDD = Get-StorageSubSystem Cluster* | Get-PhysicalDisk - - $Output = $HDD | ForEach-Object { + $o = Invoke-Command $ClusterNodes.Name { + + Function Format-Latency { + Param ( + $RawValue + ) + $i = 0 ; $Labels = ("s", "ms", "μs", "ns") # Petabits, just in case! + Do { $RawValue *= 1000 ; $i++ } While ( $RawValue -Lt 1 ) + # Return + [String][Math]::Round($RawValue, 2) + " " + $Labels[$i] + } + + Function Format-StandardDeviation { + Param ( + $RawValue + ) + If ($RawValue -Gt 0) { + $Sign = "+" + } + Else { + $Sign = "-" + } + # Return + $Sign + [String][Math]::Round([Math]::Abs($RawValue), 2) + } + + $HDD = Get-StorageSubSystem Cluster* | Get-PhysicalDisk + + $Output = $HDD | ForEach-Object { $Iops = $_ | Get-ClusterPerf -PhysicalDiskSeriesName "PhysicalDisk.Iops.Total" -TimeFrame "LastWeek" $AvgIops = ($Iops | Measure-Object -Property Value -Average).Average - If ($AvgIops -Gt 1) { # Exclude idle or nearly idle drives - - $Latency = $_ | Get-ClusterPerf -PhysicalDiskSeriesName "PhysicalDisk.Latency.Average" -TimeFrame "LastWeek" - $AvgLatency = ($Latency | Measure-Object -Property Value -Average).Average - - [PsCustomObject]@{ - "FriendlyName" = $_.FriendlyName - "SerialNumber" = $_.SerialNumber - "MediaType" = $_.MediaType - "AvgLatencyPopulation" = $null # Set below - "AvgLatencyThisHDD" = Format-Latency $AvgLatency - "RawAvgLatencyThisHDD" = $AvgLatency - "Deviation" = $null # Set below - "RawDeviation" = $null # Set below - } - } - } - - If ($Output.Length -Ge 3) { # Minimum population requirement - - # Find mean u and standard deviation o - $u = ($Output | Measure-Object -Property RawAvgLatencyThisHDD -Average).Average - $d = $Output | ForEach-Object { ($_.RawAvgLatencyThisHDD - $u) * ($_.RawAvgLatencyThisHDD - $u) } - $o = [Math]::Sqrt(($d | Measure-Object -Sum).Sum / $Output.Length) - - $FoundOutlier = $False - - $Output | ForEach-Object { - $Deviation = ($_.RawAvgLatencyThisHDD - $u) / $o - $_.AvgLatencyPopulation = Format-Latency $u - $_.Deviation = Format-StandardDeviation $Deviation - $_.RawDeviation = $Deviation - # If distribution is Normal, expect >99% within 3 devations - If ($Deviation -Gt 3) { - $FoundOutlier = $True - } - } - } + If ($AvgIops -Gt 1) { # Exclude idle or nearly idle drives + + $Latency = $_ | Get-ClusterPerf -PhysicalDiskSeriesName "PhysicalDisk.Latency.Average" -TimeFrame "LastWeek" + $AvgLatency = ($Latency | Measure-Object -Property Value -Average).Average + + [PsCustomObject]@{ + "FriendlyName" = $_.FriendlyName + "SerialNumber" = $_.SerialNumber + "MediaType" = $_.MediaType + "AvgLatencyPopulation" = $null # Set below + "AvgLatencyThisHDD" = Format-Latency $AvgLatency + "RawAvgLatencyThisHDD" = $AvgLatency + "Deviation" = $null # Set below + "RawDeviation" = $null # Set below + } + } + } + + If ($Output.Length -Ge 3) { # Minimum population requirement + + # Find mean u and standard deviation o + $u = ($Output | Measure-Object -Property RawAvgLatencyThisHDD -Average).Average + $d = $Output | ForEach-Object { ($_.RawAvgLatencyThisHDD - $u) * ($_.RawAvgLatencyThisHDD - $u) } + $o = [Math]::Sqrt(($d | Measure-Object -Sum).Sum / $Output.Length) + + $FoundOutlier = $False + + $Output | ForEach-Object { + $Deviation = ($_.RawAvgLatencyThisHDD - $u) / $o + $_.AvgLatencyPopulation = Format-Latency $u + $_.Deviation = Format-StandardDeviation $Deviation + $_.RawDeviation = $Deviation + # If distribution is Normal, expect >99% within 3 devations + If ($Deviation -Gt 3) { + $FoundOutlier = $True + } + } + } + + $Output } - $output | Sort-Object PsComputerName | Export-Clixml ($Path + "latencyoutlier.xml") + $o | Sort-Object PsComputerName | Export-Clixml ($Path + "latencyoutlier.xml") } catch { Show-Warning("Unable to get latency outlier Data. `nError="+$_.Exception.Message) } try { Show-Update " Gathering Sample 3: Noisy neighbor? That's write!" From d5c6060a7c47979701af6d226cff6acdcbd1f9c7 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Tue, 30 May 2023 17:10:43 -0500 Subject: [PATCH 060/127] Update PrivateCloud.DiagnosticInfo.psm1 Resolved dup entries in the Fire, fire, latency outlier output --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 1bc1247..2fd5618 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2857,7 +2857,7 @@ function Get-SddcDiagnosticInfo $Sign + [String][Math]::Round([Math]::Abs($RawValue), 2) } - $HDD = Get-StorageSubSystem Cluster* | Get-PhysicalDisk + $HDD = Get-StorageNode | ?{$ENV:COMPUTERNAME -imatch ($_.name -split '\.')[0]} | Get-PhysicalDisk $Output = $HDD | ForEach-Object { From f9af8755670c0b54056a6559a719a062eb82fed9 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Tue, 30 May 2023 17:30:16 -0500 Subject: [PATCH 061/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 2fd5618..deb20ad 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2857,7 +2857,7 @@ function Get-SddcDiagnosticInfo $Sign + [String][Math]::Round([Math]::Abs($RawValue), 2) } - $HDD = Get-StorageNode | ?{$ENV:COMPUTERNAME -imatch ($_.name -split '\.')[0]} | Get-PhysicalDisk + $HDD = Get-StorageNode | ?{$ENV:COMPUTERNAME -imatch ($_.name -split '\.')[0]} | Get-PhysicalDisk -PhysicallyConnected $Output = $HDD | ForEach-Object { From 20b4dff771368cb553790ee4dcada9724da1e2d4 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Tue, 30 May 2023 17:51:34 -0500 Subject: [PATCH 062/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index deb20ad..54e3a03 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2864,7 +2864,7 @@ function Get-SddcDiagnosticInfo $Iops = $_ | Get-ClusterPerf -PhysicalDiskSeriesName "PhysicalDisk.Iops.Total" -TimeFrame "LastWeek" $AvgIops = ($Iops | Measure-Object -Property Value -Average).Average - If ($AvgIops -Gt 1) { # Exclude idle or nearly idle drives + If ($AvgIops -Gt 0) { # Exclude idle or nearly idle drives $Latency = $_ | Get-ClusterPerf -PhysicalDiskSeriesName "PhysicalDisk.Latency.Average" -TimeFrame "LastWeek" $AvgLatency = ($Latency | Measure-Object -Property Value -Average).Average From 173e9572e714bb74f0c530a1f577b5f0203b63c0 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Wed, 31 May 2023 12:57:07 -0500 Subject: [PATCH 063/127] Remove FT from Samples --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 54e3a03..0849806 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2940,7 +2940,7 @@ function Get-SddcDiagnosticInfo } - $o | Sort-Object RawIopsTotal -Descending | Select-Object -First 10 | Format-Table PsComputerName, VM, IopsTotal, IopsRead, IopsWrite | Export-Clixml ($Path + "Noisyneighbor.xml") + $o | Sort-Object RawIopsTotal -Descending | Select-Object -First 10 | Export-Clixml ($Path + "Noisyneighbor.xml") } catch { Show-Warning("Unable to get Noisy neighbor Data. `nError="+$_.Exception.Message) } @@ -3031,7 +3031,7 @@ function Get-SddcDiagnosticInfo } } } - $Output | Sort-Object RawAvgMemoryUsage -Descending | Select-Object -First 10 | Format-Table PsComputerName, VM, AvgMemoryUsage | Export-Clixml ($Path + "Memoryhog.xml") + $Output | Sort-Object RawAvgMemoryUsage -Descending | Select-Object -First 10 | Export-Clixml ($Path + "Memoryhog.xml") }catch { Show-Warning("Unable to get Memory hog Data. `nError="+$_.Exception.Message) } } From c735187bb8bf17ba7e4156566ba6a4a51f068480 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Tue, 6 Jun 2023 13:30:32 -0500 Subject: [PATCH 064/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 0849806..44174f0 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1990,6 +1990,11 @@ function Get-SddcDiagnosticInfo catch { Show-Error("Unable to get Drivers on $using:node. `nError="+$_.Exception.Message) } $o | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "GetDrivers.XML") } + $JobStatic += start-job -Name "Nic Driver Suite Information: $node" { + try { $o = Invoke-Command -ScriptBlock {Get-ChildItem -Recurse "HKLM:\SOFTWARE\Dell\MUP"} -ComputerName $using:node } + catch { Show-Warning "Unable to get Nic Driver Suite on $using:node." } + $o | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "DSUMUP.XML") + } } # consider using this as the generic copyout job set From b50be6bccb02c5000f9ce4b3b021d19743f49f00 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Tue, 6 Jun 2023 15:53:26 -0500 Subject: [PATCH 065/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 44174f0..59584fa 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1993,7 +1993,7 @@ function Get-SddcDiagnosticInfo $JobStatic += start-job -Name "Nic Driver Suite Information: $node" { try { $o = Invoke-Command -ScriptBlock {Get-ChildItem -Recurse "HKLM:\SOFTWARE\Dell\MUP"} -ComputerName $using:node } catch { Show-Warning "Unable to get Nic Driver Suite on $using:node." } - $o | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "DSUMUP.XML") + $o | select @{Label='Name';Expression={$_.name}},@{Label='Property';Expression={($_ | Get-ItemProperty -ErrorAction SilentlyContinue).'(default)'}} | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "DSUMUP.xml") } } From 3e502df8f0827038e2997b65fd59738b02a0f187 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Tue, 6 Jun 2023 15:55:18 -0500 Subject: [PATCH 066/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 59584fa..14d4c7e 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1993,7 +1993,7 @@ function Get-SddcDiagnosticInfo $JobStatic += start-job -Name "Nic Driver Suite Information: $node" { try { $o = Invoke-Command -ScriptBlock {Get-ChildItem -Recurse "HKLM:\SOFTWARE\Dell\MUP"} -ComputerName $using:node } catch { Show-Warning "Unable to get Nic Driver Suite on $using:node." } - $o | select @{Label='Name';Expression={$_.name}},@{Label='Property';Expression={($_ | Get-ItemProperty -ErrorAction SilentlyContinue).'(default)'}} | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "DSUMUP.xml") + $o | select PSComputerName,@{Label='Name';Expression={$_.name}},@{Label='Property';Expression={($_ | Get-ItemProperty -ErrorAction SilentlyContinue).'(default)'}} | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "DSUMUP.xml") } } From 8fa1f4ea1ed2a81c5ac4fa33aa420e8e2a501075 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Tue, 6 Jun 2023 17:08:41 -0500 Subject: [PATCH 067/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 14d4c7e..ab40cb0 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1990,11 +1990,11 @@ function Get-SddcDiagnosticInfo catch { Show-Error("Unable to get Drivers on $using:node. `nError="+$_.Exception.Message) } $o | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "GetDrivers.XML") } - $JobStatic += start-job -Name "Nic Driver Suite Information: $node" { + <#$JobStatic += start-job -Name "Nic Driver Suite Information: $node" { try { $o = Invoke-Command -ScriptBlock {Get-ChildItem -Recurse "HKLM:\SOFTWARE\Dell\MUP"} -ComputerName $using:node } catch { Show-Warning "Unable to get Nic Driver Suite on $using:node." } $o | select PSComputerName,@{Label='Name';Expression={$_.name}},@{Label='Property';Expression={($_ | Get-ItemProperty -ErrorAction SilentlyContinue).'(default)'}} | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "DSUMUP.xml") - } + }#> } # consider using this as the generic copyout job set @@ -2278,6 +2278,7 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Echo Get-mpioParameters;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters}}', 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"}}', 'Invoke-Command -ComputerName _C_ {Echo Get-MSDSMSupportedHW;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-MSDSMSupportedHW -CimSession _C_}}', + 'Invoke-Command -ComputerName _C_ {Echo Get-DriverSuiteVersion;Get-ChildItem HKLM:\SOFTWARE\Dell\MUP -Recurse | Get-ItemProperty}', 'Get-NetNeighbor -CimSession _C_', 'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' From 82d368356e1060a73487ddc15218458dff82f5a8 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Tue, 6 Jun 2023 17:22:22 -0500 Subject: [PATCH 068/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 5 ----- 1 file changed, 5 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index ab40cb0..b3f32ef 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1990,11 +1990,6 @@ function Get-SddcDiagnosticInfo catch { Show-Error("Unable to get Drivers on $using:node. `nError="+$_.Exception.Message) } $o | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "GetDrivers.XML") } - <#$JobStatic += start-job -Name "Nic Driver Suite Information: $node" { - try { $o = Invoke-Command -ScriptBlock {Get-ChildItem -Recurse "HKLM:\SOFTWARE\Dell\MUP"} -ComputerName $using:node } - catch { Show-Warning "Unable to get Nic Driver Suite on $using:node." } - $o | select PSComputerName,@{Label='Name';Expression={$_.name}},@{Label='Property';Expression={($_ | Get-ItemProperty -ErrorAction SilentlyContinue).'(default)'}} | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "DSUMUP.xml") - }#> } # consider using this as the generic copyout job set From 388a50b114cf8ff74fea1a09005944041029a54b Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Wed, 7 Jun 2023 13:44:25 -0500 Subject: [PATCH 069/127] Added ChipsetVersion --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index b3f32ef..cbd362c 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2274,7 +2274,8 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"}}', 'Invoke-Command -ComputerName _C_ {Echo Get-MSDSMSupportedHW;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-MSDSMSupportedHW -CimSession _C_}}', 'Invoke-Command -ComputerName _C_ {Echo Get-DriverSuiteVersion;Get-ChildItem HKLM:\SOFTWARE\Dell\MUP -Recurse | Get-ItemProperty}', - 'Get-NetNeighbor -CimSession _C_', + 'Invoke-Command -ComputerName _C_ {Echo Get-ChipsetVersion;Get-WmiObject win32_product | ? Name -like "*chipset*"}', + 'Get-NetNeighbor -CimSession _C_', 'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' # These commands are specific to optional modules, add only if present From 99e0d7a2388ed0e69a25f68107286af8bfa1e2c8 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Wed, 2 Aug 2023 15:57:16 -0500 Subject: [PATCH 070/127] Get-ProcessByService --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index cbd362c..622c2ad 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2275,6 +2275,7 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Echo Get-MSDSMSupportedHW;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-MSDSMSupportedHW -CimSession _C_}}', 'Invoke-Command -ComputerName _C_ {Echo Get-DriverSuiteVersion;Get-ChildItem HKLM:\SOFTWARE\Dell\MUP -Recurse | Get-ItemProperty}', 'Invoke-Command -ComputerName _C_ {Echo Get-ChipsetVersion;Get-WmiObject win32_product | ? Name -like "*chipset*"}', + 'Invoke-Command -ComputerName _C_ {Echo Get-ProcessByService;$aps=GPs;$r=@();$Ass=GWmi Win32_Service;foreach($p in $aps){$ss=$Ass|?{$_.ProcessID -eq $p.Id};IF($ss){$r+=[PSCustomObject]@{Service=$ss.DisplayName;ProcessName=$p.ProcessName;ProcessID=$p.Id}}}$r}', 'Get-NetNeighbor -CimSession _C_', 'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' @@ -3226,7 +3227,7 @@ function Get-SddcDiagnosticInfo } else { Show-Update "Get counter sets" - $set = Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk","RDMA*","Mellanox*","Marvell*" -ComputerName $ClusterNodes.Name + $set = Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk","RDMA*","Mellanox*","Marvell*","Hyper-V Hypervisor Virtual Processor" -ComputerName $ClusterNodes.Name Show-Update "Start monitoring ($($PerfSamples)s)" $PerfRaw = Get-Counter -Counter $set.Paths -SampleInterval 1 -MaxSamples $PerfSamples -ErrorAction Ignore -WarningAction Ignore Show-Update "Exporting counters" From b2bd87c4c531600f1fd02fdaaac053e1104facc1 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Wed, 2 Aug 2023 15:59:36 -0500 Subject: [PATCH 071/127] Get-ProcessByServicde2 --- .../de278bf4-3c8d-4f73-bac4-8935310e7c16.vsidx | Bin 0 -> 130176 bytes .../FileContentIndex/read.lock | 0 .vs/PrivateCloud.DiagnosticInfo/v17/.wsuo | Bin 0 -> 24064 bytes .vs/ProjectSettings.json | 3 +++ .vs/VSWorkspaceState.json | 8 ++++++++ .vs/slnx.sqlite | Bin 0 -> 90112 bytes 6 files changed, 11 insertions(+) create mode 100644 .vs/PrivateCloud.DiagnosticInfo/FileContentIndex/de278bf4-3c8d-4f73-bac4-8935310e7c16.vsidx create mode 100644 .vs/PrivateCloud.DiagnosticInfo/FileContentIndex/read.lock create mode 100644 .vs/PrivateCloud.DiagnosticInfo/v17/.wsuo create mode 100644 .vs/ProjectSettings.json create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/slnx.sqlite diff --git a/.vs/PrivateCloud.DiagnosticInfo/FileContentIndex/de278bf4-3c8d-4f73-bac4-8935310e7c16.vsidx b/.vs/PrivateCloud.DiagnosticInfo/FileContentIndex/de278bf4-3c8d-4f73-bac4-8935310e7c16.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..ccdf707742de7c36fb44b94f4022d56b2ffe1d91 GIT binary patch literal 130176 zcmXWDi*nmM@-H}ByDu^bXGzEebg|PG5{)OXSl(&X|WN(p@+v?Y`i`a&OIk-5A?ycXj&MSFMK~uM2tO14Mz(}(CD}2u zdnfyj96pl{-|0%ee<$A^`92dNi5Q45L zX^Hei1|kztf+$545T%LoL`4EU0Y?C@ECkME5M%%{XfhZwcrrvX%w!Z~?8yjZjAZJ_ zB*_G1n#gn_lPA-K=#gkgv?s5goCrDf#0X-57)^{PCJ{@Bt%()H_QV3QnpjJ$CpHj^ zf1Qcj5hsWP;yiJQxS9BYct?UDp(jC+03=K#coHHBiTs*L6eKDVfy9YKO`<1pCW(-A zAW4walO#z}BmqeiNhgvlNsc5>QX(mngm=D>Oh^_a_ap;A%2SRDTz;M`jqmg44-oRG^bCC`1BzwLaUmVW!_X(Q&&w> zH9xCnsG6~Abk&5a$yKvd&9xG|60#De60Q=l5~&io5=$knRUfN(AD6p zVXcO1HPUM2)u^h`RHLg#Urnl-pqhN8A1d8enpav?+Ep5FNtMo(zE`gg)hn-FRrNYm zufBTC)$3Zl-m4Rooo#q!L}hekd}V26d1XaqRb`>Fy0UmRV`30x>|g-glZMl3e~EsHCE@TI@{_TsyB`0 zt-1}>JE`8Q>bOHRyyZTYoU!d;l z`iSR!eLU2{)gsqY)Y8<_*Q%|Rs1?*o*C1Os_lu7_BUP>-pepq@^(R<(Au_Vuf; zji`;Tjj2tlZCzVYTd1wBt*>pWov0nu&ev|P-BSBd2T=!AhggSHhq;cbj!>t%PJNwZ zom8Fhzf+xbootU68Kth26jtY=rxp`KH{=z4|vg6B(ptLq!DZ>hfB>i=o# z|GCxgqJEe4yQ}{+^`Bk+K^yY_He}O~wjrz`ydm3$bPW*==^G*&q8b7X85=S+#5Tk= zBsAn#Lt;ZxL*|Ao4Ots!C)42}G6qeP>iQMv)%z|z3E z8GJML%_y4@no&2SYbM!D&`i0}ywO9WZKGZD>KmgQD;kTJzHy>)&^X_C(|FhT*!Z~# zq6t$Id=p|5p^2$Uv`L31sU|^_rY7Yk%}u&A8JavbSvT1?`O+++SyZz?v-oBe%?iz` zo2zWDs=4A7+gyEfjm7CM#{{ukU>hHD_l=qZN$`$26`9Qg*+)!>Qca#Up6Xlumnev5hE4tlN?Wj#O zQ937j-O=lwUJvy4KyQNHB)utmGxQeeEz#RbZ?^()@MZ5Ez2E73Mc*a;?I^zCKO_C9 z@$Jx$mkpsCve}S!Lq0a2>P=N|YKlMkhE^L&H}tll?;HBD*>szY+-%flGj29|vvHeE z+-%ZjGjBG_hHo}pZMfO+yy0(~{cdx>^V8;$Zk~3V&vf&=+kD+^y4&U-x{=dHnvL`u znKlYGBW$$WIKPRoNqC+%S#M^ySzvRmHdnk%o15I+?B

AN2#N9!UE@_yds-L_d(* z1Gzs`=Ap6=m3yfCL$zQje5l(8T0KzvKxh1d9vExjDDhxZ zL3sriKD30jM7G4X#I+=}B(?WyO zrJiE#8`^qo>#40xTidqwZ5`V>wRLXmxoxhvMA{u~_q%p~Xb-e~+_jI-?UzIQ^H1CB zR*F{XR>guk!L;DoLAMjMdTe!SjcAQ;t!S-p9kkB3KC~gW5!xi$gqNmGxt&wHLVHV$ zP)0V4w5;k`m00!8>J6(uSW~gxj_sb=?kn3Oc3|wVV~5Y| z;MgN&kBmLx`5Sv??AurN?asbS_Fb{>hJDZM2e2QJ3CV6r9P1|}nuiOHEM!4xp1net3U zre+3@3=9Lyz%ls6ATn4OoY^4QpxNNr@QV$R4Ko`B8-b0QjfRbpjhT%zn}AIdn>3p| zn=VWym<47%vw_*f?1eeOoMcWh2h4fq zGIKNYJ@W(ej`_fRWPWBrupn7bEC34=3yuZPLS!MaUo(rq;>?m@NwTC^0+uG0G)pIz z3`>@!z*1rEdyI7 zwrI9kws^J*wkoy)TPL<^wpzC0jgg%dI|p|0>}|*11bfr$Dv&{O((f*PjqW z@Vezq#Ww_N2jBcth!L+iZ+JQFIseUfJHC75yIc9+{+U01;m@3Z;rwgOzwNk?TqrIK z7mka>#mvRR#hLel_nP;H_cND*%ZW?FrROqm8M#bc&RhwufGf?F<;rsvIdBe^gX4hL z7Y=7W)O^r<@O=2ihscMS4>vw?K1x0UA0wXxpMXyjpFG!!YsWQSN&E!d2yXCFbK|)c z+yb|nTf82)6WjrJ19zUgnfspmz&&1Bc@R8IJa`@=4~a*?Bk<^XI`AZT>Uokp0Z$W8 znkT$H@RWI)dAjh-c@{ha&zfh;v*$VTeCD&`bK;BOi{cCL#q(A3HS)9N=Y^lo{7v&W z&wsluX}49gt@>>>Z7Z{_?6!K}ZpZD`Y`5!nKW_JSd)RFcpSR-2R>-YzTM@P*ZhNtn zc%HV>ZIEhV7`g6Ku8Jnr>^v*1*;bTcfweZ>`u` zyS0AnVC#mh^IP9ZGdg?+Yq?p+|x}*0U{k@}qcJyPnA%7ds=N)C&ustP;#S^2_xtDj{%gC(W`bYR*Teqn$Nn4Nf9v*LweQ^iMeHT)$9`}7 z{n_sC6kGBB&iD8Gq5e2fdMHrlerT%$8x9-}+#UGaVT)fe#h;|Si`~;<_w}&r4trX@ z`~CCbKn{5s@BZ)}4j<(3Q9n{V|9)(%NA~>4T*Q^S9?6MdbCo!)5sS`H4P1 z+2^P9{B(c*OrLx44BwtZ{K9u%_}4Fc_T@mo9QI$jr!PJG0=uvE%U1*k99J&I&G2>i z__ZwSXZ#Jm9-h8Fw_oA;t4&`&Zr?cn#-DMwe0!w0z`s2{fBVvZ`wHK_{pZ`a_8XqM z&)@Ewj?k`Zx@zdE&{e;>Dt6Vmt7*60c01nTKEciL^aa1X?(^5K6J6JLo$NZ*b4=esU;UFy2rb#vD(UAK1KTPONX$WEB9_np+8G@ZmNv6FMBM5lZQ z=WY<)pu1u2#@J21)2@53($qwh15mpqVA&a z5_HLS=~tIhmvWcpE?v3|U7otEyKK7byBxdOb#v+#(XCUr>h65#-k`e;-EHb_w!5Y7 zmb=^9-5C<;SN%LKa?<#&b;=A$R-S&Hg?@@ox`ups@ zzv&|(NAhqa;z;@DA1de1llIcjyk=P?~M-q=D9Z5ct`AC){S&!s;tRxCR$7(oM z@mQr}m5zP|H0pWeEasJyZ!hmZ z&xZbNe*SFK&u0AD=$}sfOqZX3>Ysn$=O6p?&xasXkQYHdMExQ*L~LrY*@(75>?jxr z<`Fp|QW0DrTtH-i9a``+HXHGI5XVX!Yw?2!;e?2y2hnTM8__$_d(q=9N%R*XrH~-x zB%~JdB%~423mJs`C1eyb3waTW2t|e32-OzkqP9YHLJ6UIp_EV{)F9L-losk$C?k{= z$_tf*%0ewdT?9li2r+;d1~FtYQZcq-6k-H1j$+hebYe_m%wiHk8=OStiqgyxd?L=<|fRCu(hy_uvFNMuw2*|VTG_tSP*s)Rtsx|b;1T=qp+!H zLP!D-&EYrgq;N_&5N;Gs3wILE3Fn2wyJg{K;V#16h4;co5x59K1TBIWA&8Jf$Rb>e zWFG4xFhnY1DxubBA!GvB03Shh*88OVis``@gm|4#fid55MU-L z5{NX3q(yoa=_HaDDTtIr$|B7oT~N~!nTp&N29vqSoybR#g~(E55P1-J5?PDvMNT4T zk!O(?k@107F)J|}F*`8_F()x+u?Vq%SVpmEv3Rj^u?n#&v1+j{;!MT46=x7z>e_w0+(7 zl=PIM(9qM5ezWN}yl2pJ+4J1~e4lckE`7T8S@g5)=dqu4KbwAz{haza_p9hv-Jer`3H>Ga@2Y=~ zl2Az=Bxxl<3H~PkLr^M}bt@^A8-famWJ)rPTt#w_+#!OOJWGC-+e&Wtax3LF%Izu< zggt(dUk|ctWp|S=W5Lv-$Fd@Y!Ob8=z*UP&5Lc2E`2O(Q`6c^vDLfLSG*Wsgla#Ym zLMkoQTpS_zB%zkjNT3on652wSflJty2Z53R5=IG=1TDcxuo9evAR$Uf60(G=gqwuB zoJbMprnazcBvn}ICXkbslarH|Q0XMf0co@}UYaOP zl4h1xN$aIUs;8tMq#va>(p%}B^j`WPeUv^)KTE&JAZ3_j&@wm~ybMW(S^k=3B&AwM zkWtI%Wt?TAGCdS60f{4iyGhA3$)sh0`Ci7M1yPS=jt(>Erlbo|$lw3frN?wRWLG(i9Wg{;S^3qBaJT4sD zh`jXjGRTXUmmn`uUXr|IdHIkxEAO3rC-S|P?;rBNP7$g|tH_HYAF8IRR;s?EWQ=#ZQVG#jWB_@t}BAJSm=$h$?|X0KI`zcf*j;s#SvDA_A1l~lM6a0Mti zD|u7$y;z{CQHm8}TK)`5X{Dl4NvWGs@5LZR=K*DApr|h@cu>$5(Fhd+B(ktaPN1MG z{TX@%vOEERfP$R8go1DryzILhCryDm5xm zm0Fd!N?VmWm5wS&l_r(6N>-(yQdVhI>7vrLfRqd>PbzDby~-Cg3oJrv1~qFn8#P-s z2Q^1EC$+GGXcn(lp;oQV59-X+`HmO|Ekt$A>c-2Da~ssXQg^D}llpjpe-rrkZy*%N zLlHa43y=@^RHKsz{~=IQs9UICpguxv;IF|0^&QO>^hltop`p+)Xm-%-OGPXyKZ^KQ z)a8K^pfykmv_)+l=oV-PR0F*O#lQXr`UmI-YzS;Nu-U@{frle%yU^CqHqcUNccr-E z!f65i%CFEGXe|n?z$#!husyH?ut#7|z@CAL(jkj{iE9mj4Jb9Dwg^lEdqv$4g+kN> zfq9htP~byR57jzgGb(W?x&gZYC&1exTyaqLkb8HO2#JB$KGfKkKfVT>>)7-yIS zOaPNEWkV03N6-$m2OU9Y&(O_6qh^A|#F$`5fg^*MSoSGGOt;FUbwyMsOOO0q4Oba2ebTZUNte zAHYZOGXw@fly5W)5GDv3f`Q;6LsI8$f>prFv9nQC5t5h#kZi zh(93ygRH0^N(3xeckw5R1H=*H1W`jY5G_Op(L)Rne?g286T}P=UuA)~LOesfK)gY` zL;MZ#0}_E$Luw#VNE=8kBnF8?+Cu6ey+Arb5(OXOa!3QD36h3%g5)51NC8rUlp)QK zE|9K}ZjkPfYsd{`3V8#$h0Gvx$Uh+e16dSAjA#p+Mh3_O|64zh%3$TN z?qL~Bb5!MM-4{L<=4(A%q4=91a`3PqLXIYm2S;N`GIlwu?`2y!VTxz&9aA9!a za2ep@;gaBT2h4+9cW~Xq^$s^tfaFcVZGxMHTYx)(dj)q6_YU4GcyHi+1Md>v&+yy9 zM-5o>KR$*!4Glq)duW=WVMFs1z0ZNkfvJI|fz1P#10M!{9=7Z7_%w7#wE98FLFhr8 zkh=~d4k8U=9{PEZ+d=LTAP!1k3om3EWZB1MC*#t=pA*0RWq@@Unqg>%fek}941L+? zgB}Jm40agiLCdo5^*CrVXgBCM=sf82U_>bfMi0ghCJ$yFY%1w0Uk{!Relz&CxC(wd z_{YI_gBOFBgExbBgZG1vgU^GX2mdhy7=9sA5T&j}Jw!jmc}QeP&5+oT#E|lk$&l+I zvmx^#Z%ggTddTaLZ$o|`W;4ugnBy>~Ve!K{4wn|wH^X%|+|o$s_$iGw#qa?J2*#!! z8@#?7o5R>Vj*S|dFgDkbax`(r4Ih~pnH-rKnI4%PnH!lOSr}OySsK|ovdhTZVv=w< zay4=oxgNP4xf^*Lc^Y{h`FY${<5rDZ7`NlNb>lXV+jZ>3*vYX|V>gW5GMqnt)*M|mHWKx8&5tgRSi!w3n61t|K) zBeccPD?Jj82vkk_5oAGOSfpVXVZvHG!s`eI%O6&;5dzkc5z+{Ggk^;D2p{-+kAoQp zKaMbtdK}|8(Q#tq)Q=O4lNqNpPI=V*sAc)PcBA&APNT*fm+{q)MvMkVqetUM3#0X; zI~L`}!RYkp@V`sx7~YRQk3oz9#*m8x8AWL$QIFA&=|5wlV`|65$MiBLHKs78IHo+N z%b4zChA~fL_G7+``E8s9HlK0U<7~#+j&mF_gmq=(^*-LK@lMBkH{P$~M?Dcbk&me+ zQ%$G3#Z(F=OQxooXgyInQ9jX^iGEBEWNNFaMK`pW*yF^+#MH#}#O%a;A&49%t|xw) zxS2TKg2q*z_%iXgX{)AfnmRkZxaqi`ghF*`5^fR^+l$UAlr}YIR zmeYk!mu|ZB(?v~}FkRAgt)^=|UH8+COt)&fZKhj0-MT`!Z}|4jbhFdVP4{m4?KGjf zZuP^1e%Na!3aenCnMX@lbI@FC?$9RG9F-%YMXd$ZVxvW?#Sz8LLO}$en235GN^dBT zq2Pt0l@?ds*Sgmz$DlHzWv%5#%NErQEnl=0TFSy*ij;s~ClY?7?#R-umLBOea%SYi zTH*s2EiYOTjd?CbwQ7rnUKr#5W_`$h5F8;j(#UX-*dWfur%tEFaPF~Y)un-YIyjXMoD67C0m0&V`I z4b_Gh(bOny@D{C&(Z*{NwMp7!ZDwsQ+FVP*$hO+@BCn#JVL@B1t<~0R8?;T@&f5LE zgk&+T<}i+gNgNEVv?U{eF0tEc_lO>Xb}vPpMcoS(5u|zu1F?-@wQyRySM5&PdF_IB zNxQ5aKIfv{I|gq{BGNY{Zh(d}if3LHnurk6Pud&pt@cj)pncRnX+LYfYJby#=uqp> z=sQ@tC^c#wt&U#Dq+{0c zrV}Z_hlK98(5cr+>I7xqB(2j)C!>?q$?4>E3OYrdl1^EtS*Np37oCa5^j4-ix0s&L znd`jOxkJ$!6~UqsAuh%(n6=JEXQ#8*IqIBr&N}16uX+&(ob{shndAC_imBCnkzy#ng$xiFwRhoVY%5bK?HQ!-?a6^NF8N+vRjz zimWBnNsK5rV`%!+hf^O<(w`KZ6t2MrGb1PHPM`|#2Xg{X2BR zk~^hvO8J!LQ;w&6IpJBJI~03?^@gcJUl{&Z8)gi%hB?E$VZpG7Q5C~h z!_I~i!zqR~3en-l@MQR6_!&b9W~Abb!To8zX@}*=9bNE zG55;cJM&SSj~9!xA2qeL#UwE%dNGM>8;Yq=OlsQA#y%*^D$6_uvx+UoC5Dg+5$A*D zqvca+EZkb|Eyp`xnrFqZj^)2?iQp*A)7WjW``SJp&`3rz*a~XJrbPTOUxsNT(OV&{ z7_1megA%V+oXXE7oE5=}XhpIjTXDAHQbsg-YI|vWRWyKJ+uqpT+TPnfpf6(k)kmDF3&q)=n(EWDs# zR6IcFEyyBX7KLT7FqK9MuNF>aWr4NeEO-k63A_b-T4cg2@nYvnOQ@v8J(x;>NJXTNA9g<1bVKN9f+86=@Z|WNG8p zTbrz%t-VY#b6+}>0mKdkW|rK64J-9V2TuMnr&Kb z);4>aFLpNNJ zu5MkOF?8;lKaLVd8%HVTi5=}6y<=<_v#n)jg6)ep%X&;$I;I>O92*@om_&3eI+igz z=s0)0M+c_JLVR%CIBp$xj%UXg$5+SCj=y1U%x$IH#xe%9`*4R3_jqs}aW7*5L?v^u zbH}|q9^CPd`+=iE=<>-zkBae(hA}$90nJ(`vJ(rskFH0Lhd4={Y>RI!`yxjbU&^5O z<79L)IhmcDoxGqa;#BQa;}mtOMJEHz38%JBbxyq$&sp_O$)aWz{oSBw?o@CpIhCDS zox*3hmeC~~FTg}O&=RUGLM`g8UGb|y77e~Ah6w141Lwe_{Di^~iZ~7y2djg#gZF~< z27{d64G}528;Kh~xv_R*<3{SnjT>7e*vOobAtMcT0u{$sHySru zH##>4H%2!mH)c2D6JFhTcjE^VA!IUcx;QPJR!$FPMQi8uFT`XBr<`7#esiw~I2-~3 zcUp>iSNaFm@e5WB+=tH5;=q^BgO9|MFFpe*e10e>6+3{(+k*4a`Q&_des+F!{_FyC zLAU@eOfGmAq6^7|*+o~w+Oc=)Hn-5 zUtZl}-QwM{xK+CgbrnZn}4Th3E^O#}v9Ex;Q!lRfI#SAD0Ju%aH_FI8DGYpGhLc;g8?;GE5eBXME zm-fOJOCE^=Vq0v{c!z*qI2zu*&%R%M|L*($diftOTQ9d>3N(_vgu*KRy0fLF7Y`MU z(&XjrCE7NPSDjY^?XJQ+RPt&@(HZsPvLcEGivKX61)Q=lKwx}!lk^6D$N99NGe+3tmQBWK~S;UXQ{}n+{-S86> zgR79Gg^ZygPa)iZxy83l<2h0;6|R;cf0z&=WS9zk3WfjCT>&J+4t) zQr@lJz4@|$?%w^^yASV)_tayq-*fMkN9eYp5=^|3A^GLib&mIQj_C4n0|A76Yt`uGoqZi=0bULwl*aV$hL zo(k5(#)t(V1|Or3$;a&D*~g2I_?&m2h)>if<`c(!Tyf)*@(DcZqo|!ARZZTf;8XG` z`!xHs_}u!;d=|yD%utlkjH(z4ExLe8?7&!Q@FV8nbMiU+eDm|a{aj;ezND(r=bXoa zJ+T_i!Ozjp$&`G>|rsk5JQ4w}Dce$qAcHnIkN-4Lyz}1g6R_P!jnW z^XP?ta}#(B{2aP%_<L227%uGex?(1kFlZLaXA{6jcJ3PY6a7-v%{KF) z`YJ077X<#U_#>?)pA}>X3STvZsfZ21lr_fRh$84|5-89cB~e80Hk_9G0iBJO{*jiw~;^s}5@n7aA^YxUg_} zEt}>NaU?Wc>u}wLTNQ4baQhK%0duRrl>6n=ub6*jlu`t`TPUdfntdc~BrlPC#EQh4 z#=4F5ORSHvR8yj&xjgm<3I6xKKDz;5*r`X!qrpOLBFoW|jIPQYOEs?ph zSs6}-{E7_!igO)Hr0sf* z*(?lEmDpX$6=75el_U)AVEt&LVkL{GBnC2yeOKZRCMp}1E7e7%sP1L#8z*avqmP4n z6bHX>dZ|pk6nh(^wdgLRi;VU#db(%;qFaJ8IqI({R=pNNSu9M18(6Dwef>iJFG4~W z4NbBL3%XnpZV~WRKH@;)z|kv;gF+i74lxcX4ok5U$03dp<@Jctc~O>8#zJ8flVzxE zVr~M3NVI5BPei%UM(s*PEIJzA4YjHz>Pysb@wAC27EioH4*#k@sPDv+jwcg~Qj_9o ziRK|1T}r7*(OjZs(Q@Q$MRLR9YE!gpbTm3%5{m`hBDmD0=(-d=jlL~OH_R@1jB=o5 zgl+OvD78nPfsF)P0&Xv?&UojH)iC-6iyBs$;*N%?RPGStFT4jWSx5|qlwaLhK1C#gt>3 zW5VaT#&nD6J*JPCNz8T3P0TdrHf9zxk9iw&SMr#-k6Fg7igTN%qB~|2vyD06#wzbC zro#m1)zZ2a+CeZV=}To76s**r7yO%V?Y`{vn%+YRgWAbTU`ka+xT@UlOOqGR}Y{wkA#z=Oz7$dC4+8g=rvk z!iQoy@u?`jD9<2l|2wdhcuG9uxKZNxz;oii)3!=mk+yva5N(IFozm8%txemIwh0Gy z(r%yjB<*S1@7a9La>O1mVC zxArpikoqC@29ux|*-Ua%M&e555_6Mi*H1;6E_p#)pa-r>nJ{%%GJPcthM6r4TBU^f zB=~nZk_1kKmyi%GQ<5crgGn09$2^w^e@UWXd<6Y}418d)0|jpssF1HCWx?)*>m3sS z=+mR)elG!m!4!-$9k3wwoCyQB^m?Esw5On zLy_c>OP%m;F`ZI6<#d|UX-TIwo!*n#q7Yd$`=Z>Tg0M%ms3c^I1cRyvw%n9lom`ik zK&F@6lKdw5HhETt(h9FYo`A?6p>x5(1=AHQh^-WH526`_8m7>=f(at_S8R>gfv{&_ zQ7(t;NOek^l-e@0Se6tnlzmFalCw@d{$ThEm3T$@g79OT^!E)F%!tjuoN`KYN=r)D zlx`{gw;cZiC%H2%6OcGCmp`ZcqeQkbyoMPK^h?o~LpuUB#cT_?MC^(637;mXbiof%rE8O}EM0f$x=+_bx<01s zQ@T~@wn;ahZZe?*b2I5?%g4RtbX(KyPrBFX-lca)?>YT;>AyqzsME(w`uM;D++^~R ztM^>fT(`M?!Q&m|`kott2MEBi|J*dWq2)Vk{$xrrtut+Kwmj31ydinB!LjY!Ho4vB z_Ge~wW`|s6dNKCiml!NlCEJ3LgfcWc6-$S`7LAtK!qE}VBNoHzUPe-LW=m#kW|z#a znUj*5=Y0v%Vl)O54SXufF1Ll*BYZ0pk2&)>^Cj~&^K<5Jng7n)DsT6BtMYct+o{+` zC+bFG#-ZSUNZbB0|X`g zhLJUl2w~6z9e#AiQ0K;M7HS(vj}Y79v*Dt~c+iYNpA0JobTWKkFr_f3A?Cl4kvtj< z7UXd*N5Prua%_W%=IJ3%Z5aqIKK(XN$1nH{=1+m zUEP2oBP~a=kCsb&PqJ*@qErYE^w!la=hD=Z0h%%NKSQ5 zG^ZB(B6hf(wmEe7SD9PO8MRO3B7TYzwPM88>!LSKN@e19K*2-~$8T<>$fA zk8ciN9x=-$=Z`W7g28YkB8XqG>dd*!gEL zMKvCjB422}Z1SbWN$!jT!Iy2u!Lo}i>97m>9;j&{%Ryv>#cau!kNk$lX_c?LeBI~k zAzz>J^`37e-(s`lJ8Z%^L+2}{bzoc`90;|E`QwSf0Mb!iFzEf*E64I zexA3s#7xRK5Xxq;e5QUg_k8Zv+`rDf`CB+~L;+?w%~H?uR6ewvXT>opJ*#O}dImB> zJp-L#Gee8H)frw&h#2rs=-VKO!_tfCw|R#14A&Vx<`V51=CPhfHjjKBr+LJ}j8Ov& z4PYz|oqM#;V=2`-&w80nS4M3xl3e_@(`*bnL$jr`WwYJRwx2D`Ru^#{1wZRite@>X z+hzVMbC($%*Q1&|J5>UAMZKM7r)PJXotd30Vgq8#zcS_Q-e#X?KbPZ6h0Pq=GGrfk zi9%yiFHA_A=MYNkC`5Fb!#aoSjK`aaqKpL;mZFPK6@%4>?$1>dlas+`<#By>0{1h&UDV3 z8IJ>z8P?W0AF;0C$jh7+){!|6xXieW@n++~riHoE1KF~$6-VofV#H0X(`Eglyl;u(xN`f5xk%-M`r=LKwA!7P@>P< z1^&U9FXn5Dvt2^5w&=AG3JJir4A*5a%MeO`9{EzDT4ovTGO1<4a0$*}VQfW}5T!On z<<%%1A$v$=gX(2@MR!w_V}@C}*mkjev2wAn*lDr0=)ou+*k6lHi(QxETlmHIi`R=k zE#53aEXYWZjwZS!xuk$Qe#slGTm>EEdCBLcyo_JgxZJO6P1pKmZRpDOEBmoBu`*e* zoJ_CmwTM_O;DH`imRB~fY+ZS^a=CJ~a=mhg#~N69TzOh~Uiq?eyu*3rZ!3<dcAoK;xW4Ud6@N$!#u1-+tuTB5YeI`VZC>v&x!u}-oi zNhiIQMAQXi{;M{qh!;5x6%+(JSj_a>YUpYnR;yP>R@b0Qw7MVYk*vsHAZMUwkY`Y5SW2#B z;^*ml*7B_FSvyRzoOM21gOc~z&*vaYHa2*ql4UF}VGkzfT%R*NXNHjFoc}4w*&NO} zo^!&vy>mI;&X?wV`+mOtINyfzEuHWDeDBVG?1j(^X)pgjb9WgP_22D%9Kr7HM3f%D zZlyy?(qRS$0~Hku8?mvwySux)ySux)+k5Z7@B8Ul>pZyEy3gXeUe{;uZ~cBV11d1b zwyx1O-DvM(w6ANlm%pLf8XfH99h!^|jz&j=(aFi^Lj(KANh49_dV=oPKs9`_E@-!JqD)L${wpE8%f76;0Y*%<@E zjPk9IAo*s$uTj3`AL45a2{DFx8udGHzQ)inV_2v$EZV65rs-o0_tl?q3lB7ghyC}L zX1d2}F-98nmz?AWiX){SW{eEiFJe)?@+S{tRG=|B(kQ?97!zhR z%G*4I80G)se2wY$#`LHF1IAabaO``nP#`zdSFKowxp0id~?|F34op*kl)CvJ2IJ?UO&7 z%a>3)i^<;GWbb3L4>Z|Fn(Sju4t6F7Uz4kc$=x9D&S3JWZSsgWRf#uMjW<<`H`T9i zY7}bnly^o6HhG1aygg0cAtvuI`E^W_PoT*s!sHuc3h*=q_?qNfMuB0b5KsAzqbbbG zr2jM@Z3_1^h0DL2_?jZUP4W$1{hLXwDbi?)3N%FrnqoXnF=3|IKvUBYQ+&KBp^hm* z-j~qPZ0l^cburueo9(>Jb|GfFXtTY%Ta&zbp}pD3V0Q90JEfbQL-fte^o>pe%*=pMVH6dq8`k-byXfLEgH_9OP2WFN0@5#<M@$vBq4u*vP-UTe7PJDt_ zbb>iD!K@F9#n#zk=U}l5w%CPQ?4m99E*1xq#nIN{WVSea$Q$KY44xK)m&M?1G5A;v zz7~U@#o%u-1Xv7#7DKSb5MnWeS`1+pL%78dVKGEn3{e(Cw8ao(@wCX>cUioHE#6@k zZ;Sjgn8i25;u~Y}_q7Db_nzg$VhIbkgoj$f!z|$umWXIeWPl|yQvPsfiSo2Wg;|<5 zwZt1N@g_@py1tWTsJHw`eqyNncxgytXlP<+xcr?`{ur1T8l4y#lNf4BjIv9N@=26G z=_V$o*`}r0d8gU=rrG(W*@dRrg{Rp?q}j!!*;&%;z0(|A(;N(G4&iC;?rH9I(yIBS zc}J%CdZ+m|P4o9n3kgXJ2}_F!lXuNbOLytx=h-LJG2QmRcObKONq3Zw_;i;>=`OM9 zb%WErJ=4wZ>1O#3s(pI8OL}^GUk~@bRU^k)|9czQg@XJ#ZFFid-aS?4R5|pWj9KK7;(Ik|Cw#|MEfB;TNl&{qHUY zKmIp4J8S4$7XRP>=u=kzx4w0;s&8woW|9ABFB@6sYCQ+$#9Wvg^I%@ghxxGp7Q{kW z7>i(0EGFtXN{~xpDJ+d;uq>9t@>l_Fu_D@GC9I70=zxysgwE)Ku4q6vbVm=Yf>p5^ zR>vAx6Ki2@tb=v29@fVO*bp0`Cwieb`k;O)(Z|;h{V@OoF$f!DFos|#hG951!3d1R zDAae**8O8J7Mr3G7DU?Mid=GX%Db*1|zVJmEnZ7>Zu^0BnH0*=v*cba@e;j}VaS#s13><<(aTpHA5jYY@;bUuCPRAKI6KCOUoP%?59?r)FxDXfNVqAhtaTzYh6}S>t;c8riYjGW} z#|^j-fSoDz@4}YcjF%1i~Ddt9>9Zm2oK{CJc`HgIG(_hcnVMB89a;U z@H}3?i+Bky;}yJ$*YG;tz?*mrZ{r=ji}&z8J`nYOJ|aKHC-@Yf;d6X}FYy(=#y9vD z-{E`wfFJP_e#S4Np6eU=JO03*_zQpIAN-5@$xA-0GNCovU}nsMSuq=C#~hdwb75}G zgLyF@=Enk95DQ^pEP_R`7#7D8SQ1NNX)J?fu^g7i3TTTJ(GDwNWwb{JbVMg~Mi+EN z1GtJ21hxM@mHpE8giC*Z9KIn^n=#K#yh(XvGgE0g{ zF$}}82}WQfMqxC@U@SI8BgUZ#&7$7l1hR$PjNBYsP){Pa!q(UZld&zf!}geh9k3&I z!p_(QQ?V;{!|vDvdtxu_jcM2i)3Go1!~Qq`2jU6G62FKz! z9FG%lB2L1|I0dKTG@Onza3;>e**FL1;yj#>3veMW!o|1*m*O&9jw^5_uEN#02G`;` zT#p-YBW}XYxCOW3Hr$Roa3}7<-M9z$;y&Du2k;;s!ozq3kK!>rjwkRWp2E|32G8O- zJdYRfB3{DFcm=QGHN1{D@Fw2E+js}>;yt{N5AY#A!pHaopW-uojxX>fz7qBG%p3As ze24Gx1AY{B{AcnP{EFY`{~-S)|0e&zztl6yV)8$&tkDKDi}GQWm7EQ;V-8V1ta6ca zlk<}EVSX%t1+fqo#v)i0i(zrmM)oO1E{$cdtSBE=<;fM$7AvBiC?8gp(Sf=nI-xVV zpeq{C4c*a0ln<+_Se<$etckU-HrBzqSP$!C18j(m&=bAT8-36h{m>r+Fc5>VF$QA@ zhGH0oV-t+PNQ}a0jKNrJibjk>6Phs|6VQT**bJLv3v7u=*a}-?8%)Nw*bduciYOme z9m$=rGj_pL?26s6JNCey*b94O8ur0-?2G-dKMufwI0y%01`ffYI1Gp52pox{a5Rp= zu{aLL;{=?DlW?*qA68Sz({MV@z?nD;XX6~4i}P?kF2IGj2p8iLT#CzZIj+E!qJBPE zLtabXK;DR(aI+{MR$Iy2a69h6owy5k;~w0L`$YM$IzT>%hwv~S!J~Lgln<*D&*KHWD9VS`W%3ogir4Tu-oTr9OOy|*J9v-!eSClq=|3hv!Ke5PpW_Qr zKCE8h8|rWI9lodkk^Bii;}`sj-|##Bz@PXFf8!tgi~3~IuaB9~8f`E$X2GnO4YOko z%!#=$H|D{-m=E(~0W64xurLzL)i%rppacDv_#$y6nFcF(!b8LYvF$r5?Yixtb*cRJi zdrZL&qCTHGkvn4-OvSF)4ZC9x?1{awH>P19Ovk?15BuW)9EgK(FlOKo9E!tmIF7)P zI0{GO7#xe^a6C@Hi8u)-;}o2V({MV@z?nD;XX6~4i}P?kF2IGj2p8iLT#CzZIj+E! zxC&R}8eEI(a6N9ojkpOn;}+bC+i*MXz@4}YcjF%1i~Ddt9>9Zm2oK{CJc`HgIG(_h zcnVMB89a;U@H}3?i+Bky;}yJ$*YG;tz?*mrZ{r=ji}&z8KEQ|g2p{7Ue2UNTIljP` z_zGX+8+?oJ@I8LOkN62c;}`sj-|##Bz@PXFe~bG0<}X>l@%-P{d9+3w%#2wuD`vy& zqOO;doC|YP&r8mS`KcGg!qkh9i(v^YMZYw;ES5)G`W4X*D`91{M+Z^Q>x3@UUD1GU z=q~E`D&(r<>R6L{Em3Z%Rb6sD`VFuVbx*Q4`l9~-IM&A@fE+|_jKLU!p%{kYqMkDX zqo_xdW6_8v`euyB1hj~{UNdrYY=JE?30sLez708<+zwNycfgL=2|J5AKNY)C?~XmN zC-%bLm?rA{bnHjHKMtTi2s1=|yoS*qjw5iSsOya;kHN8`&YM7g67|VAh59t|beutb z7I`*#F3uNq-9_{lQ(ub9sjncf5_SAq>g%X)z)jRQ;}+`MM4h*jyc_q5`uy96`|$w% zL!!<*O8pr5B>5Dc#xrYvD8$Y1dre#am96Mx}v{DXf{e-P-u&&z0yHkcW+U{=hA z*)a#^#9Wvg^I%@ghxxI9sMlSHTo{XBQ7neVu>_XHQdnBl^~#dVVR@{8wpbDEu#%|r z?a2=4h)(D%>Nr=j0o~9YJ+KN^74>;ugIp79VQs8~b+I1S7j@r;=toWrwch1yJ9!&jyBdrtEl^JC-1zpQ^A)h0k#|zXikuT#FQJ>G($u~q@?-t&{d-y=quL}>!kI7H)DL$kB zg8UL+;cI+@Z}AC$pGiJf8m<_XI z4$O(UFgNDGyqFL3V*xCPg|ILd!J=3Ui(?5aDax00tFod#uH~s$KwGScc3253qdhvH zBRZiox}Yl>&<)+u1FK+FtcKOG2G+z{SR3nLU95-oMZMmJiBOh;gEx(@c)X1hilxHpAxF0$XAdw!+rf29vQZ zw!`+Af*r6UcEZls1yivrcEj%21AAgG?2T#I2h*`H_QU=-00-hA9E=$_1c!=xe}|Jt z;7A;Wqj3z5#c?iEB8{Y8`i{+@}}XoHzC3ueV^ zm>qLqPRxb5F%Ra&e3%~#U_mT|g|P@0#bQ_-OJGSXg{83!mKF8-%abdhEmlN3tb~=( z9v#pTozNLw&=n2nhVJNrRj?{n!|GTAYho>|jdidt*2DVP02^W>^h7W8Mj!M=KlH}{ z48$O8Eb9FYA%|iZhGP?qz(|b3XpF&FY>GyVLlc@Y9uv@liK3pbIku#pgsreOw!vg< zi|w#IreFu`h@G%AcEMEairug~_Q0Ol3wvW4_Q7=Qi~X=a4#0sp2nS;Z4#A-~Ow{`| zf;bP;_@i+k|;v}3b>iDTRo%#%%iL-Dv&cV5&&Yw?SfD3UEF2*IIj$cMz zjw^5_uEN#02G`;`T#p-YBW}XYxCOV0y8m|a4%~^ma5wJ3y|_=*`3J}c$%n~D@F*U` z<9Gs3;we0hXYeeZ!}E9nFXAP8n18?Fjyp4D8F5biY_y8Z`BYccc@F_mS z=lDX@`}d0c8sFese24Gx1AfF$_!+<8SNw+GMcwZw{-*v1|DsiPzW$;$+F)kPf>|*e zX2%?uQ`CKPlk;F+%!m2002ahTSQv|7Q7neVu>_XHQdk~}~ z(E%ON37ydeUD1GU=q~ENyHpkR&*?R(*P>pRTo3DG15xj9BT?sjlYP;jdXT7pu4;_I z7$WNYFmkx4>qL^HFdAbpR@8Y$G*LHWJar2>k=z_xVk>MT>iLqfEw-bdLhgVau@n6+ zUuCPRAKIQ`G%uljq=EoQLyq0WK7E-eO!zeHktn^?t0z_0%`uM%;v(af_(y zZWHxB?8H6v_u@WL#~mOa#6x%(kKj=}hR5*)p2Sn4u6st*{m+vx(!WH$g4gf{{hN3T zZ_~d^zDIt5k3_vs&*(p={t{nPe?xvpeoy|0pQ(Qlb-f?tpZE)Z;~!D4Q-2}TR$swx^$h9k3&I5_P{+a#!po>N$Iex_=ru zoqk{Jhy8H?4it6%U~&cy!J#+|hvNtwiKB2dj=`}w4#(pJoQRWfGETv%qMmO$c?QnJ zSvVW#;9Q)C^Kk(##6_a6zl6LLm*H|;fh%zpt`>FvT3nAC>2Jc#)VGqik#~stxbCLD z2lvw7Pd zGh-G}_s@>GsOQE!qOO+@3t%Dog|P@0#bQ_-OJGS+*DH->sh7j@)NRp@dL^uk_VgXe zPUws-=ql=dZs>tk=~u(*SOaTfEv$`ourAia`q%&)Vk7iKFZ4zq^hG~W&l^Av#2{>p z!5D&}7>4241S2pKqc9p{FczDlQPlI8M17tlkQ1>v^(0ZBSFNbGAtz&7Y=`YJMbz~> zk~?8%?1HJ-Rn&9zAos*x*c;QZ52j;Z>?i8J18@-a!I(jPD0vtT#}V{Lkw@bgQD5H^ z=ue_PS=4h+BTvT}I1^{#Y@8$NIp^U5>I+3(Zwd8f!K3t#lTYADJVpNu`7EBp^Yky0FOjd1ui`bljyLe8 zsOP&)zJqr~y}k$JhoX*qO#K=4=lFv9YkY?v>3_n{qOS9m{EhrW)ct;o`aH>$>)-3f zTGV&yr(OeVVlAvK>N<6?KJ^CJ5F4SVsQ1xV)Or5Y1IR(-#^exkC^?+m z1S2pKqeNXd2Ahg{JtlHIT135HiR9+w7T6M#uobq(HkgcUMcubOIR!glN9=^1MIE0? z?uy;8JNCey*b94O8ur0-?2G-dKMufwI0y%01`ffYI1Gp52pox{a5Rp=u{aLL;{=?D zlW;Ol!KpY6r{fHqDe8TkO`d~uaUT5zAC{1p;xb&0D{v*Q!qvD2*Wx-{j~j5K zsOQ^E-XiM$+sQj{C+@=CxCi&*KHQH7@Sv#s93~$jA0rcfGt|#gKaUrwU&70H zh5j}2b-aN$@s_CT-zDF}`}hDK;v;;FPw*)|6Lr0pqF&!?e2eczeI0+mkN62c;}`sj z-|##B5Ow`u_y?_W|64y3TB8kS7Ij`$%uYRrsGsNZkn@Uq9RM5 zMct<~^>S!S-A>f|P>F0$c0fmTLT7YAS2T#ak2~1|t5C0oHK^CbT3B1ubJr7fod(n! zl0E7BQ1_+oPdx}jsE3JqUE$aSBShUNnjC|%qV8)X$C1tCc(R3@h|RD$wh(olBy3H+ z4JK1>M{bWP*nxg0a%WM`+m+l6yJHXfy~$~!?w^kRsQ1SKI1mTnV9dZFI24EBa2$an zaTJcmF*p{-;dq=N>NzKoC*u^HiqmkqsN-jnXW?v|BkFycFY363xEPm;`g~Z1%c-x# z)zsJET3m_lSD_edPUk01x6JJd8*1C>|4aofG7f zcnVMB89a;U@H}3?i+Bky;}yJ$*YG;tz?*mrZ{rXoHzCi>ULmk+YL? zVs7erFfaA|6b_V>~9HMbztQMs63J?Zx*r(qvV$G)QO+n+oD2jU=6&pAZYal^v2k;;s!ozq3kBYkgaq{x}pKyL|xYdt73Ig_pc@D>$Eo35%ru6$PKZPsOxy4 z5BgyM28p^}V+_U+48<@E$0itok)ob2292WbZz3m<6Ui+^-M1wsVJrH{qFz^usOxm3 z-bK`Tsn`{}VR!5y>bzd$-k64cFkRGf{X{+gK=NSv8Ptc7hvNw9qse1%tf=da$BCk@ zJB2(AXNY7Sr~n)+Gl=g1fE5?-Ny6|YghLB5H%sNW&qCEv$~_!yt!b5XD3 z1-`^rqF%>a{6PI9e!|cA1;2`VzrW*8QSZZFw8{6cpGDMtvtl;tImkIN7v`p)mz)pt zi+avN^ovk0ip8jxAeSVU#Y*5h;n)NtM4cBU>ius@jzcphh`PUp+>G2DTVP8}!dBQC+labf zTXH*Wk15yzJ7Op7j9oBQ)b+Yy59~$1H>Qbtef{VUpgs@>;b6?bAvhF=;cy&*BXJat z#xXb+$KiOKAnN%iktgF6oQl(Mx~Su4l4s#;oP%?59?r)FxDXfNVqAhtaTzYh6}S>t z;c8riYjGW}#|^jEz*0!vaajb*Vs+KRePWl`^gJvyMHsOvkEUC z*TK42PtoJn! z$YydpCZGiqv6-mzTaa5~61KwD*anlaEw;nb&i^i~1h&emsOnMP2V0 z9>)`S5>Mf2JcDQP9G=Guco8q*WxOKlIj@s%;7z_oA-*k^D*2d0)xj@H_s%pZE)Z;~)Gh>N?g1{@rIAQTNG$*{Em79GH`S zZgL)SK5~96K)n#TFc!h0SPY9}2`nk<`O1*Xih92Ceu}N>CYt3!r9d4lIP)kT!0Hjy`H6_?z3Ff>sdvAHLk(6xDMCj2Hc37L|tzSd8?@F z?!evj_u_u)heUn+4^ux%K8DBf1fIlGcv{qb&yvsKdAxuZMICpUd_~mrU8jDN`YrMu z@?E@#_wfNf#7Cm8_f*tPB;FYy(=#y9vD-{E`wfFJP_e#S5O6~Ezk{DD957yiaS z_!q4T{(C$!p*7lIX3TgBNl z+G0gf=T{j`ua9fH&HiZJSLz86GdI8Ik^S4#3WJgPaATwsN>sVim3Z` zrr!lqMV;53+yi@JFHzS?Bli(?d_Qu3QP&+z&JcC{Q1UPwjw3`JKZZP3)bZoV6UdWr z3iYWt4X4weNuDL@y7NRm-$MF}ajB@E$Ci;-;412?aSg7;b+{fk;6~ge>V8{A-G3+b zU7}vs9_k0EAEbVmd<2i;F+7eZ@FbqX)1t0_mVAzUfqW4!iF&@P%z-&Yy`H?H z?w=nE(l10VLN1EMusD{$l2{5$V;ND`FGnsuQs_3xxT3TG^E~$>_zrQAL@Q&e+7#to})Fn4Y@739k$05?0_9bo!?p1eY;^VQLm?usMnEB z?oS?o14W%bn4BT%I>X5$L|tbzjuUnK1o{(k68)+4r&FIno`rL$&&7Gv7vLi5i*X4q z#bvl0SKvxqg{wt9_d4==@+R_T+=5$i8*Uf%I(L$H;cnc6dvPD`#{+l}58+`vf=BTf z9>)`S5>Mf2JcDONJ?DAy1-yut@Up1mu9C0eb-aN$MICpWdZ^_rEet1p$W|xj|phOL~Mr5u?4ooBy5GPu?;3;TWlxlb){fO z>Yd14uq$@Qo}%8rG*Q2P^ucuOE9$!a$pdg84#L5hA?kX=M4dN+`bZpwqj3z5#c?=Z z)cF(1lgLxZQ*j#g88}PS{pXVBi+WuPa3S@@xD=P;N>RtJ!qvD2*Wx-+&$j_LiMsDr z`rD}QpuStwuebZjhv*-{W1{YR98cg$`lrcf@GPFg^LPO-;w8K+>Upn{uZeozn|O!* zJyFm3NYwK@#wYZjk)Mk?|COlY-%)>0{S)l_Fu_D@GC9Ev! zK91-j>beGW7xlh)U=^&2)kGa%18a%8UR`p1awAdK@kB55Mjuhv@gw_V00v?ZHpXBK z!B7mtaBL##`jO-)jHVt-Zi+_gCbAjhF##=@h|NUZrvp<=# z>iz1BU8r{@cO&<}UZT$LL+*?HMO|kAc@SpcQ2N7gIF7)PqMma!c?@|Rc|1ylOMYtH3;8I+M%W(y+#8tQ&*Wg-QhwE{JsP}m@ zc?)jEZK9rk2YDy%!riz>)N%XB`|$uC#6zNvJ3>B+$M86w5Ov%s@@eu}@;N+@7wBIi zU&bqV6|doSyn#1G-S0N}4&J4HU)1~bi27sdPw_eZSM*;~e@lLc@2P(ze-d@wujFs^ ze~^EYf0O@^t&09TueGSJ2OG?cSuiVR!|a#?b7C&cjd?IH=EMA=p0^OWFc!h0SPY9} z2~qEFDROCYS#minj}_1sE25pK>r^J&qXRmk6FQ>{x{5mA4LwBtx>}un4Xi2Zb=DDe zd_8hQvZtu`-3z_ZhrS=#9|JHDgRrrv`-GCiFr0cMISQjiJx?tCIO--eV>~8^IzExy z44Y#MY>7$O3R{bMzP99cqOO-h?m+H@U8tvGSL{Z=2e~Kq67~M4)9)whegnyaMZM1% zT8uHv?x=pCjt^&m+&r1=JUj7n7HgmyuVH zSK=yMO@A$U9j?a>xDhwuX54~XMLpkk@(%JY@^0LNdvTwr^A6x4>W9fk$;a?Gp1_lM z3Qyx1Jd5Y>JYK+ycnL4#6}*bq@H*bWn|KRv;~l(<_wYVGz=!w3CORn&Fd&_mSytI@BHHL#|r<7<=ah&sMLxdArBM(8Q(Ja4iO`ieR~fEe z_MqNV)Ol&5e%|j#9!P(XsOx0lQ0l`(oi~y^iaZu4P@jmCa57H8sW=U%;|x*vorQC7 z9xf2|>(D}6go|;BsPmVRmy3GdRpiyU2G`;`T#p+>owu31Mbve-k+U|CVuD^IR~wpdZrd6mib=zxys zBi37S_f(SXb0}4ag0#k*JTCkEr|lQTN9H`oZ)=sfS@W z^$3g-b)Q(W5ly0=(@ahvTQCuuVRKQ>(~_KotwdcvncNoJVS7x$4x+Bp3A<2F#je!5 zV^8Y6us8KSpW08pqHdM;?z8a3W5^$v6e4 z;xwF&Geq5Y7I`+#!MQk3)Nu>Q3vm%H#wDUYPRq$FM4h*ayc*ZwTKelnowtelX52!5 z8+kkK5Ow@+@*doa`$XOM0Qn#u!ozq3kBU0}IQfLA>z~GR)X(DuyeR6t%j7F~Rn+-6 z$T#s8-o`tk&cBBbs6P~S{uA<3e1^|Oo%fRbiu{KB7T@7}{D2?v6Mn`oqOSW5e^CF4 zzeN4KVO8Sa>pBx!qYY*jb)Br_Y?vK$U{1`1xiJss#eA3_3t&MkBb1#r={KO> z5F4QO!5631Lfsq&`>bYadP01#*8RJD=-$G8rX4G3? zlBnyop`T2>9l1TGh&rwlxwEM2r&8~Zz3BJGG*QQ;llx*n>H|bwcQEw~>O;xHM14Js z5_Q~I`s3+Oz==2sC*u^Hiqmj9&cK;C3ulXZ?z!Z7I3E{?dY;APCAd`7dCSQwa3%HC zxR&}l@&@uo+(dl~Zlk^(cZjNm)@$#=;2MP2V9`H85H^9xbedrAK_`3=6sclaJZ;79y~pYe;R z=lV|mfj{vV{lB7~D^tmT=dc!aUKUa7*{Em79Mp4>b7LOr`LF=>g5<(jlzK682`q(W z=$FNESf0Kuxgy$OC9Ev!`5nnlqF#p!bvLpHxf;0!xwfc}M;)vy>f_W9y{Y@4FZ!Xs zsQU+z8)GnrU?_%(x_+dn^J1vSih6D%IgWljIRP!0h|RD$w!oH{gsreOw!vgtrL_xV%Qb;jU0 zQ6JawH~}Z(B%Cbjys4t@H-q|2oJD=EsN?2SUw{j75iZ6hxD=P+a$JEcaTTt{HKOjf zPSkU4ByXm_1-DY)PTnEv{n$f&ANBos01whXOg@4~@fiIRb&;6wV4@hLvXm-t%L`ENwM{twhYQU6T+JNXCx#9yM`??2?f zXjST8-CET3ZOB>3Sw-D1r>NJHhg^VuK`exYu?Q9wb>HIT5?B&TVQEpvl_i%WSHOzY z?XVJcd$I#MQg@~}p1&EnIkv!-n1rpcHMYTIQLn2V zrcm#I9kG+B`=w%c>OHV0_QKwnhJ7#{`(i)rj{|TZ4#L5hfkSX84#VL%0!QK~9F1de zERGZP`X-8cKPKZ;oG$9?ZU%XlsN?67=i@?A$1TFexCEDqy8d$V3S5b+=&vEK#dWxz z{zmd9+>BdrtEl^I$DP!7;cnc6dvPD`#{+l}4~cr+M@3!#IQ0|MPm|BkKS%u{UZH=L zd;@ReJyF+vAnJX5NPdh@@j3k$_>%f-Q9lp9r~ZNZC-P_ff?x3)e#am9Q`GbPCjTK@ zmHv0WOlXZZm|4_$S;^TjJLbTgm`l|0c`%=-_qibbLez_3F)ShKxYFdZV2$) zmC;_*{T$I5UFjP{UDpGv(XS!u{jDSFx^=17$A;7!p(lEwH~OHjsORt}2atovjWHNQ zMBTp$IYQL=QRHZh!B}i6>h+jJ9UqSt>dnb5u@&`XQLnQt_4d>|k~@>TlDlJ1>S?0R z?}O>s7yF5No&n^6I0y&RAA-Yh1pSfZ(d02W7RS+_fRm_C7WIBiBTpyK67@WDsL#cD zI3E{?I&Kjzp}v&7T-5bfk=M{)i|cSbZV+|+X7UzM*WZRasP8227WH|spL|f%`A5jd z@C5bK(Jk;}H0a4Fi5DQ^p zEP_R`7#7D8qV89UT$)@K%Zs{iMRFxk_p6Nd)E&uA=uF*J)cNkzJw&~p>f{<&6Ki2@ zQO{LZ)cFmlH>B=K_9FX`ebEp7F#rQGNYwR%$srgj>V8eg5u%QZq8>{&(vL$En&~Hy zEtrVSusOECmZI*{3foXmCbuKE#}w><9kCO3#x9tOT}9oeJGlq;#9r7N)3A@I^ZJte zVSgMze-L>vX5bJUD(X7J$s=$ij>6G6M%3}+$m4MWPQ*z#8K>Y>oQBhJ2F}D;I2-5S zT%3pVaRDyGMYtH3;8I+M%W(y+#8tQ&*Wg-QhwE_zZWQ(YY{sp)o&FBoiMw#OsPp#X ze(DFvhwupXqvYe{6L=C&(LX~zi|43cAYa5wcp0zYRlJ7R@dn-$_1w3~cknLt`{W1s z5Fg=Ve1cE$89v7sqVDsG{2JfjTYM+#xDVuy_z6GL|4ROb->Ls3|H9w+2mhi~S-wt) zx}Oa>GiITljhr2GU{1`1xiJss6?NVGN#tWYm#e|>tJ21N56rn=kz3d)AvDN^rIhu zK^ROwMAUV{sYj5b$+4n-U2Td+j6)NeF&-1pBI@-uBR9tuqVC&@+#1`6`gOQHIYrd@ z9Yr1Ag?cJ>#ctRgdtgsd=l8}w*q44k>`#3l4#pv(?mJx6bBz}DevHAfqOLz4CsLn; zlW_`8#c4QQ)cG^Xvv4-f!MQjO=i>rgDC#z$*29xvcUQO92q zb=)=T*QwvayVURDeNo3hBtOE(_ynKgGklIO@Fl*&*Z4-%_1}@-;|Kgm|1$j<13uJqkSU9TGT>R1D7VlAwVb+E3e*HNF`K-BYilD*Iy zeb86bdHxtkJqR094^`?a1vh1v_9z?1Y`M3#N*?PB(IQ?14S87xu<9?1Sl|uG5d)9|zz-9E5{0 z1Bc*H9EQVj1dhZ}I9k+w$CAh4c$|O}aS~3(DL56U;dGpVGjSHq#yL0_=iz)@fD3UE zF2*IIo_`sxpuUp48rM=^hwG_t#Lc*s{x;k$>g#70?iF>v{p3TUem*)(K1Mz+>bR45 zn)(?$i|6QHAYa5w)US}Q;x+0w$T#s8-ll(-d=KyA1AHjz`5u#>;8T2t&qW>glKcu^ z;~RX7@9;f-z>oL|KjRntir?@%{=lF33xDGu{EJrQ|2-a=L_N0+X2EQjL)6DDr>Ku_ z9&%oC0a51{A{P~Pd@)h$C9o8h5&!!-AnG_ZMeX+{r;*dieX$?* zr$3N92nS;Z4iWX7!^tB=-DebeGsukj7O z#dr7~KZrX26ZtdwD}JZ`1ApQ#`hUoO(W=6~^Vx`co@}C?Cp+fAoR|x9V;;;a>bde` zK`e|#vACE?#+AU5)Jv1gh?Q_b#e`I zEplzFgLSbU*2f0e5F3fQj~Cfn)a&vi`(pqGVh}dQU{TizC5MrlkR!-Z7(+c4n^KP> zo6s!kc`WpsVGH^#$*n{kmrQO)zrCo>mrmr)*hSRyb|rVi?%0EVFLG~8!#N@>! z01mt;c8riYjK^Z=h{Hth?}TyA#Wvb$DP!7k@t}I;y&sJM7_U< zsUN|kcnpu@2|S6XM4f*YFNk{HOXRC!Cdt?Ex~Tn|dhf{Z@dNcw@<AQ$}9d6X!saL^j)T@g+t`@mAxgNPbHo%712tCnDw3c;z&`;EL14X@$LD-mn2sxA- zju99|KN@2&mc9{9qVAJ`%|zX=IsKO8Bywv^rrs9YVS7x$4%iVpVQ1_jTFZW2$=$F! z^`6+9dYY)8@B5Ma;{efG>Vq%?hl+YV!$iH#k>pW08pq&R9Eam^0#3w9I2otlRGcR2 zely9l$a6(&sn4gr02fkUOkRRZaTzYh6}S>t;c8riYjGW}#|^jf?46&r!c1>V3UTzKYkW-x77+ZM=hb@gCk6 zt!3Op@*{kVPw*)|!{_)yw3hj=$glAY^>_Gz`bY9-@)uFB<2(MM{u}>@*3!4C`0x3i zS=8&wBI>;CU=xV zMzkk8qO+*uUCSI|?pKps3u|K?`t`{5u>m&3M(8Q(dfw?`W?aiFOC52l`hLvSb#6Ls7O z@<<$oqj3z5#c`tUGfC9>Q>ahHX*iw!O!6#I=gp(OK(vv(Sk%|S5?m_ky30i!znc0Q zTuXmF{ms<3;8xrw>N-2fJ8>88#yz-K)baa88}ShNh^Xf~ipQv*AfLoj)X$L5;yFA| z|04MkUdAhU6|doSyn#3I7T(4?co*;CeSClq@ew}8C-@Yf;d6X}FYy(=#y9vD--&uZ zKaf9?Ka;=USL)yKC;q1Y2mhj#-M_~p6I!DUX2vX-RkV?FRg|)E`*2Q{Q9~)ppY=oZZh2H3czUU|F{R$ulVh}dQUA>L96^pG zN0VbP7Mr3G7DU?Mid=GX#Tih90Qkq&^Bq;}{%^<8ZvF^C#kD z>Qitk_37jpIFtHp@*JFt^Kd>cz=gO77vmCKipy|0uE3SJ3RmMAT#M^Oy{--9jkpOn z;}+bC+eDqWgS?Zxo4g12;y&Du2k;;s!ozq3kK!>rjwkRWp2E|32G8O-JdYRfB3{DF zcm=QGHN1{D@Fw2E+js}>;yt{N5AY#A!pHaopW-uojxX>fzQWh|2H)a4e2*XSBYwiq z_yxb>H~fx2@F)Jl-}ndrqE#inE}}KsU}nsMSuq=C#~hdwb75}GgLyF@=Enk95DQ^p zEP_R`7#7D8SQ1NNX)Gh^>!RHMsq0?AExW1$-$Nh}N(I4`4_a~OSfR_3me3NRg$ujF ziALJT2_^z6CO+WCM>qIDKn%6(P+(CaMmw<;TR0So$3ltPjSnJJP`nEAP^3)Th^GY~ zSUh6e#x%sh-T&WO-&!%>y?oypbBsCOV~#o3T34~*l5@5b@V z#_=)Z_}KNBy~mC8(IBt&PrQ`VJ=T3@#=B>mT~;n zas0M%{PuBt`Zzvg9RKfeyk;D~V;sM89KUNEzk3}2!#MuOaeU@DK5HDmXB@wG9KUZI zzkeK`J&r#xj?Wp#=Z@p^#_mggjwiPu~jyH_sPmbe%9><>= z$Dba@myhGmjN^Y9$DbX?SB&E;$8l#IUp0;=$MMzU_;cg<^W*rMar}jG+#SbX9LH1R z_}X#&rE&b_aeUo4-Z+lGGLFAGj=wgJ|8+f9|JRT7uaDzzjN@;P<8O`Q8^-abas2IZ zeB(I2X&g_l$Lzj&9DjG5f6F-j-Z=h0BmWOZ`mN*mwsHK!aeVtYzGEEUIgald$3Gg! zKOV<-kK><=<9o*O%sBq(INmaj|9u?)Y#jf`IKFor|9l+ZH;#WXj(g+yKgaPe$MOB+ z_IG!EH4~^r8$MGZM_|b8^bsYbG9RJri{=+!_?{WOc zalCCD|7jd=AIJYQjvpJxkB{RW!V-0CXj- zV0$s_(2s^`vt@;tclU>4P-6vlM{}DKa@iT!p1*l0??Kxs)HhM5Q^;4JgCQ@N}BMcM0 zv<@X_@sLEAhh0~Ks&;X5dlM<fLPRul5(z1B_6VZvdyuoZH+(jY+dSe)GqKD0v ztt#?#a=QVmYHlx*U!<Kk?puv z>zo*iNGnK}w|mD}#Q-EI$a`mH8H3zza!e_^s>xh6=ze9wiwSW4ZyDfxviBR!Z3XC_ zip$;`ntNJ+Jzz7g2;LudDy}e;gxZfZC*NZeCIt})oGGg>K58ctUIumo=43<-wu-^| z7lgekU~UHFG$xm<;9j2a`vd00#}o~ZyZ6R@M8Mo;*hK-$qt4cYuB5MvdnBNABXE?w0~z8kiXZ`cP{mmfI%o=S`R}W{s;RhPj7C&LWFQL2iW!9CtY} z9u&sBg7JH#xzhm;3|4e3@>^njN5BEF6UMn01j35_?kNx4$J99|6aL8nZ{(C%)o`t# znhKn~-83{IjX4G30?W*=);~k(K0W6vb73?92Qs5>1;V%_^TKdja&~SsC#wBnz`n3g zW^WnxyMcS=LsaKZj&L6t$r~Rqg+P9C%^X(dZOL(jam{4!g3K=iKNfHxOZBSB(d}W* z$*nM9{EnysKh>P$5X1Y?B8K9?)BsTIJJ!s>CGygQRc$eu7lCT5;$9IrFD{ZAZ?FsE zdc3ppkCAGy3?uS@Fpd^srvmp1aCA7#wr7Cljpi_D*kJ$EoTJY&&VZWG=+e;b7_QwM zaruF)oCq8b90=S}Zp*OG2pkPCZ^{1kM6yE8N;3~2FH7zz0U|qL8vSILzLNO`kuY`H zj0EgFnR6tW1990q5jLO2;#)Mg3eaHmo{>_(MXD|lb1Z*$N$Zm9!#sstopg zCm;3s43LwSlJKGVMfyJzF}Ik64@?+cYInn|IR@;^ zr19D?jIW>OhTBNwc@yAmIgvC(&)#;7orz0sU!<6YE8mmN(PfW$BtT^5YA(9(Pt6Ip z6-Ex172sfuRlu6Fa$DrP1B3@})t(i?hvK>kn&WLgeXI;`E=7!POvk@~EEGU^nR(=# zv|S;Er^dC_02^l@W2od#7~NY7?VS^2J4~vcZ!!|;L#BYPNaNCgNNKz#@=&_cXZab; z?M!O_cCw87+DJv@XbyKpBkolhz;MzmBQ-VW7etP%F*cD-mNn{fikdY0`sDsA`1Cbs~WG>j9>;+VaWkD+TVr|VujE!iBwmk21~Ukm%{u=A!MW%R!0XdIY?F<2fR7+Ky-PKo!0S@Tz?;ZdZp z-xNcmpNO%XQtfzO>ADx+ zIu$~7893aWGR-b6*&_@aepRY*ZxizT~#|0sgd@=Rsp>W z)02*%=Ve|Y-V!z}a+ngkoG^N_Iri>Wjep4U2jiX~5_x_YM~5Pv?GjWR@gaFzCUQ7{ zK@H~W@;x!;3Oy#$8YwX~T; zZy%X^Sqxi)OW{7ZIqLy9*XE70q!ADkQ(1Bx@>jNAqOJYnr4mPO>d0+xc6(}l}2 zQY?yNp@z*lxm4I2Bgye5jGO#;?;% zd`L$I5@UaI(x2JHWE28xx`>#r#WfyHVD@_+v}epX)FCXQ<*+* z>Z{}FT0Eu}6DgS)Fffzb$w>j&KUpTn9$`T)6PDn$lll1$ywTjFGjKReK=J?_Zlbby z%wL=wzbx}X*xaGGZw=sLcU=$QEIrr+(^>r!x^zPS*F1N%d-J~?7+}Z~k^T?*QS- zO)^ek!hB#LSChBTtU}VlJvcd{p`4CuwfC4{dH%4`;C0Qhd|TL@k)~NSw-ey)c-Ykeh4^Sm z%gvQ|&XN^I)!u1)AhkaZNC9^hX&*T;MexApo)DO0;oN<4j_SWnBDhSQ*BtEXFt4R7 zFC#s6kbDT2bDfQRRvD>_z}cI#+|9}&K!kZ^cX){T6&bi9k-waTXY(@RQWJ7%Lomvv zNcna585UV{1&}Txr!(&y5(^EM1*yb?qvT*O3G}oSG5BSEE~gzzPNa{WisP6w zcO>1d08?ke#3Hn(M_v^m>{id7fIc_Ir2*vKz`hu&yEkF0FmD8cRL(=q!OZ#ffH{s9 zai1M9=Rqpfo#t>?VPZyZObjG2hh}Nz>q`+Iej7Ak=`JS&gl~y_VL*HwAvrRqbY3nT z1s_k?Yn8MPM_v+G1s)XG49Mup>5#c?65&G_2b=pTj26!vzj{*J@&PQ8I~BM!pw09t zwfQn}JT48)u94psYi z6~Q~!KSQx+^VIZ}Pard6nW^&vl73p467Wk0$3nF0|8;R|f>HX%t%{ zslj%Ipv&I5311qR<)roL$=PaF`Ynl2vo(&E;HRyBhRzuRYVI$avj?>R4JG+N2J8yn zyi}{k+*kj|M^@$onSlq#I5`DA8&x&VC5_>MJD>84wd(MFlH6A2E$!=h%cxo{BELOS zxJSd5%`L+&CLCA=e8G5mjKh%%=8qXgpkPB&=j}=BpL<-I@chiXe+;Jf!gjK<6_B~3 zih=7=vkH4_Wc+@g-0P?{=gB1I(=lKGwc{B;YL!bOH3LV(;ntkZId4SGpdA(GY?c=R zjqWPBFSQ$*lkc32>du9Db|QBc?#B9O_=aq5_*HyX=03PN5v|ADqte|C+?<>|SU$F< zhRf5LxK~Bme$Yz^*?N9xkkd3W zrLc!51AAeMz`Fx0AbU#8o5uY97$*bX!S0)g2#8n(JLMPF^MlK)5*})wutE^oO~f%W z7$8?@oU1O3?n`k4%YaXHR&bF9D|7w6Ba!(*btI94>z^T@A;@CcKN%H)BSWuw*|Vb* z`$%%`e{Y{OguxVWM~v-&)yMU{)3++ictPBGX*~k9;9Zg&F$mnp$1Ont<(lGY%zgV*sv?? zkBM~&A@`Ewd)b2Sqk|X)5mGedWaHQfM zy~z%btOKEb!Oegg_-3RXZ;ea$>M$9xY~x(eoMgBZ#;PI!EO8;$9cmZzQPkVLLCUayqoGiM&NX0m4#%x$H>m z2Hb=>$NiD!J|&=5hvQno`-M3y`K56>Ig4!0Eh1Mh5y=|r;7zW9eE<46CV=xv+JM1xu}%M8;eDjs-+O$PfwBVrR%g1 zh6m7YbKe+nGB}1|GJjW$yUp25=f~iesbPmUcT?b^fI^4>U=NV*YBInIhJY3^lyfWW zk^l{I^U}@+JhFu0V>K&u?Ln9YwQkl3;6uSQ5(93LR>npYi|F535jp?VO3pbei%7zL zgMWMBVhBUbzuz3p(pps|Uc}({V3=c5$BKE?+-m)EmrKX}n>!vj8JIsk%Y)hwRa{ue z;9R~AilIg0e5B}yLWKS6vb4S`Ze#Bxr<+9TO3d=X81rudoQX_%{yr}5doy~s=b&$l z%pYbTVD**cY$Wci8%kRC`erUe1E2J-MybQ#b-`~2y%Cl^V=_Vwxh^>FtvePBSUCsXyk2Q zTpepsTp_4Q;rhw)sj!OzdjWpU$wiZ$-DT0gBbwv7ZVNuS;Wfj_g*F@7h&fcWl=gt5Gg6urPdB=CR) zza*|a9ug+VH%%J$mcJv@G>r0Vk%hL(6ov)(>WMU`x_~eqSewo7DNa30p=vbdr}#h? z%REOI7*;DTIf3sH4jc^dyAdXRrBkrEexj0xU&ACj{3Y){hB}&cgmu&MPGFW5f^*ns z(Fh3b31M7X&?AwY4+X1C{PH0_=7qL16_FZyguR5!_2c&~S-!Et@-|$&BK6Q8#ii>d z^Kgvq_0N#y5JBEF%|NE%9N!E3^!3lsT!M6RU7nR8k3^J2A)FDb<`#)~DV$%HzdHss zrv6yoJX2lCi3vG-y=ND&2pN?QZOI_OFMwc$I$2* zAi}_RM7mCMDa-59V9LK06q+uvD2up0lX^9GJlHd*V<^NM!}hW)U-jes#WAdhYGAmU zdj6h_E2`t^9-c@pB{={3@j%=olgJ%m-m&d{u`u=bF^1?XyJz>zy&|r?`sy(2u?kZm znCgCcb1x|>1_XYnxl@55qs(go8l1x}Oa%Gci987@mNhk8p45+s-x#}4eK0v+g*?w^ z5zj66&UyDZpe)&Ssa;#7)=~>>PNWr7SS8+_V%e9-+!nkIcmDPK@Mic|gah6*52mqY zF3f4m{19n#4hq{!!M-u!rv-i`@Vx=`GpAOMX-?Bf@SLnzP+tR7cV0`&gF((;EQo-& zw^rgs20ZfT^%&IF^TXa(wf~Xuq2>;!L6|ARUT@_4%hB*nI*nm@!u~grxFLfYM}HoDSt3V>go*iS zYh+lI?TKMy3&Z_cQzKVdR@18pN1n=n>;9R^z|cOC9?^FxNy1viT0XNd=H9(;8qaFZ zlIa6w-(`Luh_mlFPaI=PuE8 zI{Qd!I*jF^LRmh|TXlKe`sW^A?A#~W`%rTt9o909+iA?8IScy1=7gpY+Dz%}+Vhh0 zY3OUh=GuGK-jXh1m&Nx@<~=%|6ZwkN1pcRmEAt!3MKUk*UtLo}%o^zlso5kl7pY&W zi0V7zTF||$xLXKA`ZCA8F*)`;&sF?e)3D=-Fh4X>!fL>Zg`XKZ0(eHzE0~S5N{!`D z2@^ANBe{16UJ|gob+#0KpfI-AKf?(;?5GU9K4DR5v$M_3&M!)hfyi{az%$ zI~eKWdUu9d%Y$*HAkx)Dz7>|*oH;cC@%Hva{(@Ywd}RGItlR$P$f=8%50MM#;#W?X zYIrbn^bHeZj*5m<1-VG%z?6}eBC-?X#{*W{*WbA$7Wn~je>iY?;Ant|LJ+xVnwujy z(VV{83{xf~;G!fdnZIZ{YtTq`e)@TZtes&SZd`LP${Hto&G9 zeagHbHUBckH?};EGzRvXyCy*Ho5G}EwK)2^=Kfa^2;39ws^%=bU16&!qLu#qxELQ; zBg2_}dYTiOaEaLLE8K+Vd?j-v#$|!;4$Obje5Qc*H%CqlMD>Ugye954?hRp%rDugH z$*&}$*JSjG7z}t&5m`-hUK*B>&(7X$0pY$eEALQU zF9V!^)`Y3cUq#M`)+h68xy5&?fP4lz8bb|41#?`}09>-DeLUg$n&(#rf^-x-H|`=J z0^7hlol1U7jQs)MMX3p#Wx#s{Z=1;-39v%#2O^~)bGj_k#rUJrA}sU2i1fga(Pu}J z(=^@u=SEeCc2Y|G`E44+yb6;rRmzq5M zv4Sl5_|GwHlAle3mCdld7*_xPiv0Zb&v2j&m5lq%Dm1AH=;}z$WweaMcu3g1(ju52 zHjX}WZe-hQ+3~)S8dI`-e14rEZe-rjHk;cnmXis)>&=U-8p1I5TZ#B3gEmtfC#!|p zic9YHsjx?z`-yzq?cq<3n)oDrFkuTNNWZX@s@&`-B|elJPQVlHGp&0*=U;q7G1-r935eU~# z8J2rJKb&y$u_RR`KAYM`;AAdoJS87ft~(L- z%zy(x7@Nrr3s6SeagT(ZioqVhoA?xhUqLGD;naL_;CE|H4Nv0X?&pI%wI|Xz> zj2}yQ$a3=gv>5!(Z!w(T9z*)8u;YRA2v7BUWTes&*@=A7l;zVSPv&T~{u%tL9}Q1~ zg9#&-3A18Ls)5ddoyv-)*-P$BYFba=Oerh_x{kefO-3cH1~6T`i0j_&+@*U>j_myp z$F*zUpSK;R!l<#rrMmo5T#;g27I~0?0FiHnW&Y;%&s{#-@Vkm}HuEx?cj(aBF_Z~; zpM-6DJ7Be@hI50i9zT)>;ZMXJtQ3LQ++~FkI>ZbEyg>g-e zo{S8@9v#Ed>hZl8{-xes%qQXq=VRWcFIvwJWmiex9;Et*S+O#gggFKNea^Qc{Z?iX zc}}FXj^*RB_0Mq7z6T=_E|r88)i@FNpC*y>CM&yPcJlC>nl*Koa$cA{-qhtA6W+`3 zzV**gHS0k{XuEN>@_xdB_XdRF?QSQdNKdu9ycH#PI0NUcf9~>S?6w%vXH@jOeO?Uz z383vXuE_GRcrmPpEiOJ6;o*6ioCUy8Vn#hg_!yEdmJh6dhC}d3My;g-ba0fZi!s8k z47(!Wso~qJ`=8f!M!z(!tCa)qf32yZ8s=`DKB_fu{#nliHC;>#;o* zc4aP7g6_6H?G9Tb?&kVuXaQ>^T*s0P!I6KeA;=FWyqTI$-kzp>JiWk&W{A58uyP=V zRVC*jTdk*t=ZC+T`IAUh`?b_qITZ$cJWP8(Z;cGtyPJDLX)!wg{&!!DN3MT{n*PaL z&V;vPa5SXf+?$)TE1V1t4?F6inG%bQV+XvZxmO0R2yAA4Imvw}dk#kS=4v>&oz!2E zu-~HG-XwTM;qC^cULvX=;5Evn*Tes~Pm{gaaw6{2QN zA$X%EBZY-&ZyWJY;WDaERqaI?Jvf!b+ugD`+__bbHg{XVr$6ffNcFEWK#faz!1&!t zjo(Yc7{xUwzS-N1ol4lts03Lt$H4Ji%J*d0zJxWBr?W-g7h^Rst`5T`r-)}0*=hgM zVBW9oSSDg$4lySzw})lwB>~~ud4jw?5i4zPEhA?PLyH0%8Gs!UT40`=v7HzP1G2=> zgbrGf?vJYp1tiGjdTLk{8$ux-)Etqg720WPr7zV#K?bf3d{^Mn$z2)-NMSefz5%A@ zFU-R5thK7b5TwPkQ~I8}#!XIL%q{b=TK^0Suos!wpiAyZv`=OpEK=ZOepC*Nm*rK$ zdtsgxd<>3a&~@Wx`GUMH62635z#lH|4^vKSMELuf^JYlneUZxU>*dCj)>pqo>?uoo9yES4;kj|W+<1LZfV1YLV9u)9v zEP)SwkepP#mCMa-(?yeyE7uZt%_9w!yedr0nr4xC+sZ%g5WUVB7CG+e0HbO^gMt5) zsq^Amyv;Ca?GKZ_ruI83&L2E6ROr@7HCScJJp!q)p2>q;^>Y?)rSWwM4-ecJmU~#O z7^}&LRb4hWELjXj#qv?Q&AB^zEb^<)L}0^Qa{djav}O@j)Bq5@W;mI~1vyu+D zvB=7@IoLi}!bmP{L?Sd4;!tu*EIyVQJsjhBfSi3~W0N~K#&rRtYV1TlF2Fofe^&&A z<)PxM%EaX=;WGi2-RkFGO&^OPK0drp&uwu-Tot-_GO#^)dq8tsUKplykBNI_q)uE! z&RG&s=ebN0^meQxmg$Q5Lt)3)Kf?lG>^0{e`y*NQuz7x|{(YoX0A3!snXok%fxopE z{d+J1Qk6NiMRP~e6{K_Azp4qNT$eJE4jM1D4gMFv!e#ykg; zr44JfEHb&B47l1K%qTgrd{GRTn=cJXJ1FF4!(Nt}e%?#t?*opiMVL82`m5$#by*ex z?*16J2YhaGM2hswGJin~4~#==Wcc;oY~@$uda7A{KF*}}`blkH0g3)30BTM=5s_u zkgG_`!?HW@Cz5mV5`k9nw36E!;(923W|%)m-3=o=e{y_cb5{jy@kN*(|HCyh+$gSZ zPBWY>3=6==;mA$g88mn4M0(RyPL}2Igt)eqvLB9|<#fcyn_C5z6UHSgD*4Yj8j>Lr zxfQk(5EVJ^)1S~UG4_&Mh5bsv4s|fv3rY+)H!PktXKDr;=`I822*X%D8bi{TglR`c zPfr@iUyED>{x0Bc8#%w!u*aKSG2~kcV%`W_2H2Y&ImlE})ecQbKPE?8fn~ruClS$q z)x%(2{CCPElrC(1;#@xJ3 z71rFzG@df49b8jGzg%752V&gPoSKU7{>^O$RFak1$NZt}#>uEcc)k%vT8~%M@_K`1 z*M(n9O};0>$UQtc-Y%K^4*$K8$V-cq@GB$zy4qjrT)n1-z=umED+ynioIjIfUQMrx zF~k=ppq=ELL)J|T4$JQPTP8im=|8=YI?uq?p*&2-sXT7>ApNJZ*+evlD$WV z*(AGbWT>;lQdCk{O(OOd%Q9!r@lV8FxH;i>2I%gDT~}Rp!!BO`45?Z?BAkC&3_avY zw`3qNCn(F`Zcd-tF1U|q?z_s;?w+^lD!+ssc!cMt-#7D-nmnF1dHc`J{RVD;UqRYn zj5dFlH;lb#U*7rfsn`=tt!9^7lhK3ukmc#-ByDer<&NeS6Sz4{#q}THw=F6zK98|0 zlUoH8!bORXAD*%l&~hy?KJH?OO2;l@%wG+DJX4niG{4Xocx7{!1YWGfS$Q(Kz+T`} z0-WDPR~UgsTz@ym-uzpr!3ViSE)HBCI6oj3zf<>#bu+o2i@}PjdF7rr_7U9VJOZB+ zDc@rS?o~m)-!sW6;vBR8$dA>(B`Y%WrNfe85Z;^&Y=>c-w?>8rKGd9byEAMR*vOvT zME|sBK_JE zrUqJSZn$M4($aO(cR*pxT<5_uzn7&!7?&y7pc_{#mX;~4yjMWv)D(A-y+s-~Owmi> z>PWiG|9NsJnv;UMteQKS?sEf|#C`m~bpD1!Y%oUWa+-6mQ>!7qg!g4-m6g{Atc-m= zuZ$0&!ca9U0~}8G=Tc+z_Uyf`xvw!7xmy1WHP~zJhDmt7udzG;!WmElDPSn#Zn`gs z`x~qzER3^}hx4X^IhwPaSDI0;04n*Fsj+-2Ozl@;TKUp28hlvGt>$1Z9bPSUqPG}3 zSrc*&97|(=VD4Bxo?0F{LVO#Ed}@F3k%E1B zx;+^{l}Jw_Mn`QdExy2-$QPuJ5=*Ex_Cf~hOwYCV^yW07txy2N?l z2$H__@RlV4A{M}bLS(Ou?8ePZ@gX#Yu-}FR3;aML^MA-iVHHB)t~krJ#IQ|yV`aE= zW#B!01eDXlyPOEpg1Yk$)lJS5OhDFXQMevY_VgZm>#3n%zCZF;1N-wfuZ-WrGCy0E zzN>-gm6(q&%m8u@QUv>Az?Nau{AUu)9na-!0*bva%u#wG;YSC!^wH#aqrthH z!;qj()Gx{;nM0Y{32-FyCq|wM*kDTM;q~0+hE&5C<>Th^xZAf)45z$)ae6C+2v%ui zWO!2=3f3I8gK-{InUr|W{GB!6iDBL0QS3SxL~|COn2&Hy$j=m@c*3RQ*6H&aZXYjYOppkM2h^5 z!oAz>aaVbEruOAh(oz+;YP>D(R@|osUKnWwy*Mp0>dU(=`Rqh=-M>k0ICB#5FN=x% z1(ASqT9ju*IzdjRrb5qePAne@du8Cgah3C}VVZ`4XXaxjRp@IHS*B)BJ4;^L9Invh z!G{D_3A1+?max-NuUP=UP#sn<5oK38CH732KSXi9%F3@NJS<8W^NcRn)DVz4p}C9+ z1F#Y2PGr;~4+gU5QypEKM5M|@*gpfn-AH&_EEQ~f{WCm(n3BiIxEk(?Fg0aw5qY>| zSe_59(=kMQ?*F(`Go$$ST26$i z+S}9M?YidF3S${V3O^m=EdhaF5JN_P8b*U0?8lqiPMBYF_l|r_U?z`89tkk2;z}}H z_p@?)T$`PNCq*vGQp|ImE$CC?emL%-bfxNC^T4%?G`=Pgeb41Bkt)8-fIkY+5rg?m z&AQINRdOC#lG#i|`ZlaevUh26Lx-)A;pQ>N?5_OmMBWo{e?FEewP)r07=m;;R`FY# zvogZ9r-kunF_dZe)2qmD3ja?mz*ZnYrvWcf?$!Q>(j) zxEE{cYbUww)J`J9M5;?Ho))mux&$`VFOB=>=*6iy80THP755#Jy&Em_h=EIYd zWhc#`n_q1qEm1L`U=NCGeHR(9pw5@w$aly6sxWytnomS}hv4YEM3`b(pZZ(Gp`YWv zxoWVyiqvp^)5Y(w((Cyl$gfYtgZXTj6;uf8@tB;;*Ls{2c}H^ob&?3kX~J1fkjTRc zyKUOU!*{sm9J#|+tBi{Nd0_%)z}EPy_0-U!dPohd%%jTkVQFae(~}jk4DTO_D6Hr) ztiGq8(1x0>#RebmDYRL5$gR1(DUaQRRYFMBzc&rs9|>dX^AZs~UC}R^gQ*%)?JbWLR1#6mmrBLHGrwXP zmUc}Irc{zq32KdVh7lLb=Qw<_kQ2id4Hv!EHu$l0O0y}}lw8*}i zQnSlo{$BL5L`3!RG`w3$i_7_(} z>A1GEgcq6LnetFcEzkKc#yuJLO&PFImO_b{;&=Z2hwAExXQm+|@20TLObN|Sw$fe| z9DU0)q`wLipA`7Gq&dmJ=P`ZlaV}ml?5%~>qkA`iBEyHdMsL8F8Z?&?R^oWKW?`2dj%!)SQOy)E)^;3N59{z&ARfT$FQsq31fs|ISS zILjC^=a-t=yUE-bSDy|m(_UCKXDKY+W^>y`aDEKln3oL8&yPWEUzmkLdKY)k{)tIf z80HR4bL{!Xcu{lGKNu!`zb2BZ2pq^S$5oer=4X_KAm1KinVhPoxN+6MKwiM;T5KrYZ$`RcsLQh=Wj-ufVK^u}gf*8I zbzXgT!tV>%d0f7BO^y9hRBG?n(97h6`!mzx4JkwpM#K2Hp72zw%OXX8B8(&U7Lj~t z6|X@m`H~n92>4Bd)p~X$mzL4z36F%W9BCR{J;aeVLtaaF3JCWXn$xkuuva z!yE&<&FNw#K9fEBQaPpNuOXM~`C)I(k7Fswa;RFSZqESodtoo-GO!)^ynwys08m)T zAWz3VFTlVn!wvuaT$=CONTOv z;P3M01d*FUxNq!>f!xc$;q}k(zQu~Pbdw;h!v5s^@^3p~opVlegk{9u%d)%~tdXp83}(u;8=`B zKt_XFWX$21`<2ky$MBysX-<5v3%fcXk0mVNptv-b&xvH@{OYj1z%W-pTam(rk+bly zXC~ssiHN-*=~Ze@IQAYGc|5R6<8at+U?U)DEg)P5kiQsLU3A2=B4tTL1RNcVu@k_6 zsR1jGh@n=Cufeak1F1E}2 zra7Hxc|4TnsOF5E8|S3)Ljgga&hkSey$2|rR|VLMVyL7Acyq!^;udr|?lQ0$aFFc} zlac5p&5_^Z&>d=;93MnPwPdj3@)Qb)>=c%DntZ!CVQ~s zVHkcL;<5c7a03sk*gAV&nG0jEOjyz?uEc`eu2vVZ5+*Hc+0^h)5{9RET#0G_vkJpe z&wSv)0h>l!Q11?t>O+hS{i>HeKNJ7+avvbjsyAgCZoI^ ziu~1t4~N|sH{de{Z^M#h#cB40Nn~Hx9Wn0m*oma3h!Pa8vU4fsja)h>eM_@Bk!rfi zioNh_$yr9+VL_W?esA(-jUG}!&xpI4f>hYKW5wc)U{myga|158jx-CZ&HM)_?s5xa zH1n*u`}npg`YUh)%cAnPIPS{YLi#%AmJG}RQL{2KTE-QcTc13JR>|^e{WG+b_|8VU z>M{=ue@u~;C#EsK`K!H}GI~`(ZYTHi0*^cud1fZp)bNdLFdui$@~nUYzNOiDmRl17 zb5z5Jlnl&mp$11Yp!NKA$y>gC`IZ=uFRDeDe0{)iT4?^g7?xtbAzM6_-!_HI4gmHxriFTB!t*_Xm5ue(J(dBn91fdx znfi~Zxps?61Q`E{<-j869;COgk>SO2INYYp{VNjN?`mNLG{1kOycNmlsW9i{D(ssB zium9hIVc99s9;e2AUeL*kS5C=%zNuC;eq=0@@DKtdE=m`goXrCh}Q{9BEE> zI=O_lKZe8Oro4N+du|PWC$760m(&i#xMqs#k0UJ)m-BMlTMOKPSd?8`teW#|e0bPJ z0lC?_U$Um|zS({KaIX`Kbvu^YUO+P58#$W8&?-JzaH&?n&=%=_cF7E#9fmtRCXfMj zaTf(n&`9^@fR5dq=8iTeJ~hyyV&;P|a&C}krR!?{iZILlmtm5*G<&lFscI=fI$xL~ z?62f+PUAVP>V;WxDZ0HmNi!fztAF1_R&hlzb79(NH!kvl8QqEeoxn2Sa{}jzb6s;5 zU@yylvxn=6J#R!QIQni(<8;94ONM2ww_48+%QN4(JYmmfeqL$VvN@}z*cO0!F>mHW z=DW#xXsWI-1o`9`XQVLg3LEFor#WR;4GCJ%kEM1X5uY{=Myjr4JSK#DmX&~Rchtk? z%Y-miiCC>gn7t)%bKB+uQf2+Mge%zUJVgksW?A;RhoWKJE!-KhsTMG6Bc}ZLtAOgZn0rLx`EdMHv z*9OiFYz7`Okqju}MsrGMj(MT^uLQ*$Zk7^Mx~(Rk8Mrneg=1lU6|a(uNPvcbBx4Kt zjhN4~T52z0aw6d9oaQWmouW8|cPh^I`e!)DJz^YqLz~6W@`5~`6YwPg`qE-lKo}p3D`w!gBOe=hPZ}2B5&5+t2A457aus6lYo<9O z&TKxAN3v(7)#XIOx>!w*#kG^A>KK;MG6oIa#K$O?+VNl_z=^Pdn|T$YM($)>29OR9 zR+vAp1abB5upVg$h{*3{bk&@lEHvxO%1gP7yB(l$Q5aKKOxSxT5j(&xvulSIjjK$< zPL31-A5Po(cPDOr5>#R$`_gz{07FyHSvvKQXA`-in31-cj4p}s=D^Xwp}?G_^l1ok z5%*-kF@m9AgyA@(q2hB*U!KOD0hOddSJjZmaVL@g7AB01uo+lxKJHgC0`jQ@cC0zw z^tRN_3CySCBO~`s>vlGbb72q`6%06-hGNUe;jwIvHzl#(wld{dBK(3xaJ^r894``i zb&RhFoBQ;V=C%W`i!p~g|7%`Gx#ZkwrVw*8c+xopPiAE=d(?EI<2u{=Q!b?nuncqK zhS@l7hc{$TQ?FnFUFR9)2wyh$cL4!eMklNFcy^3K=?J#QQ783*al1QuixG;TnDD15PhX#+#x`d-y#7Yw({K&}%Ij0H?@JNNdIk^i1Ul}mxtpg@B*q_D~-?d@C6Ij*^ zmiAG|z^t~2Tm|Om4D!XzJvUv+xRox+1vG=xLQOG%Mcjh{>v1&9Dx4Fx3fvl)j|_7& zU|?qw##ly53)c$Tk|F@qKutN~@_SOFYtKkpGswsT!y2uUI})I~6()L?VJD~CA&s3x zguy&OPD{ZSiEuO@*X-SEa&$86L_m+z0DQ$+Pv4_|1M+~7_5c3WFx+F~>j&fwPZ`Gh L`xX8@?(zQuvR_dd literal 0 HcmV?d00001 diff --git a/.vs/PrivateCloud.DiagnosticInfo/FileContentIndex/read.lock b/.vs/PrivateCloud.DiagnosticInfo/FileContentIndex/read.lock new file mode 100644 index 0000000..e69de29 diff --git a/.vs/PrivateCloud.DiagnosticInfo/v17/.wsuo b/.vs/PrivateCloud.DiagnosticInfo/v17/.wsuo new file mode 100644 index 0000000000000000000000000000000000000000..67a605e7cd13afc3d9ff62da6969239d39b5adbc GIT binary patch literal 24064 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 a?7&hMcdvZx_xtVMKSmigxckTAf&T;Oe%1*9 literal 0 HcmV?d00001 diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000..f8b4888 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..e2b431c --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,8 @@ +{ + "ExpandedNodes": [ + "", + "\\PrivateCloud.DiagnosticInfo" + ], + "SelectedNode": "\\PrivateCloud.DiagnosticInfo\\PrivateCloud.DiagnosticInfo.psm1", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..bf3f70a3fe0953a4bbb6433b5d84c4d184ff9a00 GIT binary patch literal 90112 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 CU2<&z literal 0 HcmV?d00001 From bfd19e1630d4e7c2d63e49fc2fc6f8d5a5cdf8d1 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Wed, 9 Aug 2023 15:25:34 -0500 Subject: [PATCH 072/127] Added Check for Cluster Perf before collecting. Added a check so we do not run the get-clusterperf on clusters that do not have it enabled. - JG --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 622c2ad..0c3405a 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2815,8 +2815,9 @@ function Get-SddcDiagnosticInfo Show-Warning("Unable to get AzureStack HCI info. `nError="+$_.Exception.Message) } - + Show-Update "Start gather of Cluster Performance information..." + IF(Get-ClusterPerf -CimSession $(Get-Cluster).name -ErrorAction SilentlyContinue){ #Added by JG #try { Show-Update " Gathering Sample 1: CPU, I see you!" @@ -3036,6 +3037,7 @@ function Get-SddcDiagnosticInfo } $Output | Sort-Object RawAvgMemoryUsage -Descending | Select-Object -First 10 | Export-Clixml ($Path + "Memoryhog.xml") }catch { Show-Warning("Unable to get Memory hog Data. `nError="+$_.Exception.Message) } + }Else{Show-Update " No Cluster Performance information found."} } From 8fdfcfcc7aace3e1530fa26cf5fb9b68e1b433cc Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Tue, 22 Aug 2023 09:44:33 -0500 Subject: [PATCH 073/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 622c2ad..726f075 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2276,6 +2276,7 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Echo Get-DriverSuiteVersion;Get-ChildItem HKLM:\SOFTWARE\Dell\MUP -Recurse | Get-ItemProperty}', 'Invoke-Command -ComputerName _C_ {Echo Get-ChipsetVersion;Get-WmiObject win32_product | ? Name -like "*chipset*"}', 'Invoke-Command -ComputerName _C_ {Echo Get-ProcessByService;$aps=GPs;$r=@();$Ass=GWmi Win32_Service;foreach($p in $aps){$ss=$Ass|?{$_.ProcessID -eq $p.Id};IF($ss){$r+=[PSCustomObject]@{Service=$ss.DisplayName;ProcessName=$p.ProcessName;ProcessID=$p.Id}}}$r}', + 'Invoke-Command -ComputerName _C_ {Echo Get-ClusterFaultDomain;Get-ClusterFaultDomain}', 'Get-NetNeighbor -CimSession _C_', 'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' @@ -3227,7 +3228,7 @@ function Get-SddcDiagnosticInfo } else { Show-Update "Get counter sets" - $set = Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk","RDMA*","Mellanox*","Marvell*","Hyper-V Hypervisor Virtual Processor" -ComputerName $ClusterNodes.Name + $set = Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk","RDMA*","Mellanox*","Marvell*","Hyper-V Hypervisor Virtual Processor" -ComputerName $ClusterNodes.Name -ErrorAction SilentlyContinue Show-Update "Start monitoring ($($PerfSamples)s)" $PerfRaw = Get-Counter -Counter $set.Paths -SampleInterval 1 -MaxSamples $PerfSamples -ErrorAction Ignore -WarningAction Ignore Show-Update "Exporting counters" From 95557398ef0ec16b651992a52bbf25c4d32b869b Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 1 Sep 2023 12:33:51 -0500 Subject: [PATCH 074/127] Fix and Feature 1. Fix GetClusterFaultDomain hang 2. Use Jobs in System Info to speed up processing --- .../PrivateCloud.DiagnosticInfo.psd1 | 2 +- .../PrivateCloud.DiagnosticInfo.psm1 | 51 +++++++++++++++---- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 78ebff6..594d9ee 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.1.37' +ModuleVersion = '1.99.1' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 726f075..eea2774 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -392,8 +392,10 @@ $CommonFuncBlock = { $tepl = (Get-Date) if ($QTime) { wevtutil epl $p.LogName $EventFile /q:$QTime /ow:true + #wevtutil epl $p.LogName $EventFile.Replace(".EVTX",".XML") /q:$QTime /ow:true } else { wevtutil epl $p.LogName $EventFile /ow:true + #wevtutil epl $p.LogName $EventFile.Replace(".EVTX",".XML") /ow:true } $tepl = (Get-Date) - $tepl @@ -1956,6 +1958,13 @@ function Get-SddcDiagnosticInfo catch { Show-Warning("Unable to get NetIntent. `nError="+$_.Exception.Message) } } + $JobStatic += start-job -Name GetClusterFaultDomain { + try { + $o = Get-ClusterFaultDomain | ft + $o | Export-Clixml ($using:Path + "GetClusterFaultDomain.XML") + } + catch { Show-Warning("Unable to get ClusterFaultDomain. `nError="+$_.Exception.Message) } + } $JobStatic += start-job -Name NetIntentGlobalOverrides { try { $o = Get-NetIntent -GlobalOverrides -ClusterName $using:AccessNode @@ -2214,11 +2223,13 @@ function Get-SddcDiagnosticInfo # # Gather SYSTEMINFO.EXE output for a given node $SysInfoOut=(Join-Path (Get-NodePath $using:Path $using:NodeName) "SystemInfo.TXT") - Start-Process -FilePath "$env:comspec" -ArgumentList "/c SystemInfo.exe /S $using:NodeName > $SysInfoOut" -WindowStyle Hidden -Wait + Start-Process -FilePath "$env:comspec" -ArgumentList "/c SystemInfo.exe /S $using:NodeName > $SysInfoOut" -WindowStyle Hidden # -Wait # Gather MSINFO32.EXE output for a given node #$MSINFO32Out=(Join-Path (Get-NodePath $using:Path $using:NodeName) "MSINFO32.NFO") #Start-Process -FilePath "$env:comspec" -ArgumentList "/c MSINFO32.exe /nfo $MSINFO32Out /Computer $using:NodeName" -WindowStyle Hidden -Wait + $LocalFileMsInfo = (Join-Path $LocalNodeDir "\msinfo.nfo") + Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer $using:NodeName /nfo $LocalFileMsInfo" # -Wait # Cmdlets to drop in TXT and XML forms # @@ -2276,9 +2287,9 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Echo Get-DriverSuiteVersion;Get-ChildItem HKLM:\SOFTWARE\Dell\MUP -Recurse | Get-ItemProperty}', 'Invoke-Command -ComputerName _C_ {Echo Get-ChipsetVersion;Get-WmiObject win32_product | ? Name -like "*chipset*"}', 'Invoke-Command -ComputerName _C_ {Echo Get-ProcessByService;$aps=GPs;$r=@();$Ass=GWmi Win32_Service;foreach($p in $aps){$ss=$Ass|?{$_.ProcessID -eq $p.Id};IF($ss){$r+=[PSCustomObject]@{Service=$ss.DisplayName;ProcessName=$p.ProcessName;ProcessID=$p.Id}}}$r}', - 'Invoke-Command -ComputerName _C_ {Echo Get-ClusterFaultDomain;Get-ClusterFaultDomain}', 'Get-NetNeighbor -CimSession _C_', 'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' + #[System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::GetComputerSite() # These commands are specific to optional modules, add only if present # - DcbQos: RoCE environments primarily @@ -2312,6 +2323,7 @@ function Get-SddcDiagnosticInfo $CmdsToLog += "Get-AzureStackHCIArcIntegration" } + $nodejobs=@() foreach ($cmd in $CmdsToLog) { # truncate cmd string to the cmd itself @@ -2319,20 +2331,20 @@ function Get-SddcDiagnosticInfo try { $cmdex = $cmd -replace '_C_',$using:NodeName -replace '_N_',$using:NodeName -replace '_A_',$using:AccessNode - $out = Invoke-Expression $cmdex + $cmdsb = [scriptblock]::Create("$cmdex") + $nodejobs+=Start-Job -Name $LocalFile -ScriptBlock $cmdsb + #$out = Invoke-Expression $cmdex # capture as txt and xml for quick analysis according to taste - $out | ft -AutoSize | Out-File -Width 9999 -Encoding ascii -FilePath "$LocalFile.txt" - $out | Export-Clixml -Path "$LocalFile.xml" + #$out | ft -AutoSize | Out-File -Width 9999 -Encoding ascii -FilePath "$LocalFile.txt" + #$out | Export-Clixml -Path "$LocalFile.xml" - } catch { - Show-Warning "'$cmdex' failed for node $Node ($($_.Exception.Message))" - } + } catch {} } + + #Add MSInfo32 - $LocalFile = (Join-Path $LocalNodeDir "\msinfo.nfo") - Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer $using:NodeName /nfo $LocalFile" -Wait $NodeSystemRootPath = Invoke-Command -ComputerName $using:NodeName -ConfigurationName $using:SessionConfigurationName { $env:SystemRoot } @@ -2401,6 +2413,25 @@ function Get-SddcDiagnosticInfo catch { Show-Warning "Could not copy report file $($_.FullName)" } } } + Do { + Sleep 1 + Foreach ($myjob in ($nodejobs | ? Name -notmatch "JOBDONE" | ? State -eq "Completed")) { + $LocalFile=$myJob.Name + $out = Receive-Job $myjob + + # capture as txt and xml for quick analysis according to taste + $out | ft -AutoSize | Out-File -Width 9999 -Encoding ascii -FilePath "$LocalFile.txt" + $out | Export-Clixml -Path "$LocalFile.xml" + $myjob.Name=$myjob.Name+":JOBDONE" + $myjob.Dispose() + } + $nodejobs | fl * | Out-File -FilePath (Join-Path $LocalNodeDir "NodeJobsStatus.txt") + + } while ($nodejobs.State -contains "Running") + Foreach ($myjob in ($nodejobs | State -ne "Completed")) { + Show-Warning "'$myjob' failed for node $Node ($(Receive-Job $myjob))" + } + $nodejobs | Remove-Job } } From d39cfb4794837a0684a0039ec15ef00a222651a3 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 1 Sep 2023 13:37:07 -0500 Subject: [PATCH 075/127] Cluster Perf history 1. Moved JG new perf history code to a job 2. Fixed erroneous errors --- .../PrivateCloud.DiagnosticInfo.psm1 | 129 +++++++++++------- 1 file changed, 80 insertions(+), 49 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index eea2774..5ab4545 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1887,7 +1887,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterGroup -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterGroup.XML") } - catch { Show-Warning("Unable to get Cluster Groups. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Unable to get Cluster Groups. `nError="+$_.Exception.Message) + } } $JobStatic += start-job -Name ClusterNetwork { @@ -1895,7 +1896,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterNetwork -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterNetwork.XML") } - catch { Show-Warning("Could not get Cluster Nodes. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Could not get Cluster Nodes. `nError="+$_.Exception.Message) + } } $JobStatic += start-job -Name ClusterNetworkLiveMigrationInformation { @@ -1903,7 +1905,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterResourceType -Name 'Virtual Machine' -Cluster $using:AccessNode | Get-ClusterParameter $o | Export-Clixml ($using:Path + "ClusterNetworkLiveMigration.XML") } - catch { Show-Warning("Could not get Cluster Network Live Migration Information. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Could not get Cluster Network Live Migration Information. `nError="+$_.Exception.Message) + } } $JobStatic += start-job -Name ClusterResource { @@ -1911,7 +1914,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterResource -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterResource.XML") } - catch { Show-Warning("Unable to get Cluster Resources. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Unable to get Cluster Resources. `nError="+$_.Exception.Message) + } } @@ -1920,7 +1924,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterResource -Cluster $using:AccessNode | Get-ClusterParameter $o | Export-Clixml ($using:Path + "GetClusterResourceParameters.XML") } - catch { Show-Warning("Unable to get Cluster Resource Parameters. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Unable to get Cluster Resource Parameters. `nError="+$_.Exception.Message) + } } $JobStatic += start-job -Name ClusterSharedVolume { @@ -1928,7 +1933,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterSharedVolume -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterSharedVolume.XML") } - catch { Show-Warning("Unable to get Cluster Shared Volumes. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Unable to get Cluster Shared Volumes. `nError="+$_.Exception.Message) + } } @@ -1939,7 +1945,8 @@ function Get-SddcDiagnosticInfo $o = Get-NetIntentStatus -ClusterName $using:AccessNode $o | Export-Clixml ($using:Path + "GetNetIntentStatus.XML") } - catch { Show-Warning("Unable to get NetIntentStatus. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Unable to get NetIntentStatus. `nError="+$_.Exception.Message) + } } $JobStatic += start-job -Name NetIntentStatusGlobalOverrides { @@ -1947,7 +1954,8 @@ function Get-SddcDiagnosticInfo $o = Get-NetIntentStatus -GlobalOverrides -ClusterName $using:AccessNode $o | Export-Clixml ($using:Path + "GetNetIntentStatusGlobalOverrides.XML") } - catch { Show-Warning("Unable to get NetIntentStatus -GlobalOverrides. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Unable to get NetIntentStatus -GlobalOverrides. `nError="+$_.Exception.Message) + } } $JobStatic += start-job -Name NetIntent { @@ -1955,22 +1963,25 @@ function Get-SddcDiagnosticInfo $o = Get-NetIntent -ClusterName $using:AccessNode $o | Export-Clixml ($using:Path + "GetNetIntent.XML") } - catch { Show-Warning("Unable to get NetIntent. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Unable to get NetIntent. `nError="+$_.Exception.Message) + } } $JobStatic += start-job -Name GetClusterFaultDomain { try { - $o = Get-ClusterFaultDomain | ft + $o = Get-ClusterFaultDomain | select name,type,parentname,childrennames,location $o | Export-Clixml ($using:Path + "GetClusterFaultDomain.XML") } - catch { Show-Warning("Unable to get ClusterFaultDomain. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Unable to get ClusterFaultDomain. `nError="+$_.Exception.Message) + } } $JobStatic += start-job -Name NetIntentGlobalOverrides { try { $o = Get-NetIntent -GlobalOverrides -ClusterName $using:AccessNode $o | Export-Clixml ($using:Path + "GetNetIntentGlobalOverrides.XML") } - catch { Show-Warning("Unable to get NetIntent -GlobalOverrides. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Unable to get NetIntent -GlobalOverrides. `nError="+$_.Exception.Message) + } } } else { Show-Update "... Skip gather of cluster configuration since cluster is not available" @@ -1984,7 +1995,8 @@ function Get-SddcDiagnosticInfo try { Get-Clusterlog -ExportClusterPerformanceHistory -Destination $using:Path -PerformanceHistoryTimeFrame $using:PerformanceHistoryTimeFrame -Node $using:ClusterNodes.Name } - catch { Show-Warning("Could not get ClusterPerformanceHistory. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Could not get ClusterPerformanceHistory. `nError="+$_.Exception.Message) + } } } @@ -1996,7 +2008,8 @@ function Get-SddcDiagnosticInfo $JobStatic += start-job -Name "Driver Information: $node" { try { $o = Get-CimInstance -ClassName Win32_PnPSignedDriver -ComputerName $using:node } - catch { Show-Error("Unable to get Drivers on $using:node. `nError="+$_.Exception.Message) } + catch { #Show-Error("Unable to get Drivers on $using:node. `nError="+$_.Exception.Message) + } $o | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "GetDrivers.XML") } } @@ -2425,12 +2438,15 @@ function Get-SddcDiagnosticInfo $myjob.Name=$myjob.Name+":JOBDONE" $myjob.Dispose() } - $nodejobs | fl * | Out-File -FilePath (Join-Path $LocalNodeDir "NodeJobsStatus.txt") + $nodejobs | fl * | Out-File -FilePath (Join-Path $LocalNodeDir "GetNodeJobsStatus.txt") } while ($nodejobs.State -contains "Running") - Foreach ($myjob in ($nodejobs | State -ne "Completed")) { - Show-Warning "'$myjob' failed for node $Node ($(Receive-Job $myjob))" + $FailedJobs=@() + Foreach ($myjob in ($nodejobs | ? State -ne "Completed")) { + $FailedJobs+=$myjob + #Show-Warning "'$myjob' failed for node $Node ($(Receive-Job $myjob))" } + $FailedJobs | fl * | Out-File -FilePath (Join-Path $LocalNodeDir "GetNodeJobsStatus.txt") $nodejobs | Remove-Job } } @@ -2835,33 +2851,23 @@ function Get-SddcDiagnosticInfo } catch { Show-Warning "Gathering S2D connectivity failed" } - - Show-Update "AzureStack HCI info" - #Added by JG - try { - If ((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){ - Get-AzureStackHCI| Export-Clixml ($Path + "GetAzureStackHCI.xml") - Get-AzureStackHCIArcIntegration| Export-Clixml ($Path + "AzureStackHCIArcIntegration.xml") - } - } catch { - Show-Warning("Unable to get AzureStack HCI info. `nError="+$_.Exception.Message) - } - - - Show-Update "Start gather of Cluster Performance information..." - #Added by JG + Show-Update "Cluster Performance History" + + try { + $JobStatic += start-job -Name "Cluster Performance History" { + #Added by JG #try { - Show-Update " Gathering Sample 1: CPU, I see you!" + #Show-Update " Gathering Sample 1: CPU, I see you!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-1-cpu-i-see-you $Output ="" $Output = $ClusterNodes | ForEach-Object { $_ | Get-ClusterPerf -ClusterNodeSeriesName "ClusterNode.Cpu.Usage" -TimeFrame "LastWeek" -ErrorAction SilentlyContinue } - $Output | Sort-Object ClusterNode | Export-Clixml ($Path + "CPUIseeyou.xml") + $Output | Sort-Object ClusterNode | Export-Clixml ($using:Path + "CPUIseeyou.xml") #}catch { Show-Warning("Unable to get CPU, I see you Data. `nError="+$_.Exception.Message) } try { - Show-Update " Gathering Sample 2: Fire, fire, latency outlier" + #Show-Update " Gathering Sample 2: Fire, fire, latency outlier" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-2-fire-fire-latency-outlier $Cluster = Get-cluster @@ -2940,10 +2946,11 @@ function Get-SddcDiagnosticInfo $Output } - $o | Sort-Object PsComputerName | Export-Clixml ($Path + "latencyoutlier.xml") - } catch { Show-Warning("Unable to get latency outlier Data. `nError="+$_.Exception.Message) } + $o | Sort-Object PsComputerName | Export-Clixml ($using:Path + "latencyoutlier.xml") + } catch { #Show-Warning("Unable to get latency outlier Data. `nError="+$_.Exception.Message) + } try { - Show-Update " Gathering Sample 3: Noisy neighbor? That's write!" + #Show-Update " Gathering Sample 3: Noisy neighbor? That's write!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-3-noisy-neighbor-thats-write $Cluster = Get-cluster $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue @@ -2977,10 +2984,11 @@ function Get-SddcDiagnosticInfo $o | Sort-Object RawIopsTotal -Descending | Select-Object -First 10 | Export-Clixml ($Path + "Noisyneighbor.xml") } - catch { Show-Warning("Unable to get Noisy neighbor Data. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Unable to get Noisy neighbor Data. `nError="+$_.Exception.Message) + } try { - Show-Update " Gathering Sample 4: As they say, 25-gig is the new 10-gig" + #Show-Update " Gathering Sample 4: As they say, 25-gig is the new 10-gig" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-4-as-they-say-25-gig-is-the-new-10-gig $Cluster = Get-cluster $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue @@ -3030,18 +3038,20 @@ function Get-SddcDiagnosticInfo } } - $o | Sort-Object PsComputerName, InterfaceDescription | Export-Clixml ($Path + "25gigisthenew10gig.xml") + $o | Sort-Object PsComputerName, InterfaceDescription | Export-Clixml ($using:Path + "25gigisthenew10gig.xml") } - catch { Show-Warning("Unable to get 25gigisthenew10gig Data. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Unable to get 25gigisthenew10gig Data. `nError="+$_.Exception.Message) + } try { - Show-Update " Gathering Sample 5: Make storage trendy again!" + #Show-Update " Gathering Sample 5: Make storage trendy again!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-6-memory-hog-you-can-run-but-you-cant-hide - Get-Volume | Where-Object FileSystem -Like "*CSV*" | %{$_ | Get-ClusterPerf -VolumeSeriesName "Volume.Size.Available" -TimeFrame "LastYear" | Sort-Object Time | Select-Object -Last 14} | Sort-Object ClusterNode | Export-Clixml ($Path + "trendyagain.xml") - }catch { Show-Warning("Unable to get Make storage trendy again! Data. `nError="+$_.Exception.Message) } + Get-Volume | Where-Object FileSystem -Like "*CSV*" | %{$_ | Get-ClusterPerf -VolumeSeriesName "Volume.Size.Available" -TimeFrame "LastYear" | Sort-Object Time | Select-Object -Last 14} | Sort-Object ClusterNode | Export-Clixml ($using:Path + "trendyagain.xml") + }catch { #Show-Warning("Unable to get Make storage trendy again! Data. `nError="+$_.Exception.Message) + } try { - Show-Update " Gathering Sample 6: Memory hog, you can run but you can't hide" + #Show-Update " Gathering Sample 6: Memory hog, you can run but you can't hide" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-6-memory-hog-you-can-run-but-you-cant-hide $Output = Invoke-Command (Get-ClusterNode).Name { Function Format-Bytes { @@ -3066,10 +3076,31 @@ function Get-SddcDiagnosticInfo } } } - $Output | Sort-Object RawAvgMemoryUsage -Descending | Select-Object -First 10 | Export-Clixml ($Path + "Memoryhog.xml") - }catch { Show-Warning("Unable to get Memory hog Data. `nError="+$_.Exception.Message) } + $Output | Sort-Object RawAvgMemoryUsage -Descending | Select-Object -First 10 | Export-Clixml ($using:Path + "Memoryhog.xml") + }catch { #Show-Warning("Unable to get Memory hog Data. `nError="+$_.Exception.Message) + } + } + - } + } catch { + Show-Warning "Gathering Cluster Performance History failed" + } + } + Show-Update "AzureStack HCI info" + #Added by JG + try { + If ((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){ + Get-AzureStackHCI| Export-Clixml ($Path + "GetAzureStackHCI.xml") + Get-AzureStackHCIArcIntegration| Export-Clixml ($Path + "AzureStackHCIArcIntegration.xml") + } + } catch { + Show-Warning("Unable to get AzureStack HCI info. `nError="+$_.Exception.Message) + } + + + Show-Update "Start gather of Cluster Performance information..." + + #### # Now receive the jobs requiring remote copyout From c12823a6db796c29345f34444b761278f9e528de Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 1 Sep 2023 14:34:32 -0500 Subject: [PATCH 076/127] Minor update --- .../PrivateCloud.DiagnosticInfo.psm1 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 5ab4545..71eb38a 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2851,10 +2851,10 @@ function Get-SddcDiagnosticInfo } catch { Show-Warning "Gathering S2D connectivity failed" } - Show-Update "Cluster Performance History" + Show-Update "Cluster Advanced Performance History" try { - $JobStatic += start-job -Name "Cluster Performance History" { + $JobStatic += start-job -Name "Cluster Advanced Performance History" { #Added by JG #try { #Show-Update " Gathering Sample 1: CPU, I see you!" @@ -3137,9 +3137,10 @@ function Get-SddcDiagnosticInfo Show-Update "Completing background gathers ..." -ForegroundColor Green Show-WaitChildJob $JobStatic 30 - Receive-Job $JobStatic + $JobStatic | ? Name -ne "Cluster Advanced Performance History" | Receive-Job Remove-Job $JobStatic + if (Get-Member -InputObject $JobStatic ActiveSessions) { Remove-PSSession -Id $JobStatic.ActiveSessions From 383a6bf15aa9fc1e6e7e94c7a759ef906dd73e49 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 1 Sep 2023 15:43:32 -0500 Subject: [PATCH 077/127] Marvell and ClusterFaultDomain --- .../PrivateCloud.DiagnosticInfo.psm1 | 184 ++++++------------ 1 file changed, 64 insertions(+), 120 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 71eb38a..87a7439 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1,4 +1,4 @@ -<################################################### +<################################################### # # # Copyright (c) Microsoft. All rights reserved. # # # @@ -392,10 +392,8 @@ $CommonFuncBlock = { $tepl = (Get-Date) if ($QTime) { wevtutil epl $p.LogName $EventFile /q:$QTime /ow:true - #wevtutil epl $p.LogName $EventFile.Replace(".EVTX",".XML") /q:$QTime /ow:true } else { wevtutil epl $p.LogName $EventFile /ow:true - #wevtutil epl $p.LogName $EventFile.Replace(".EVTX",".XML") /ow:true } $tepl = (Get-Date) - $tepl @@ -1887,8 +1885,7 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterGroup -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterGroup.XML") } - catch { #Show-Warning("Unable to get Cluster Groups. `nError="+$_.Exception.Message) - } + catch { Show-Warning("Unable to get Cluster Groups. `nError="+$_.Exception.Message) } } $JobStatic += start-job -Name ClusterNetwork { @@ -1896,8 +1893,7 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterNetwork -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterNetwork.XML") } - catch { #Show-Warning("Could not get Cluster Nodes. `nError="+$_.Exception.Message) - } + catch { Show-Warning("Could not get Cluster Nodes. `nError="+$_.Exception.Message) } } $JobStatic += start-job -Name ClusterNetworkLiveMigrationInformation { @@ -1905,8 +1901,7 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterResourceType -Name 'Virtual Machine' -Cluster $using:AccessNode | Get-ClusterParameter $o | Export-Clixml ($using:Path + "ClusterNetworkLiveMigration.XML") } - catch { #Show-Warning("Could not get Cluster Network Live Migration Information. `nError="+$_.Exception.Message) - } + catch { Show-Warning("Could not get Cluster Network Live Migration Information. `nError="+$_.Exception.Message) } } $JobStatic += start-job -Name ClusterResource { @@ -1914,8 +1909,7 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterResource -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterResource.XML") } - catch { #Show-Warning("Unable to get Cluster Resources. `nError="+$_.Exception.Message) - } + catch { Show-Warning("Unable to get Cluster Resources. `nError="+$_.Exception.Message) } } @@ -1924,8 +1918,7 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterResource -Cluster $using:AccessNode | Get-ClusterParameter $o | Export-Clixml ($using:Path + "GetClusterResourceParameters.XML") } - catch { #Show-Warning("Unable to get Cluster Resource Parameters. `nError="+$_.Exception.Message) - } + catch { Show-Warning("Unable to get Cluster Resource Parameters. `nError="+$_.Exception.Message) } } $JobStatic += start-job -Name ClusterSharedVolume { @@ -1933,8 +1926,7 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterSharedVolume -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterSharedVolume.XML") } - catch { #Show-Warning("Unable to get Cluster Shared Volumes. `nError="+$_.Exception.Message) - } + catch { Show-Warning("Unable to get Cluster Shared Volumes. `nError="+$_.Exception.Message) } } @@ -1945,17 +1937,23 @@ function Get-SddcDiagnosticInfo $o = Get-NetIntentStatus -ClusterName $using:AccessNode $o | Export-Clixml ($using:Path + "GetNetIntentStatus.XML") } - catch { #Show-Warning("Unable to get NetIntentStatus. `nError="+$_.Exception.Message) - } + catch { Show-Warning("Unable to get NetIntentStatus. `nError="+$_.Exception.Message) } } + $JobStatic += start-job -Name GetClusterFaultDomain { + try { + $o = Get-ClusterFaultDomain | select name,type,parentname,childrennames,location + $o | Export-Clixml ($using:Path + "GetClusterFaultDomain.XML") + } + catch { #Show-Warning("Unable to get ClusterFaultDomain. `nError="+$_.Exception.Message) + } + } $JobStatic += start-job -Name NetIntentStatusGlobalOverrides { try { $o = Get-NetIntentStatus -GlobalOverrides -ClusterName $using:AccessNode $o | Export-Clixml ($using:Path + "GetNetIntentStatusGlobalOverrides.XML") } - catch { #Show-Warning("Unable to get NetIntentStatus -GlobalOverrides. `nError="+$_.Exception.Message) - } + catch { Show-Warning("Unable to get NetIntentStatus -GlobalOverrides. `nError="+$_.Exception.Message) } } $JobStatic += start-job -Name NetIntent { @@ -1963,25 +1961,15 @@ function Get-SddcDiagnosticInfo $o = Get-NetIntent -ClusterName $using:AccessNode $o | Export-Clixml ($using:Path + "GetNetIntent.XML") } - catch { #Show-Warning("Unable to get NetIntent. `nError="+$_.Exception.Message) - } + catch { Show-Warning("Unable to get NetIntent. `nError="+$_.Exception.Message) } } - $JobStatic += start-job -Name GetClusterFaultDomain { - try { - $o = Get-ClusterFaultDomain | select name,type,parentname,childrennames,location - $o | Export-Clixml ($using:Path + "GetClusterFaultDomain.XML") - } - catch { #Show-Warning("Unable to get ClusterFaultDomain. `nError="+$_.Exception.Message) - } - } $JobStatic += start-job -Name NetIntentGlobalOverrides { try { $o = Get-NetIntent -GlobalOverrides -ClusterName $using:AccessNode $o | Export-Clixml ($using:Path + "GetNetIntentGlobalOverrides.XML") } - catch { #Show-Warning("Unable to get NetIntent -GlobalOverrides. `nError="+$_.Exception.Message) - } + catch { Show-Warning("Unable to get NetIntent -GlobalOverrides. `nError="+$_.Exception.Message) } } } else { Show-Update "... Skip gather of cluster configuration since cluster is not available" @@ -1995,8 +1983,7 @@ function Get-SddcDiagnosticInfo try { Get-Clusterlog -ExportClusterPerformanceHistory -Destination $using:Path -PerformanceHistoryTimeFrame $using:PerformanceHistoryTimeFrame -Node $using:ClusterNodes.Name } - catch { #Show-Warning("Could not get ClusterPerformanceHistory. `nError="+$_.Exception.Message) - } + catch { Show-Warning("Could not get ClusterPerformanceHistory. `nError="+$_.Exception.Message) } } } @@ -2008,8 +1995,7 @@ function Get-SddcDiagnosticInfo $JobStatic += start-job -Name "Driver Information: $node" { try { $o = Get-CimInstance -ClassName Win32_PnPSignedDriver -ComputerName $using:node } - catch { #Show-Error("Unable to get Drivers on $using:node. `nError="+$_.Exception.Message) - } + catch { Show-Error("Unable to get Drivers on $using:node. `nError="+$_.Exception.Message) } $o | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "GetDrivers.XML") } } @@ -2236,13 +2222,11 @@ function Get-SddcDiagnosticInfo # # Gather SYSTEMINFO.EXE output for a given node $SysInfoOut=(Join-Path (Get-NodePath $using:Path $using:NodeName) "SystemInfo.TXT") - Start-Process -FilePath "$env:comspec" -ArgumentList "/c SystemInfo.exe /S $using:NodeName > $SysInfoOut" -WindowStyle Hidden # -Wait + Start-Process -FilePath "$env:comspec" -ArgumentList "/c SystemInfo.exe /S $using:NodeName > $SysInfoOut" -WindowStyle Hidden -Wait # Gather MSINFO32.EXE output for a given node #$MSINFO32Out=(Join-Path (Get-NodePath $using:Path $using:NodeName) "MSINFO32.NFO") #Start-Process -FilePath "$env:comspec" -ArgumentList "/c MSINFO32.exe /nfo $MSINFO32Out /Computer $using:NodeName" -WindowStyle Hidden -Wait - $LocalFileMsInfo = (Join-Path $LocalNodeDir "\msinfo.nfo") - Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer $using:NodeName /nfo $LocalFileMsInfo" # -Wait # Cmdlets to drop in TXT and XML forms # @@ -2302,7 +2286,6 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Echo Get-ProcessByService;$aps=GPs;$r=@();$Ass=GWmi Win32_Service;foreach($p in $aps){$ss=$Ass|?{$_.ProcessID -eq $p.Id};IF($ss){$r+=[PSCustomObject]@{Service=$ss.DisplayName;ProcessName=$p.ProcessName;ProcessID=$p.Id}}}$r}', 'Get-NetNeighbor -CimSession _C_', 'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' - #[System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::GetComputerSite() # These commands are specific to optional modules, add only if present # - DcbQos: RoCE environments primarily @@ -2336,7 +2319,6 @@ function Get-SddcDiagnosticInfo $CmdsToLog += "Get-AzureStackHCIArcIntegration" } - $nodejobs=@() foreach ($cmd in $CmdsToLog) { # truncate cmd string to the cmd itself @@ -2344,20 +2326,20 @@ function Get-SddcDiagnosticInfo try { $cmdex = $cmd -replace '_C_',$using:NodeName -replace '_N_',$using:NodeName -replace '_A_',$using:AccessNode - $cmdsb = [scriptblock]::Create("$cmdex") - $nodejobs+=Start-Job -Name $LocalFile -ScriptBlock $cmdsb - #$out = Invoke-Expression $cmdex + $out = Invoke-Expression $cmdex # capture as txt and xml for quick analysis according to taste - #$out | ft -AutoSize | Out-File -Width 9999 -Encoding ascii -FilePath "$LocalFile.txt" - #$out | Export-Clixml -Path "$LocalFile.xml" + $out | ft -AutoSize | Out-File -Width 9999 -Encoding ascii -FilePath "$LocalFile.txt" + $out | Export-Clixml -Path "$LocalFile.xml" - } catch {} + } catch { + Show-Warning "'$cmdex' failed for node $Node ($($_.Exception.Message))" + } } - - #Add MSInfo32 + $LocalFile = (Join-Path $LocalNodeDir "\msinfo.nfo") + Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer $using:NodeName /nfo $LocalFile" -Wait $NodeSystemRootPath = Invoke-Command -ComputerName $using:NodeName -ConfigurationName $using:SessionConfigurationName { $env:SystemRoot } @@ -2426,28 +2408,6 @@ function Get-SddcDiagnosticInfo catch { Show-Warning "Could not copy report file $($_.FullName)" } } } - Do { - Sleep 1 - Foreach ($myjob in ($nodejobs | ? Name -notmatch "JOBDONE" | ? State -eq "Completed")) { - $LocalFile=$myJob.Name - $out = Receive-Job $myjob - - # capture as txt and xml for quick analysis according to taste - $out | ft -AutoSize | Out-File -Width 9999 -Encoding ascii -FilePath "$LocalFile.txt" - $out | Export-Clixml -Path "$LocalFile.xml" - $myjob.Name=$myjob.Name+":JOBDONE" - $myjob.Dispose() - } - $nodejobs | fl * | Out-File -FilePath (Join-Path $LocalNodeDir "GetNodeJobsStatus.txt") - - } while ($nodejobs.State -contains "Running") - $FailedJobs=@() - Foreach ($myjob in ($nodejobs | ? State -ne "Completed")) { - $FailedJobs+=$myjob - #Show-Warning "'$myjob' failed for node $Node ($(Receive-Job $myjob))" - } - $FailedJobs | fl * | Out-File -FilePath (Join-Path $LocalNodeDir "GetNodeJobsStatus.txt") - $nodejobs | Remove-Job } } @@ -2851,23 +2811,33 @@ function Get-SddcDiagnosticInfo } catch { Show-Warning "Gathering S2D connectivity failed" } - Show-Update "Cluster Advanced Performance History" - - try { - $JobStatic += start-job -Name "Cluster Advanced Performance History" { - #Added by JG + + Show-Update "AzureStack HCI info" + #Added by JG + try { + If ((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){ + Get-AzureStackHCI| Export-Clixml ($Path + "GetAzureStackHCI.xml") + Get-AzureStackHCIArcIntegration| Export-Clixml ($Path + "AzureStackHCIArcIntegration.xml") + } + } catch { + Show-Warning("Unable to get AzureStack HCI info. `nError="+$_.Exception.Message) + } + + + Show-Update "Start gather of Cluster Performance information..." + #Added by JG #try { - #Show-Update " Gathering Sample 1: CPU, I see you!" + Show-Update " Gathering Sample 1: CPU, I see you!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-1-cpu-i-see-you $Output ="" $Output = $ClusterNodes | ForEach-Object { $_ | Get-ClusterPerf -ClusterNodeSeriesName "ClusterNode.Cpu.Usage" -TimeFrame "LastWeek" -ErrorAction SilentlyContinue } - $Output | Sort-Object ClusterNode | Export-Clixml ($using:Path + "CPUIseeyou.xml") + $Output | Sort-Object ClusterNode | Export-Clixml ($Path + "CPUIseeyou.xml") #}catch { Show-Warning("Unable to get CPU, I see you Data. `nError="+$_.Exception.Message) } try { - #Show-Update " Gathering Sample 2: Fire, fire, latency outlier" + Show-Update " Gathering Sample 2: Fire, fire, latency outlier" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-2-fire-fire-latency-outlier $Cluster = Get-cluster @@ -2946,11 +2916,10 @@ function Get-SddcDiagnosticInfo $Output } - $o | Sort-Object PsComputerName | Export-Clixml ($using:Path + "latencyoutlier.xml") - } catch { #Show-Warning("Unable to get latency outlier Data. `nError="+$_.Exception.Message) - } + $o | Sort-Object PsComputerName | Export-Clixml ($Path + "latencyoutlier.xml") + } catch { Show-Warning("Unable to get latency outlier Data. `nError="+$_.Exception.Message) } try { - #Show-Update " Gathering Sample 3: Noisy neighbor? That's write!" + Show-Update " Gathering Sample 3: Noisy neighbor? That's write!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-3-noisy-neighbor-thats-write $Cluster = Get-cluster $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue @@ -2984,11 +2953,10 @@ function Get-SddcDiagnosticInfo $o | Sort-Object RawIopsTotal -Descending | Select-Object -First 10 | Export-Clixml ($Path + "Noisyneighbor.xml") } - catch { #Show-Warning("Unable to get Noisy neighbor Data. `nError="+$_.Exception.Message) - } + catch { Show-Warning("Unable to get Noisy neighbor Data. `nError="+$_.Exception.Message) } try { - #Show-Update " Gathering Sample 4: As they say, 25-gig is the new 10-gig" + Show-Update " Gathering Sample 4: As they say, 25-gig is the new 10-gig" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-4-as-they-say-25-gig-is-the-new-10-gig $Cluster = Get-cluster $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue @@ -3038,20 +3006,18 @@ function Get-SddcDiagnosticInfo } } - $o | Sort-Object PsComputerName, InterfaceDescription | Export-Clixml ($using:Path + "25gigisthenew10gig.xml") + $o | Sort-Object PsComputerName, InterfaceDescription | Export-Clixml ($Path + "25gigisthenew10gig.xml") } - catch { #Show-Warning("Unable to get 25gigisthenew10gig Data. `nError="+$_.Exception.Message) - } + catch { Show-Warning("Unable to get 25gigisthenew10gig Data. `nError="+$_.Exception.Message) } try { - #Show-Update " Gathering Sample 5: Make storage trendy again!" + Show-Update " Gathering Sample 5: Make storage trendy again!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-6-memory-hog-you-can-run-but-you-cant-hide - Get-Volume | Where-Object FileSystem -Like "*CSV*" | %{$_ | Get-ClusterPerf -VolumeSeriesName "Volume.Size.Available" -TimeFrame "LastYear" | Sort-Object Time | Select-Object -Last 14} | Sort-Object ClusterNode | Export-Clixml ($using:Path + "trendyagain.xml") - }catch { #Show-Warning("Unable to get Make storage trendy again! Data. `nError="+$_.Exception.Message) - } + Get-Volume | Where-Object FileSystem -Like "*CSV*" | %{$_ | Get-ClusterPerf -VolumeSeriesName "Volume.Size.Available" -TimeFrame "LastYear" | Sort-Object Time | Select-Object -Last 14} | Sort-Object ClusterNode | Export-Clixml ($Path + "trendyagain.xml") + }catch { Show-Warning("Unable to get Make storage trendy again! Data. `nError="+$_.Exception.Message) } try { - #Show-Update " Gathering Sample 6: Memory hog, you can run but you can't hide" + Show-Update " Gathering Sample 6: Memory hog, you can run but you can't hide" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-6-memory-hog-you-can-run-but-you-cant-hide $Output = Invoke-Command (Get-ClusterNode).Name { Function Format-Bytes { @@ -3076,31 +3042,10 @@ function Get-SddcDiagnosticInfo } } } - $Output | Sort-Object RawAvgMemoryUsage -Descending | Select-Object -First 10 | Export-Clixml ($using:Path + "Memoryhog.xml") - }catch { #Show-Warning("Unable to get Memory hog Data. `nError="+$_.Exception.Message) - } - } - + $Output | Sort-Object RawAvgMemoryUsage -Descending | Select-Object -First 10 | Export-Clixml ($Path + "Memoryhog.xml") + }catch { Show-Warning("Unable to get Memory hog Data. `nError="+$_.Exception.Message) } - } catch { - Show-Warning "Gathering Cluster Performance History failed" - } - } - Show-Update "AzureStack HCI info" - #Added by JG - try { - If ((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){ - Get-AzureStackHCI| Export-Clixml ($Path + "GetAzureStackHCI.xml") - Get-AzureStackHCIArcIntegration| Export-Clixml ($Path + "AzureStackHCIArcIntegration.xml") - } - } catch { - Show-Warning("Unable to get AzureStack HCI info. `nError="+$_.Exception.Message) - } - - - Show-Update "Start gather of Cluster Performance information..." - - + } #### # Now receive the jobs requiring remote copyout @@ -3137,10 +3082,9 @@ function Get-SddcDiagnosticInfo Show-Update "Completing background gathers ..." -ForegroundColor Green Show-WaitChildJob $JobStatic 30 - $JobStatic | ? Name -ne "Cluster Advanced Performance History" | Receive-Job + Receive-Job $JobStatic Remove-Job $JobStatic - if (Get-Member -InputObject $JobStatic ActiveSessions) { Remove-PSSession -Id $JobStatic.ActiveSessions @@ -6520,4 +6464,4 @@ Export-ModuleMember -Alias * -Function 'Get-SddcDiagnosticInfo', 'Show-StorageCounters', 'Get-SpacesTimeline', 'Set-SddcDiagnosticArchiveJobParameters', - 'Get-SddcDiagnosticArchiveJobParameters' + 'Get-SddcDiagnosticArchiveJobParameters' \ No newline at end of file From 2079352c2fabd63f7841fb675ce0d5f29b8f2a12 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Wed, 6 Sep 2023 09:14:54 -0500 Subject: [PATCH 078/127] Update PrivateCloud.DiagnosticInfo.psd1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 594d9ee..94d658b 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.99.1' +ModuleVersion = '1.3355.0' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' From 7d8c32df0cd65a647bbde9a710c7c0b7fd314c69 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:23:22 -0500 Subject: [PATCH 079/127] Update 1 Fix NetworkATC warnings --- .../PrivateCloud.DiagnosticInfo.psm1 | 92 +++++++++---------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 87a7439..fb31b47 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1885,7 +1885,7 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterGroup -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterGroup.XML") } - catch { Show-Warning("Unable to get Cluster Groups. `nError="+$_.Exception.Message) } + catch { Write-Warning "Unable to get Cluster Groups. `nError=$($_.Exception.Message)" } } $JobStatic += start-job -Name ClusterNetwork { @@ -1893,7 +1893,7 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterNetwork -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterNetwork.XML") } - catch { Show-Warning("Could not get Cluster Nodes. `nError="+$_.Exception.Message) } + catch { Write-Warning "Could not get Cluster Nodes. `nError=$($_.Exception.Message)" } } $JobStatic += start-job -Name ClusterNetworkLiveMigrationInformation { @@ -1901,7 +1901,7 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterResourceType -Name 'Virtual Machine' -Cluster $using:AccessNode | Get-ClusterParameter $o | Export-Clixml ($using:Path + "ClusterNetworkLiveMigration.XML") } - catch { Show-Warning("Could not get Cluster Network Live Migration Information. `nError="+$_.Exception.Message) } + catch { Write-Warning "Could not get Cluster Network Live Migration Information. `nError=$($_.Exception.Message)" } } $JobStatic += start-job -Name ClusterResource { @@ -1909,7 +1909,7 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterResource -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterResource.XML") } - catch { Show-Warning("Unable to get Cluster Resources. `nError="+$_.Exception.Message) } + catch { Write-Warning "Unable to get Cluster Resources. `nError=$($_.Exception.Message)" } } @@ -1918,7 +1918,7 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterResource -Cluster $using:AccessNode | Get-ClusterParameter $o | Export-Clixml ($using:Path + "GetClusterResourceParameters.XML") } - catch { Show-Warning("Unable to get Cluster Resource Parameters. `nError="+$_.Exception.Message) } + catch { Write-Warning "Unable to get Cluster Resource Parameters. `nError=$($_.Exception.Message)" } } $JobStatic += start-job -Name ClusterSharedVolume { @@ -1926,18 +1926,7 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterSharedVolume -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterSharedVolume.XML") } - catch { Show-Warning("Unable to get Cluster Shared Volumes. `nError="+$_.Exception.Message) } - - } - - Show-Update "Start gather of Network ATC information..." - - $JobStatic += start-job -Name NetIntentStatus { - try { - $o = Get-NetIntentStatus -ClusterName $using:AccessNode - $o | Export-Clixml ($using:Path + "GetNetIntentStatus.XML") - } - catch { Show-Warning("Unable to get NetIntentStatus. `nError="+$_.Exception.Message) } + catch { Write-Warning "Unable to get Cluster Shared Volumes. `nError=$($_.Exception.Message)" } } $JobStatic += start-job -Name GetClusterFaultDomain { @@ -1945,36 +1934,47 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterFaultDomain | select name,type,parentname,childrennames,location $o | Export-Clixml ($using:Path + "GetClusterFaultDomain.XML") } - catch { #Show-Warning("Unable to get ClusterFaultDomain. `nError="+$_.Exception.Message) - } + catch { Write-Warning "Unable to get ClusterFaultDomain. `nError=$($_.Exception.Message)" } } - $JobStatic += start-job -Name NetIntentStatusGlobalOverrides { - try { - $o = Get-NetIntentStatus -GlobalOverrides -ClusterName $using:AccessNode - $o | Export-Clixml ($using:Path + "GetNetIntentStatusGlobalOverrides.XML") - } - catch { Show-Warning("Unable to get NetIntentStatus -GlobalOverrides. `nError="+$_.Exception.Message) } - - } - $JobStatic += start-job -Name NetIntent { - try { - $o = Get-NetIntent -ClusterName $using:AccessNode - $o | Export-Clixml ($using:Path + "GetNetIntent.XML") - } - catch { Show-Warning("Unable to get NetIntent. `nError="+$_.Exception.Message) } - - } - $JobStatic += start-job -Name NetIntentGlobalOverrides { - try { - $o = Get-NetIntent -GlobalOverrides -ClusterName $using:AccessNode - $o | Export-Clixml ($using:Path + "GetNetIntentGlobalOverrides.XML") - } - catch { Show-Warning("Unable to get NetIntent -GlobalOverrides. `nError="+$_.Exception.Message) } - } - } else { + + if ((Get-WindowsFeature NetworkATC).installed) { + Show-Update "Start gather of Network ATC information..." + + $JobStatic += start-job -Name NetIntentStatus { + try { + $o = Get-NetIntentStatus -ClusterName $using:AccessNode + $o | Export-Clixml ($using:Path + "GetNetIntentStatus.XML") + } + catch { Write-Warning "Unable to get NetIntentStatus. `nError=$($_.Exception.Message)" } + + } + $JobStatic += start-job -Name NetIntentStatusGlobalOverrides { + try { + $o = Get-NetIntentStatus -GlobalOverrides -ClusterName $using:AccessNode + $o | Export-Clixml ($using:Path + "GetNetIntentStatusGlobalOverrides.XML") + } + catch { Write-Warning "Unable to get NetIntentStatus -GlobalOverrides. `nError=$($_.Exception.Message)" } + + } + $JobStatic += start-job -Name NetIntent { + try { + $o = Get-NetIntent -ClusterName $using:AccessNode + $o | Export-Clixml ($using:Path + "GetNetIntent.XML") + } + catch { Write-Warning "Unable to get NetIntent. `nError=$($_.Exception.Message)" } + + } + $JobStatic += start-job -Name NetIntentGlobalOverrides { + try { + $o = Get-NetIntent -GlobalOverrides -ClusterName $using:AccessNode + $o | Export-Clixml ($using:Path + "GetNetIntentGlobalOverrides.XML") + } + catch { Write-Warning "Unable to get NetIntent -GlobalOverrides. `nError=$($_.Exception.Message)" } + } + }} else { Show-Update "... Skip gather of cluster configuration since cluster is not available" } - + if ($IncludeClusterPerformanceHistory) { Show-Update "Starting ClusterPerformanceHistory log collection ..." @@ -1983,7 +1983,7 @@ function Get-SddcDiagnosticInfo try { Get-Clusterlog -ExportClusterPerformanceHistory -Destination $using:Path -PerformanceHistoryTimeFrame $using:PerformanceHistoryTimeFrame -Node $using:ClusterNodes.Name } - catch { Show-Warning("Could not get ClusterPerformanceHistory. `nError="+$_.Exception.Message) } + catch { Write-Warning "Could not get ClusterPerformanceHistory. `nError=$($_.Exception.Message)" } } } @@ -1995,7 +1995,7 @@ function Get-SddcDiagnosticInfo $JobStatic += start-job -Name "Driver Information: $node" { try { $o = Get-CimInstance -ClassName Win32_PnPSignedDriver -ComputerName $using:node } - catch { Show-Error("Unable to get Drivers on $using:node. `nError="+$_.Exception.Message) } + catch { Write-Error "Unable to get Drivers on $using:node. `nError=$($_.Exception.Message)" } $o | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "GetDrivers.XML") } } From ef1a9dce3c3b5100c180058bb46829e7512e0843 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 15 Sep 2023 10:10:46 -0500 Subject: [PATCH 080/127] Fix NetworkATC missing --- .../PrivateCloud.DiagnosticInfo.psd1 | 2 +- .../PrivateCloud.DiagnosticInfo.psm1 | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 94d658b..43a2813 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.0' +ModuleVersion = '1.3355.1' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index fb31b47..81fff80 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1936,8 +1936,9 @@ function Get-SddcDiagnosticInfo } catch { Write-Warning "Unable to get ClusterFaultDomain. `nError=$($_.Exception.Message)" } } - - if ((Get-WindowsFeature NetworkATC).installed) { + $NetworkATC=$False + $NetworkATC=try {(Get-WindowsFeature NetworkATC).installed} catch {$False} + if ($NetworkATC) { Show-Update "Start gather of Network ATC information..." $JobStatic += start-job -Name NetIntentStatus { @@ -3235,7 +3236,7 @@ function Get-SddcDiagnosticInfo } else { Show-Update "Get counter sets" - $set = Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk","RDMA*","Mellanox*","Marvell*","Hyper-V Hypervisor Virtual Processor" -ComputerName $ClusterNodes.Name -ErrorAction SilentlyContinue + $set = Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk","RDMA*","Mellanox*","Marvell*","Hyper-V Hypervisor Virtual Processor","Hyper-V Hypervisor Logical Processor","Hyper-V Hypervisor Root Virtual Processor" -ComputerName $ClusterNodes.Name -ErrorAction SilentlyContinue Show-Update "Start monitoring ($($PerfSamples)s)" $PerfRaw = Get-Counter -Counter $set.Paths -SampleInterval 1 -MaxSamples $PerfSamples -ErrorAction Ignore -WarningAction Ignore Show-Update "Exporting counters" From dc11e5446290ad128f68282fe27acdc23119032b Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Tue, 19 Sep 2023 15:27:47 -0500 Subject: [PATCH 081/127] HyperSpeed Update 1.3355.2 Several modules changed to speed up performance. Version 1.3355.2 --- .../PrivateCloud.DiagnosticInfo.psd1 | 2 +- .../PrivateCloud.DiagnosticInfo.psm1 | 325 +++++++++++------- 2 files changed, 209 insertions(+), 118 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 43a2813..3bc6e84 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.1' +ModuleVersion = '1.3355.2' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 81fff80..4967a45 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1,4 +1,4 @@ -<################################################### +<################################################### # # # Copyright (c) Microsoft. All rights reserved. # # # @@ -392,8 +392,10 @@ $CommonFuncBlock = { $tepl = (Get-Date) if ($QTime) { wevtutil epl $p.LogName $EventFile /q:$QTime /ow:true + #wevtutil epl $p.LogName $EventFile.Replace(".EVTX",".XML") /q:$QTime /ow:true } else { wevtutil epl $p.LogName $EventFile /ow:true + #wevtutil epl $p.LogName $EventFile.Replace(".EVTX",".XML") /ow:true } $tepl = (Get-Date) - $tepl @@ -1214,7 +1216,7 @@ function Get-SddcDiagnosticInfo [parameter(ParameterSetName="WriteC", Mandatory=$false)] [parameter(ParameterSetName="WriteN", Mandatory=$false)] [ValidateNotNullOrEmpty()] - [int] $HoursOfEvents = -1, + [int] $HoursOfEvents = 168, [parameter(ParameterSetName="WriteC", Mandatory=$false)] [parameter(ParameterSetName="WriteN", Mandatory=$false)] @@ -1885,7 +1887,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterGroup -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterGroup.XML") } - catch { Write-Warning "Unable to get Cluster Groups. `nError=$($_.Exception.Message)" } + catch { Write-Warning "Unable to get Cluster Groups. `nError="+$_.Exception.Message + } } $JobStatic += start-job -Name ClusterNetwork { @@ -1893,7 +1896,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterNetwork -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterNetwork.XML") } - catch { Write-Warning "Could not get Cluster Nodes. `nError=$($_.Exception.Message)" } + catch { Write-Warning "Could not get Cluster Nodes. `nError="+$_.Exception.Message + } } $JobStatic += start-job -Name ClusterNetworkLiveMigrationInformation { @@ -1901,7 +1905,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterResourceType -Name 'Virtual Machine' -Cluster $using:AccessNode | Get-ClusterParameter $o | Export-Clixml ($using:Path + "ClusterNetworkLiveMigration.XML") } - catch { Write-Warning "Could not get Cluster Network Live Migration Information. `nError=$($_.Exception.Message)" } + catch { Write-Warning "Could not get Cluster Network Live Migration Information. `nError="+$_.Exception.Message + } } $JobStatic += start-job -Name ClusterResource { @@ -1909,7 +1914,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterResource -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterResource.XML") } - catch { Write-Warning "Unable to get Cluster Resources. `nError=$($_.Exception.Message)" } + catch { Write-Warning "Unable to get Cluster Resources. `nError="+$_.Exception.Message + } } @@ -1918,7 +1924,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterResource -Cluster $using:AccessNode | Get-ClusterParameter $o | Export-Clixml ($using:Path + "GetClusterResourceParameters.XML") } - catch { Write-Warning "Unable to get Cluster Resource Parameters. `nError=$($_.Exception.Message)" } + catch { Write-Warning "Unable to get Cluster Resource Parameters. `nError="+$_.Exception.Message + } } $JobStatic += start-job -Name ClusterSharedVolume { @@ -1926,7 +1933,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterSharedVolume -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterSharedVolume.XML") } - catch { Write-Warning "Unable to get Cluster Shared Volumes. `nError=$($_.Exception.Message)" } + catch { Write-Warning "Unable to get Cluster Shared Volumes. `nError="+$_.Exception.Message + } } $JobStatic += start-job -Name GetClusterFaultDomain { @@ -1934,48 +1942,55 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterFaultDomain | select name,type,parentname,childrennames,location $o | Export-Clixml ($using:Path + "GetClusterFaultDomain.XML") } - catch { Write-Warning "Unable to get ClusterFaultDomain. `nError=$($_.Exception.Message)" } + catch { Write-Warning "Unable to get ClusterFaultDomain. `nError="+$_.Exception.Message + } } - $NetworkATC=$False - $NetworkATC=try {(Get-WindowsFeature NetworkATC).installed} catch {$False} - if ($NetworkATC) { - Show-Update "Start gather of Network ATC information..." - $JobStatic += start-job -Name NetIntentStatus { - try { - $o = Get-NetIntentStatus -ClusterName $using:AccessNode - $o | Export-Clixml ($using:Path + "GetNetIntentStatus.XML") - } - catch { Write-Warning "Unable to get NetIntentStatus. `nError=$($_.Exception.Message)" } - - } - $JobStatic += start-job -Name NetIntentStatusGlobalOverrides { - try { - $o = Get-NetIntentStatus -GlobalOverrides -ClusterName $using:AccessNode - $o | Export-Clixml ($using:Path + "GetNetIntentStatusGlobalOverrides.XML") - } - catch { Write-Warning "Unable to get NetIntentStatus -GlobalOverrides. `nError=$($_.Exception.Message)" } - - } - $JobStatic += start-job -Name NetIntent { - try { - $o = Get-NetIntent -ClusterName $using:AccessNode - $o | Export-Clixml ($using:Path + "GetNetIntent.XML") - } - catch { Write-Warning "Unable to get NetIntent. `nError=$($_.Exception.Message)" } - - } - $JobStatic += start-job -Name NetIntentGlobalOverrides { - try { - $o = Get-NetIntent -GlobalOverrides -ClusterName $using:AccessNode - $o | Export-Clixml ($using:Path + "GetNetIntentGlobalOverrides.XML") - } - catch { Write-Warning "Unable to get NetIntent -GlobalOverrides. `nError=$($_.Exception.Message)" } - } - }} else { + Show-Update "Start gather of Network ATC information..." + $NetworkATC=$False + $NetworkATC=try {(Get-WindowsFeature NetworkATC).installed} catch {$False} + if ($NetworkATC) { + + $JobStatic += start-job -Name NetIntentStatus { + try { + $o = Get-NetIntentStatus -ClusterName $using:AccessNode + $o | Export-Clixml ($using:Path + "GetNetIntentStatus.XML") + } + catch { Write-Warning "Unable to get NetIntentStatus. `nError="+$_.Exception.Message + } + + } + $JobStatic += start-job -Name NetIntentStatusGlobalOverrides { + try { + $o = Get-NetIntentStatus -GlobalOverrides -ClusterName $using:AccessNode + $o | Export-Clixml ($using:Path + "GetNetIntentStatusGlobalOverrides.XML") + } + catch { Write-Warning "Unable to get NetIntentStatus -GlobalOverrides. `nError="+$_.Exception.Message + } + + } + $JobStatic += start-job -Name NetIntent { + try { + $o = Get-NetIntent -ClusterName $using:AccessNode + $o | Export-Clixml ($using:Path + "GetNetIntent.XML") + } + catch { Write-Warning "Unable to get NetIntent. `nError="+$_.Exception.Message + } + + } + $JobStatic += start-job -Name NetIntentGlobalOverrides { + try { + $o = Get-NetIntent -GlobalOverrides -ClusterName $using:AccessNode + $o | Export-Clixml ($using:Path + "GetNetIntentGlobalOverrides.XML") + } + catch { Write-Warning "Unable to get NetIntent -GlobalOverrides. `nError="+$_.Exception.Message + } + } + } + } else { Show-Update "... Skip gather of cluster configuration since cluster is not available" } - + if ($IncludeClusterPerformanceHistory) { Show-Update "Starting ClusterPerformanceHistory log collection ..." @@ -1984,7 +1999,8 @@ function Get-SddcDiagnosticInfo try { Get-Clusterlog -ExportClusterPerformanceHistory -Destination $using:Path -PerformanceHistoryTimeFrame $using:PerformanceHistoryTimeFrame -Node $using:ClusterNodes.Name } - catch { Write-Warning "Could not get ClusterPerformanceHistory. `nError=$($_.Exception.Message)" } + catch { #Show-Warning("Could not get ClusterPerformanceHistory. `nError="+$_.Exception.Message) + } } } @@ -1996,7 +2012,8 @@ function Get-SddcDiagnosticInfo $JobStatic += start-job -Name "Driver Information: $node" { try { $o = Get-CimInstance -ClassName Win32_PnPSignedDriver -ComputerName $using:node } - catch { Write-Error "Unable to get Drivers on $using:node. `nError=$($_.Exception.Message)" } + catch { #Show-Error("Unable to get Drivers on $using:node. `nError="+$_.Exception.Message) + } $o | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "GetDrivers.XML") } } @@ -2191,20 +2208,20 @@ function Get-SddcDiagnosticInfo # Events, cmd, reports, et.al. Show-Update "Start gather of system info, cluster/netft/health logs, reports and dump files ..." - - $JobStatic += Start-Job -Name ClusterLogs { - $null = Get-ClusterLog -Node $using:ClusterNodes.Name -Destination $using:Path -UseLocalTime - if ((Get-Command Get-ClusterLog).Parameters.ContainsKey("NetFt")) - { - $null = Get-ClusterLog -Node $using:ClusterNodes.Name -Destination $using:Path -UseLocalTime -Netft - } - } - + #$NodeSystemRootPath = Invoke-Command -ComputerName $AccessNode -ConfigurationName $using:SessionConfigurationName { $env:SystemRoot } + $RPath = (Get-AdminSharePathFromLocal $env:COMPUTERNAME $Path) + If ($HoursOfEvents -eq -1) {$ClusterLogMinutes=999999} else {$ClusterLogMinutes=$HoursOfEvents*60} + $JobStatic += Foreach ($NodeName in ($ClusterNodes.Name)) {Invoke-Command -AsJob -JobName "ClusterLogs$NodeName" -ComputerName $Nodename -ScriptBlock { + try {$null=Get-ClusterLog -UseLocalTime -TimeSpan $using:ClusterLogMinutes} catch {}} + } + if ((Get-Command Get-ClusterLog).Parameters.ContainsKey("NetFt")) { + $JobStatic += Foreach ($NodeName in ($ClusterNodes.Name)) {Invoke-Command -AsJob -JobName "ClusterLogsNetft$NodeName" -ComputerName $Nodename -ScriptBlock { + $null=Get-ClusterLog -UseLocalTime -Netft -TimeSpan $using:ClusterLogMinutes} + }} if ($S2DEnabled) { - $JobStatic += Start-Job -Name ClusterHealthLogs { - $null = Get-ClusterLog -Node $using:ClusterNodes.Name -Destination $using:Path -Health -UseLocalTime - } - } + $JobStatic += Foreach ($NodeName in ($ClusterNodes.Name)) {Invoke-Command -AsJob -JobName "ClusterLogsHealth$NodeName" -ComputerName $Nodename -ScriptBlock { + $null=Get-ClusterLog -UseLocalTime -Health -TimeSpan $using:ClusterLogMinutes} + }} $JobStatic += $ClusterNodes.Name |% { @@ -2223,11 +2240,13 @@ function Get-SddcDiagnosticInfo # # Gather SYSTEMINFO.EXE output for a given node $SysInfoOut=(Join-Path (Get-NodePath $using:Path $using:NodeName) "SystemInfo.TXT") - Start-Process -FilePath "$env:comspec" -ArgumentList "/c SystemInfo.exe /S $using:NodeName > $SysInfoOut" -WindowStyle Hidden -Wait + Start-Process -FilePath "$env:comspec" -ArgumentList "/c SystemInfo.exe /S $using:NodeName > $SysInfoOut" -WindowStyle Hidden # -Wait # Gather MSINFO32.EXE output for a given node #$MSINFO32Out=(Join-Path (Get-NodePath $using:Path $using:NodeName) "MSINFO32.NFO") #Start-Process -FilePath "$env:comspec" -ArgumentList "/c MSINFO32.exe /nfo $MSINFO32Out /Computer $using:NodeName" -WindowStyle Hidden -Wait + $LocalFileMsInfo = (Join-Path $LocalNodeDir "\msinfo.nfo") + Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer $using:NodeName /nfo $LocalFileMsInfo" # -Wait # Cmdlets to drop in TXT and XML forms # @@ -2287,6 +2306,7 @@ function Get-SddcDiagnosticInfo 'Invoke-Command -ComputerName _C_ {Echo Get-ProcessByService;$aps=GPs;$r=@();$Ass=GWmi Win32_Service;foreach($p in $aps){$ss=$Ass|?{$_.ProcessID -eq $p.Id};IF($ss){$r+=[PSCustomObject]@{Service=$ss.DisplayName;ProcessName=$p.ProcessName;ProcessID=$p.Id}}}$r}', 'Get-NetNeighbor -CimSession _C_', 'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' + #[System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::GetComputerSite() # These commands are specific to optional modules, add only if present # - DcbQos: RoCE environments primarily @@ -2320,6 +2340,7 @@ function Get-SddcDiagnosticInfo $CmdsToLog += "Get-AzureStackHCIArcIntegration" } + $nodejobs=@() foreach ($cmd in $CmdsToLog) { # truncate cmd string to the cmd itself @@ -2327,20 +2348,20 @@ function Get-SddcDiagnosticInfo try { $cmdex = $cmd -replace '_C_',$using:NodeName -replace '_N_',$using:NodeName -replace '_A_',$using:AccessNode - $out = Invoke-Expression $cmdex + $cmdsb = [scriptblock]::Create("$cmdex") + $nodejobs+=Start-Job -Name $LocalFile -ScriptBlock $cmdsb + #$out = Invoke-Expression $cmdex # capture as txt and xml for quick analysis according to taste - $out | ft -AutoSize | Out-File -Width 9999 -Encoding ascii -FilePath "$LocalFile.txt" - $out | Export-Clixml -Path "$LocalFile.xml" + #$out | ft -AutoSize | Out-File -Width 9999 -Encoding ascii -FilePath "$LocalFile.txt" + #$out | Export-Clixml -Path "$LocalFile.xml" - } catch { - Show-Warning "'$cmdex' failed for node $Node ($($_.Exception.Message))" - } + } catch {} } + + #Add MSInfo32 - $LocalFile = (Join-Path $LocalNodeDir "\msinfo.nfo") - Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer $using:NodeName /nfo $LocalFile" -Wait $NodeSystemRootPath = Invoke-Command -ComputerName $using:NodeName -ConfigurationName $using:SessionConfigurationName { $env:SystemRoot } @@ -2396,19 +2417,45 @@ function Get-SddcDiagnosticInfo try { $RPath = (Get-AdminSharePathFromLocal $using:NodeName "$NodeSystemRootPath\Cluster\Reports\*.*") - $RepFiles = Get-ChildItem -Path $RPath -Recurse -ErrorAction SilentlyContinue } + $RepFiles = Get-ChildItem -Path $RPath -Recurse -ErrorAction SilentlyContinue | Sort LastWriteTime} catch { $RepFiles = ""; Show-Warning "Unable to get reports for node $using:NodeName" } $LocalReportDir = Join-Path $LocalNodeDir "ClusterReports" md $LocalReportDir | Out-Null + Do { + Sleep 1 + Foreach ($myjob in ($nodejobs | ? Name -notmatch "JOBDONE" | ? State -eq "Completed")) { + $LocalFile=$myJob.Name + $out = Receive-Job $myjob + + # capture as txt and xml for quick analysis according to taste + $out | ft -AutoSize | Out-File -Width 9999 -Encoding ascii -FilePath "$LocalFile.txt" + $out | Export-Clixml -Path "$LocalFile.xml" + $myjob.Name=$myjob.Name+":JOBDONE" + $myjob.Dispose() + } + $nodejobs | fl * | Out-File -FilePath (Join-Path $LocalNodeDir "GetNodeJobsStatus.txt") + + } while ($nodejobs.State -contains "Running") + $FailedJobs=@() + Foreach ($myjob in ($nodejobs | ? State -ne "Completed")) { + $FailedJobs+=$myjob + #Show-Warning "'$myjob' failed for node $Node ($(Receive-Job $myjob))" + } + $FailedJobs | fl * | Out-File -FilePath (Join-Path $LocalNodeDir "GetNodeJobsStatus.txt") + $nodejobs | Remove-Job + # Copy logs from the Report directory; exclude cluster/health logs which we're getting seperately - $RepFiles |% { + $RepFiles |% { if (($_.Name -notlike "Cluster.log") -and ($_.Name -notlike "ClusterHealth.log")) { try { Copy-Item $_.FullName $LocalReportDir } catch { Show-Warning "Could not copy report file $($_.FullName)" } - } + } + + } + } } @@ -2459,7 +2506,7 @@ function Get-SddcDiagnosticInfo # Also export locale metadata for off-system rendering (one-shot, we'll recursively copy) Write-Output (Get-AdminSharePathFromLocal $Node (Join-Path $NodePath "LocaleMetaData")) - } + }F if ($IncludeAssociations -and $ClusterName.Length) { @@ -2812,33 +2859,23 @@ function Get-SddcDiagnosticInfo } catch { Show-Warning "Gathering S2D connectivity failed" } - - Show-Update "AzureStack HCI info" - #Added by JG - try { - If ((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){ - Get-AzureStackHCI| Export-Clixml ($Path + "GetAzureStackHCI.xml") - Get-AzureStackHCIArcIntegration| Export-Clixml ($Path + "AzureStackHCIArcIntegration.xml") - } - } catch { - Show-Warning("Unable to get AzureStack HCI info. `nError="+$_.Exception.Message) - } - - - Show-Update "Start gather of Cluster Performance information..." - #Added by JG + Show-Update "Cluster Performance History" + + try { + $JobStatic += start-job -Name "Cluster Performance History" { + #Added by JG #try { - Show-Update " Gathering Sample 1: CPU, I see you!" + #Show-Update " Gathering Sample 1: CPU, I see you!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-1-cpu-i-see-you $Output ="" $Output = $ClusterNodes | ForEach-Object { $_ | Get-ClusterPerf -ClusterNodeSeriesName "ClusterNode.Cpu.Usage" -TimeFrame "LastWeek" -ErrorAction SilentlyContinue } - $Output | Sort-Object ClusterNode | Export-Clixml ($Path + "CPUIseeyou.xml") + $Output | Sort-Object ClusterNode | Export-Clixml ($using:Path + "CPUIseeyou.xml") #}catch { Show-Warning("Unable to get CPU, I see you Data. `nError="+$_.Exception.Message) } try { - Show-Update " Gathering Sample 2: Fire, fire, latency outlier" + #Show-Update " Gathering Sample 2: Fire, fire, latency outlier" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-2-fire-fire-latency-outlier $Cluster = Get-cluster @@ -2917,10 +2954,11 @@ function Get-SddcDiagnosticInfo $Output } - $o | Sort-Object PsComputerName | Export-Clixml ($Path + "latencyoutlier.xml") - } catch { Show-Warning("Unable to get latency outlier Data. `nError="+$_.Exception.Message) } + $o | Sort-Object PsComputerName | Export-Clixml ($using:Path + "latencyoutlier.xml") + } catch { #Show-Warning("Unable to get latency outlier Data. `nError="+$_.Exception.Message) + } try { - Show-Update " Gathering Sample 3: Noisy neighbor? That's write!" + #Show-Update " Gathering Sample 3: Noisy neighbor? That's write!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-3-noisy-neighbor-thats-write $Cluster = Get-cluster $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue @@ -2954,10 +2992,11 @@ function Get-SddcDiagnosticInfo $o | Sort-Object RawIopsTotal -Descending | Select-Object -First 10 | Export-Clixml ($Path + "Noisyneighbor.xml") } - catch { Show-Warning("Unable to get Noisy neighbor Data. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Unable to get Noisy neighbor Data. `nError="+$_.Exception.Message) + } try { - Show-Update " Gathering Sample 4: As they say, 25-gig is the new 10-gig" + #Show-Update " Gathering Sample 4: As they say, 25-gig is the new 10-gig" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-4-as-they-say-25-gig-is-the-new-10-gig $Cluster = Get-cluster $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue @@ -3007,18 +3046,20 @@ function Get-SddcDiagnosticInfo } } - $o | Sort-Object PsComputerName, InterfaceDescription | Export-Clixml ($Path + "25gigisthenew10gig.xml") + $o | Sort-Object PsComputerName, InterfaceDescription | Export-Clixml ($using:Path + "25gigisthenew10gig.xml") } - catch { Show-Warning("Unable to get 25gigisthenew10gig Data. `nError="+$_.Exception.Message) } + catch { #Show-Warning("Unable to get 25gigisthenew10gig Data. `nError="+$_.Exception.Message) + } try { - Show-Update " Gathering Sample 5: Make storage trendy again!" + #Show-Update " Gathering Sample 5: Make storage trendy again!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-6-memory-hog-you-can-run-but-you-cant-hide - Get-Volume | Where-Object FileSystem -Like "*CSV*" | %{$_ | Get-ClusterPerf -VolumeSeriesName "Volume.Size.Available" -TimeFrame "LastYear" | Sort-Object Time | Select-Object -Last 14} | Sort-Object ClusterNode | Export-Clixml ($Path + "trendyagain.xml") - }catch { Show-Warning("Unable to get Make storage trendy again! Data. `nError="+$_.Exception.Message) } + Get-Volume | Where-Object FileSystem -Like "*CSV*" | %{$_ | Get-ClusterPerf -VolumeSeriesName "Volume.Size.Available" -TimeFrame "LastYear" | Sort-Object Time | Select-Object -Last 14} | Sort-Object ClusterNode | Export-Clixml ($using:Path + "trendyagain.xml") + }catch { #Show-Warning("Unable to get Make storage trendy again! Data. `nError="+$_.Exception.Message) + } try { - Show-Update " Gathering Sample 6: Memory hog, you can run but you can't hide" + #Show-Update " Gathering Sample 6: Memory hog, you can run but you can't hide" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-6-memory-hog-you-can-run-but-you-cant-hide $Output = Invoke-Command (Get-ClusterNode).Name { Function Format-Bytes { @@ -3037,16 +3078,37 @@ function Get-SddcDiagnosticInfo $AvgMemoryUsage = ($Data | Measure-Object -Property Value -Average).Average [PsCustomObject]@{ "VM" = $_.Name - "AvgMemoryUsage" = Format-Bytes $AvgMemoryUsage.Value - "RawAvgMemoryUsage" = $AvgMemoryUsage.Value # For sorting... + "AvgMemoryUsage" = Format-Bytes $AvgMemoryUsage + "RawAvgMemoryUsage" = $AvgMemoryUsage # For sorting... } } } } - $Output | Sort-Object RawAvgMemoryUsage -Descending | Select-Object -First 10 | Export-Clixml ($Path + "Memoryhog.xml") - }catch { Show-Warning("Unable to get Memory hog Data. `nError="+$_.Exception.Message) } + $Output | Sort-Object RawAvgMemoryUsage -Descending | Select-Object -First 10 | Export-Clixml ($using:Path + "Memoryhog.xml") + }catch { #Show-Warning("Unable to get Memory hog Data. `nError="+$_.Exception.Message) + } + } + - } + } catch { + Show-Warning "Gathering Cluster Performance History failed" + } + } + Show-Update "AzureStack HCI info" + #Added by JG + try { + If ((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){ + Get-AzureStackHCI| Export-Clixml ($Path + "GetAzureStackHCI.xml") + Get-AzureStackHCIArcIntegration| Export-Clixml ($Path + "AzureStackHCIArcIntegration.xml") + } + } catch { + Show-Warning("Unable to get AzureStack HCI info. `nError="+$_.Exception.Message) + } + + + Show-Update "Start gather of Cluster Performance information..." + + #### # Now receive the jobs requiring remote copyout @@ -3082,10 +3144,27 @@ function Get-SddcDiagnosticInfo #### Show-Update "Completing background gathers ..." -ForegroundColor Green + Show-Update "Start monitoring $($PerfSamples)s" -ForegroundColor Green + $PerfProc = Start-Process -WindowStyle Hidden -FilePath "powershell.exe" -ArgumentList @("-Command", """& {Get-Counter -Counter (Get-Counter -ListSet 'Cluster Storage*','Cluster CSV*','Storage Spaces*','Refs','Cluster Disk Counters','PhysicalDisk','RDMA*','Mellanox*','Marvell*','Hyper-V Hypervisor Virtual Processor','Hyper-V Hypervisor Logical Processor','Hyper-V Hypervisor Root Virtual Processor' -ComputerName (Get-ClusterNode).Name -ErrorAction SilentlyContinue).paths -SampleInterval 1 -MaxSamples $PerfSamples -ErrorAction Ignore -WarningAction Ignore | Export-counter -Path ('$Path' + '\GetCounters.blg') -Force -FileFormat BLG}""") -Passthru Show-WaitChildJob $JobStatic 30 - Receive-Job $JobStatic + $JobStatic | % {if ($_.Name -ne "Cluster Performance History" -and $_.Name -notlike "ClusterLogs*") { $o=Receive-Job $_; If ($o) {Write-Host "Job $($_.Name) Output:";$o}}} Remove-Job $JobStatic + Show-Update "Copying cluster logs." + Foreach ($NodeName in ((Get-ClusterNode).Name)) { + $NodeSystemRootPath = Invoke-Command -ComputerName $NodeName { $env:SystemRoot } + try { + $RPath = (Get-AdminSharePathFromLocal $NodeName "$NodeSystemRootPath\Cluster\Reports\cluster*.log") + $RepFiles = Get-ChildItem -Path $RPath -Recurse -ErrorAction SilentlyContinue | Sort LastWriteTime} + catch { $RepFiles = ""; Show-Warning "Unable to get reports for node $NodeName" } + $RepFiles |% { + $DestPath=(Join-Path $Path $NodeName)+"_$($_.Name)" + If (($_.Name -eq "Cluster.log" -or $_.Name -eq "ClusterHealth.log") -and -not (Test-Path $DestPath)) { + try { Copy-Item $_.FullName $DestPath } + catch { Show-Warning "Could not copy report file $($_.FullName)" } + } + } + } if (Get-Member -InputObject $JobStatic ActiveSessions) { Remove-PSSession -Id $JobStatic.ActiveSessions @@ -3235,13 +3314,25 @@ function Get-SddcDiagnosticInfo } else { - Show-Update "Get counter sets" - $set = Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk","RDMA*","Mellanox*","Marvell*","Hyper-V Hypervisor Virtual Processor","Hyper-V Hypervisor Logical Processor","Hyper-V Hypervisor Root Virtual Processor" -ComputerName $ClusterNodes.Name -ErrorAction SilentlyContinue - Show-Update "Start monitoring ($($PerfSamples)s)" - $PerfRaw = Get-Counter -Counter $set.Paths -SampleInterval 1 -MaxSamples $PerfSamples -ErrorAction Ignore -WarningAction Ignore + <#Show-Update "Get counter sets" + $setPaths = (Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk","RDMA*","Mellanox*","Marvell*","Hyper-V Hypervisor Virtual Processor" -ComputerName $ClusterNodes.Name -ErrorAction SilentlyContinue).paths + Show-Update "Start monitoring ($($PerfSamples)s) per node. Total est. time $($PerfSamples*2*($ClusterNodes.count-1))s" + #$set = Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk","RDMA*","Mellanox*","Marvell*","Hyper-V Hypervisor Virtual Processor" -ErrorAction SilentlyContinue + $CounterJobs=@() + $PerfRaw=$null + $CounterJobs+=Start-Job -Name "CounterJob" -ScriptBlock { + Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:PerfSamples -ErrorAction Ignore -WarningAction Ignore + } + Show-WaitChildJob $CounterJobs 30 + $CounterJobs | %{$PerfRaw=$PerfRaw+(Receive-Job $_ -AutoRemoveJob)} + #$PerfRaw = Get-Counter -Counter $set.Paths -SampleInterval 1 -MaxSamples $PerfSamples -ErrorAction Ignore -WarningAction Ignore Show-Update "Exporting counters" - $PerfRaw | Export-counter -Path ($Path + "GetCounters.blg") -Force -FileFormat BLG - Show-Update "Completed" + + $PerfRaw | Export-counter -Path ($Path + "GetCounters.blg") -Force -FileFormat BLG#> + Do {Write-Host -Nonewline ".";sleep 10} + While ($PerfProc.HasExited -ne $True) + Write-Host $Null + Show-Update "Performance monitoring completed" if ($ProcessCounter) { @@ -3428,7 +3519,7 @@ function Get-SddcDiagnosticInfo try { Add-Type -Assembly System.IO.Compression.FileSystem - [System.IO.Compression.ZipFile]::CreateFromDirectory($Path, $ZipPath, [System.IO.Compression.CompressionLevel]::Optimal, $false) + [System.IO.Compression.ZipFile]::CreateFromDirectory($Path, $ZipPath, [System.IO.Compression.CompressionLevel]::Fastest, $false) $ZipPath = Convert-Path $ZipPath Show-Update "Zip File Name : $ZipPath" @@ -6465,4 +6556,4 @@ Export-ModuleMember -Alias * -Function 'Get-SddcDiagnosticInfo', 'Show-StorageCounters', 'Get-SpacesTimeline', 'Set-SddcDiagnosticArchiveJobParameters', - 'Get-SddcDiagnosticArchiveJobParameters' \ No newline at end of file + 'Get-SddcDiagnosticArchiveJobParameters' From b27b6315dec4c3fb25035b3b2f3e573c84c6987b Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Tue, 3 Oct 2023 15:19:43 -0500 Subject: [PATCH 082/127] Update 3 #fixed write warnings #fixed missing objects for Get-VM* commands #set special char in disk time labels --- .../PrivateCloud.DiagnosticInfo.psd1 | 2 +- .../PrivateCloud.DiagnosticInfo.psm1 | 408 +++++++++--------- 2 files changed, 205 insertions(+), 205 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 3bc6e84..8b98b7e 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.2' +ModuleVersion = '1.3355.3' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 4967a45..8957c50 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1682,7 +1682,7 @@ function Get-SddcDiagnosticInfo $transcriptFile = Join-Path $Path "0_CloudHealthGatherTranscript.log" try { Start-Transcript -Path $transcriptFile -Force - Write-host "Dell SDDC Version" +Write-host "Dell SDDC Version" } catch { # show error and rethrow to terminate Show-Error "Unable to start transcript at $transcriptFile" $_ @@ -1773,7 +1773,7 @@ function Get-SddcDiagnosticInfo Write-Host "Cluster name : Unavailable, Cluster is not online on any node" } - Write-Host ("Accessible Node List : " + [string]::Join(", ",$ClusterNodes.name)) + Write-Host ("Accessible Node List : " + [string]::Join(", ",$ClusterNodes.name)) Write-Host "Access node : $AccessNode`n" # Create node-specific directories for content @@ -1887,8 +1887,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterGroup -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterGroup.XML") } - catch { Write-Warning "Unable to get Cluster Groups. `nError="+$_.Exception.Message - } + catch { Write-Warning "Unable to get Cluster Groups. `nError=$($_.Exception.Message)" + } } $JobStatic += start-job -Name ClusterNetwork { @@ -1896,26 +1896,26 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterNetwork -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterNetwork.XML") } - catch { Write-Warning "Could not get Cluster Nodes. `nError="+$_.Exception.Message - } - } + catch { Write-Warning "Could not get Cluster Nodes. `nError=$($_.Exception.Message)" + } + } $JobStatic += start-job -Name ClusterNetworkLiveMigrationInformation { try { $o = Get-ClusterResourceType -Name 'Virtual Machine' -Cluster $using:AccessNode | Get-ClusterParameter $o | Export-Clixml ($using:Path + "ClusterNetworkLiveMigration.XML") } - catch { Write-Warning "Could not get Cluster Network Live Migration Information. `nError="+$_.Exception.Message - } - } + catch { Write-Warning "Could not get Cluster Network Live Migration Information. `nError=$($_.Exception.Message)" +} + } $JobStatic += start-job -Name ClusterResource { try { $o = Get-ClusterResource -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterResource.XML") } - catch { Write-Warning "Unable to get Cluster Resources. `nError="+$_.Exception.Message - } + catch { Write-Warning "Unable to get Cluster Resources. `nError=$($_.Exception.Message)" +} } @@ -1924,8 +1924,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterResource -Cluster $using:AccessNode | Get-ClusterParameter $o | Export-Clixml ($using:Path + "GetClusterResourceParameters.XML") } - catch { Write-Warning "Unable to get Cluster Resource Parameters. `nError="+$_.Exception.Message - } + catch { Write-Warning "Unable to get Cluster Resource Parameters. `nError=$($_.Exception.Message)" +} } $JobStatic += start-job -Name ClusterSharedVolume { @@ -1933,8 +1933,8 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterSharedVolume -Cluster $using:AccessNode $o | Export-Clixml ($using:Path + "GetClusterSharedVolume.XML") } - catch { Write-Warning "Unable to get Cluster Shared Volumes. `nError="+$_.Exception.Message - } + catch { Write-Warning "Unable to get Cluster Shared Volumes. `nError=$($_.Exception.Message)" +} } $JobStatic += start-job -Name GetClusterFaultDomain { @@ -1942,11 +1942,11 @@ function Get-SddcDiagnosticInfo $o = Get-ClusterFaultDomain | select name,type,parentname,childrennames,location $o | Export-Clixml ($using:Path + "GetClusterFaultDomain.XML") } - catch { Write-Warning "Unable to get ClusterFaultDomain. `nError="+$_.Exception.Message - } + catch { Write-Warning "Unable to get ClusterFaultDomain. `nError=$($_.Exception.Message)" + } } - - Show-Update "Start gather of Network ATC information..." + + Show-Update "Start gather of Network ATC information..." $NetworkATC=$False $NetworkATC=try {(Get-WindowsFeature NetworkATC).installed} catch {$False} if ($NetworkATC) { @@ -1956,26 +1956,26 @@ function Get-SddcDiagnosticInfo $o = Get-NetIntentStatus -ClusterName $using:AccessNode $o | Export-Clixml ($using:Path + "GetNetIntentStatus.XML") } - catch { Write-Warning "Unable to get NetIntentStatus. `nError="+$_.Exception.Message - } + catch { Write-Warning "Unable to get NetIntentStatus. `nError=$($_.Exception.Message)" +} } - $JobStatic += start-job -Name NetIntentStatusGlobalOverrides { + $JobStatic += start-job -Name NetIntentStatusGlobalOverrides { try { $o = Get-NetIntentStatus -GlobalOverrides -ClusterName $using:AccessNode $o | Export-Clixml ($using:Path + "GetNetIntentStatusGlobalOverrides.XML") } - catch { Write-Warning "Unable to get NetIntentStatus -GlobalOverrides. `nError="+$_.Exception.Message + catch { Write-Warning "Unable to get NetIntentStatus -GlobalOverrides. `nError=$($_.Exception.Message)" } - } + } $JobStatic += start-job -Name NetIntent { try { $o = Get-NetIntent -ClusterName $using:AccessNode $o | Export-Clixml ($using:Path + "GetNetIntent.XML") } - catch { Write-Warning "Unable to get NetIntent. `nError="+$_.Exception.Message - } + catch { Write-Warning "Unable to get NetIntent. `nError=$($_.Exception.Message)" + } } $JobStatic += start-job -Name NetIntentGlobalOverrides { @@ -1983,8 +1983,8 @@ function Get-SddcDiagnosticInfo $o = Get-NetIntent -GlobalOverrides -ClusterName $using:AccessNode $o | Export-Clixml ($using:Path + "GetNetIntentGlobalOverrides.XML") } - catch { Write-Warning "Unable to get NetIntent -GlobalOverrides. `nError="+$_.Exception.Message - } + catch { Write-Warning "Unable to get NetIntent -GlobalOverrides. `nError=$($_.Exception.Message)" + } } } } else { @@ -1999,8 +1999,8 @@ function Get-SddcDiagnosticInfo try { Get-Clusterlog -ExportClusterPerformanceHistory -Destination $using:Path -PerformanceHistoryTimeFrame $using:PerformanceHistoryTimeFrame -Node $using:ClusterNodes.Name } - catch { #Show-Warning("Could not get ClusterPerformanceHistory. `nError="+$_.Exception.Message) - } + catch { Write-Warning "Could not get ClusterPerformanceHistory. `nError=$($_.Exception.Message)" +} } } @@ -2013,7 +2013,7 @@ function Get-SddcDiagnosticInfo $JobStatic += start-job -Name "Driver Information: $node" { try { $o = Get-CimInstance -ClassName Win32_PnPSignedDriver -ComputerName $using:node } catch { #Show-Error("Unable to get Drivers on $using:node. `nError="+$_.Exception.Message) - } +} $o | Export-Clixml (Join-Path (Join-Path $using:Path "Node_$using:node") "GetDrivers.XML") } } @@ -2209,18 +2209,18 @@ function Get-SddcDiagnosticInfo # Events, cmd, reports, et.al. Show-Update "Start gather of system info, cluster/netft/health logs, reports and dump files ..." #$NodeSystemRootPath = Invoke-Command -ComputerName $AccessNode -ConfigurationName $using:SessionConfigurationName { $env:SystemRoot } - $RPath = (Get-AdminSharePathFromLocal $env:COMPUTERNAME $Path) - If ($HoursOfEvents -eq -1) {$ClusterLogMinutes=999999} else {$ClusterLogMinutes=$HoursOfEvents*60} +$RPath = (Get-AdminSharePathFromLocal $env:COMPUTERNAME $Path) +If ($HoursOfEvents -eq -1) {$ClusterLogMinutes=999999} else {$ClusterLogMinutes=$HoursOfEvents*60} $JobStatic += Foreach ($NodeName in ($ClusterNodes.Name)) {Invoke-Command -AsJob -JobName "ClusterLogs$NodeName" -ComputerName $Nodename -ScriptBlock { try {$null=Get-ClusterLog -UseLocalTime -TimeSpan $using:ClusterLogMinutes} catch {}} } if ((Get-Command Get-ClusterLog).Parameters.ContainsKey("NetFt")) { $JobStatic += Foreach ($NodeName in ($ClusterNodes.Name)) {Invoke-Command -AsJob -JobName "ClusterLogsNetft$NodeName" -ComputerName $Nodename -ScriptBlock { - $null=Get-ClusterLog -UseLocalTime -Netft -TimeSpan $using:ClusterLogMinutes} + $null=Get-ClusterLog -UseLocalTime -Netft -TimeSpan $using:ClusterLogMinutes} }} if ($S2DEnabled) { $JobStatic += Foreach ($NodeName in ($ClusterNodes.Name)) {Invoke-Command -AsJob -JobName "ClusterLogsHealth$NodeName" -ComputerName $Nodename -ScriptBlock { - $null=Get-ClusterLog -UseLocalTime -Health -TimeSpan $using:ClusterLogMinutes} + $null=Get-ClusterLog -UseLocalTime -Health -TimeSpan $using:ClusterLogMinutes} }} $JobStatic += $ClusterNodes.Name |% { @@ -2239,14 +2239,14 @@ function Get-SddcDiagnosticInfo # Text-only conventional commands # # Gather SYSTEMINFO.EXE output for a given node - $SysInfoOut=(Join-Path (Get-NodePath $using:Path $using:NodeName) "SystemInfo.TXT") - Start-Process -FilePath "$env:comspec" -ArgumentList "/c SystemInfo.exe /S $using:NodeName > $SysInfoOut" -WindowStyle Hidden # -Wait - - # Gather MSINFO32.EXE output for a given node - #$MSINFO32Out=(Join-Path (Get-NodePath $using:Path $using:NodeName) "MSINFO32.NFO") - #Start-Process -FilePath "$env:comspec" -ArgumentList "/c MSINFO32.exe /nfo $MSINFO32Out /Computer $using:NodeName" -WindowStyle Hidden -Wait - $LocalFileMsInfo = (Join-Path $LocalNodeDir "\msinfo.nfo") - Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer $using:NodeName /nfo $LocalFileMsInfo" # -Wait +$SysInfoOut=(Join-Path (Get-NodePath $using:Path $using:NodeName) "SystemInfo.TXT") +Start-Process -FilePath "$env:comspec" -ArgumentList "/c SystemInfo.exe /S $using:NodeName > $SysInfoOut" -WindowStyle Hidden # -Wait + +# Gather MSINFO32.EXE output for a given node +#$MSINFO32Out=(Join-Path (Get-NodePath $using:Path $using:NodeName) "MSINFO32.NFO") +#Start-Process -FilePath "$env:comspec" -ArgumentList "/c MSINFO32.exe /nfo $MSINFO32Out /Computer $using:NodeName" -WindowStyle Hidden -Wait +$LocalFileMsInfo = (Join-Path $LocalNodeDir "\msinfo.nfo") +Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer $using:NodeName /nfo $LocalFileMsInfo" # -Wait # Cmdlets to drop in TXT and XML forms # @@ -2276,7 +2276,7 @@ function Get-SddcDiagnosticInfo 'Get-NetOffloadGlobalSetting -CimSession _C_', 'Get-NetPrefixPolicy -CimSession _C_', 'Get-NetQosPolicy -CimSession _C_', - 'Get-NetAdapterQos -CimSession _C_', +'Get-NetAdapterQos -CimSession _C_', 'Get-NetRoute -CimSession _C_', 'Get-Disk -CimSession _C_', 'Get-NetTcpConnection -CimSession _C_', @@ -2284,28 +2284,28 @@ function Get-SddcDiagnosticInfo 'Get-ScheduledTask -CimSession _C_ | Get-ScheduledTaskInfo -CimSession _C_', 'Get-SmbServerNetworkInterface -CimSession _C_', 'Get-StorageFaultDomain -CimSession _A_ -Type StorageScaleUnit |? FriendlyName -eq _N_ | Get-StorageFaultDomain -CimSession _A_', - 'Get-NetFirewallProfile -CimSession _C_', - 'Get-NetFirewallRule -CimSession _C_', - 'Get-NetConnectionProfile -CimSession _C_', - 'Get-SmbMultichannelConnection -CimSession _C_ -SmbInstance SBL', - 'Get-SmbClientConfiguration -CimSession _C_', - 'Get-SmbServerConfiguration -CimSession _C_', - 'Get-NetIPConfiguration -CimSession _C_', - 'Invoke-Command -ComputerName _C_ {Get-ComputerInfo}', - 'Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}', - 'Invoke-Command -ComputerName _C_ {Echo Get-RegSpacePortParameters;Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}', - 'Invoke-Command -ComputerName _C_ {Echo Get-RegOEMInformation;IF((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation}}', - 'Invoke-Command -ComputerName _C_ {Echo Get-netsh;netsh int tcp show global}', - 'Invoke-Command -ComputerName _C_ {Echo Get-win32_networkadapter;Get-WmiObject win32_networkadapter}', - 'Invoke-Command -ComputerName _C_ {Echo Get-TcpipParametersInterfaces;Get-ItemProperty -path HKLM:\System\CurrentControlSet\services\Tcpip\Parameters\Interfaces\*}', - 'Invoke-Command -ComputerName _C_ {Echo Get-mpioParameters;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters}}', - 'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"}}', - 'Invoke-Command -ComputerName _C_ {Echo Get-MSDSMSupportedHW;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-MSDSMSupportedHW -CimSession _C_}}', - 'Invoke-Command -ComputerName _C_ {Echo Get-DriverSuiteVersion;Get-ChildItem HKLM:\SOFTWARE\Dell\MUP -Recurse | Get-ItemProperty}', - 'Invoke-Command -ComputerName _C_ {Echo Get-ChipsetVersion;Get-WmiObject win32_product | ? Name -like "*chipset*"}', +'Get-NetFirewallProfile -CimSession _C_', +'Get-NetFirewallRule -CimSession _C_', +'Get-NetConnectionProfile -CimSession _C_', +'Get-SmbMultichannelConnection -CimSession _C_ -SmbInstance SBL', +'Get-SmbClientConfiguration -CimSession _C_', +'Get-SmbServerConfiguration -CimSession _C_', +'Get-NetIPConfiguration -CimSession _C_', +'Invoke-Command -ComputerName _C_ {Get-ComputerInfo}', +'Invoke-Command -ComputerName _C_ {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}', +'Invoke-Command -ComputerName _C_ {Echo Get-RegSpacePortParameters;Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spacePort\Parameters}', +'Invoke-Command -ComputerName _C_ {Echo Get-RegOEMInformation;IF((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation}}', +'Invoke-Command -ComputerName _C_ {Echo Get-netsh;netsh int tcp show global}', +'Invoke-Command -ComputerName _C_ {Echo Get-win32_networkadapter;Get-WmiObject win32_networkadapter}', +'Invoke-Command -ComputerName _C_ {Echo Get-TcpipParametersInterfaces;Get-ItemProperty -path HKLM:\System\CurrentControlSet\services\Tcpip\Parameters\Interfaces\*}', +'Invoke-Command -ComputerName _C_ {Echo Get-mpioParameters;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path HKLM:\SYSTEM\CurrentControlSet\Services\mpio\Parameters}}', +'Invoke-Command -ComputerName _C_ {Echo Get-mpioSettings;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e97b-e325-11ce-bfc1-08002be10318}\000*"}}', +'Invoke-Command -ComputerName _C_ {Echo Get-MSDSMSupportedHW;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-MSDSMSupportedHW -CimSession _C_}}', +'Invoke-Command -ComputerName _C_ {Echo Get-DriverSuiteVersion;Get-ChildItem HKLM:\SOFTWARE\Dell\MUP -Recurse | Get-ItemProperty}', +'Invoke-Command -ComputerName _C_ {Echo Get-ChipsetVersion;Get-WmiObject win32_product | ? Name -like "*chipset*"}', 'Invoke-Command -ComputerName _C_ {Echo Get-ProcessByService;$aps=GPs;$r=@();$Ass=GWmi Win32_Service;foreach($p in $aps){$ss=$Ass|?{$_.ProcessID -eq $p.Id};IF($ss){$r+=[PSCustomObject]@{Service=$ss.DisplayName;ProcessName=$p.ProcessName;ProcessID=$p.Id}}}$r}', 'Get-NetNeighbor -CimSession _C_', - 'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' +'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' #[System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::GetComputerSite() # These commands are specific to optional modules, add only if present @@ -2313,33 +2313,33 @@ function Get-SddcDiagnosticInfo # - Hyper-V: may be ommitted in SOFS-only cases if (Get-Module DcbQos -ErrorAction SilentlyContinue) { $CmdsToLog += 'Invoke-Command -ComputerName _C_ {Echo Get-NetQosDcbxSettingPerNic;Get-NetAdapter | Get-NetQosDcbxSetting}', - 'Get-NetQosDcbxSetting -CimSession _C_', + 'Get-NetQosDcbxSetting -CimSession _C_', 'Get-NetQosFlowControl -CimSession _C_', 'Get-NetQosTrafficClass -CimSession _C_' } if (Get-Module Hyper-V -ErrorAction SilentlyContinue) { - $CmdsToLog += 'Get-VM -CimSession _C_ -ErrorAction SilentlyContinue', - 'Invoke-Command -ComputerName _C_ {Echo Get-vmprocessor;Get-VM -CimSession _C_ | Get-VMProcessor -ErrorAction SilentlyContinue}', - 'Get-VMNetworkAdapter -All -CimSession _C_ -ErrorAction SilentlyContinue', - 'Get-VMSwitch -CimSession _C_ -ErrorAction SilentlyContinue', - 'Echo Get-VMSwitchTeam; Get-VMSwitch -CimSession _C_ | Where-Object {$_.EmbeddedTeamingEnabled -eq $true} | %{Get-VMSwitchTeam -CimSession _C_ -SwitchName $_.name}', - 'Get-VMHost -CimSession _C_ -ErrorAction SilentlyContinue', - 'Get-VMNetworkAdapterVlan -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue', - 'Get-VMNetworkAdapterTeamMapping -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue' - } - - #Added to gather DeDup info if installed - If (Get-Module Deduplication -ErrorAction SilentlyContinue){ - $clusterCimSession = New-CimSession -ComputerName $ClusterName - $CmdsToLog += "Get-DedupVolume -CimSession $clusterCimSession" - } - #Added to gather AzureStack HCI info - If ((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){ - $CmdsToLog += "Get-AzureStackHCI" - $CmdsToLog += "Get-AzureStackHCIArcIntegration" - } - + $CmdsToLog += 'Get-VM -CimSession _C_ -ErrorAction SilentlyContinue | Select-Object *', + 'Invoke-Command -ComputerName _C_ {Echo Get-vmprocessor;Get-VM -CimSession _C_ | Get-VMProcessor -ErrorAction SilentlyContinue | Select-Object *}', + 'Get-VMNetworkAdapter -All -CimSession _C_ -ErrorAction SilentlyContinue | Select-Object *', + 'Get-VMSwitch -CimSession _C_ -ErrorAction SilentlyContinue | Select-Object *', + 'Echo Get-VMSwitchTeam; Get-VMSwitch -CimSession _C_ | Where-Object {$_.EmbeddedTeamingEnabled -eq $true} | %{Get-VMSwitchTeam -CimSession _C_ -SwitchName $_.name | Select-Object *}', + 'Get-VMHost -CimSession _C_ -ErrorAction SilentlyContinue | Select-Object *', + 'Get-VMNetworkAdapterVlan -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue | Select-Object *', + 'Get-VMNetworkAdapterTeamMapping -CimSession _C_ -ManagementOS -ErrorAction SilentlyContinue | Select-Object *' +} + +#Added to gather DeDup info if installed +If (Get-Module Deduplication -ErrorAction SilentlyContinue){ +$clusterCimSession = New-CimSession -ComputerName $ClusterName +$CmdsToLog += "Get-DedupVolume -CimSession $clusterCimSession" +} +#Added to gather AzureStack HCI info +If ((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){ +$CmdsToLog += "Get-AzureStackHCI" +$CmdsToLog += "Get-AzureStackHCIArcIntegration" +} + $nodejobs=@() foreach ($cmd in $CmdsToLog) { @@ -2348,7 +2348,7 @@ function Get-SddcDiagnosticInfo try { $cmdex = $cmd -replace '_C_',$using:NodeName -replace '_N_',$using:NodeName -replace '_A_',$using:AccessNode - $cmdsb = [scriptblock]::Create("$cmdex") +$cmdsb = [scriptblock]::Create("$cmdex") $nodejobs+=Start-Job -Name $LocalFile -ScriptBlock $cmdsb #$out = Invoke-Expression $cmdex @@ -2361,7 +2361,7 @@ function Get-SddcDiagnosticInfo - #Add MSInfo32 +#Add MSInfo32 $NodeSystemRootPath = Invoke-Command -ComputerName $using:NodeName -ConfigurationName $using:SessionConfigurationName { $env:SystemRoot } @@ -2426,28 +2426,28 @@ function Get-SddcDiagnosticInfo Do { Sleep 1 Foreach ($myjob in ($nodejobs | ? Name -notmatch "JOBDONE" | ? State -eq "Completed")) { - $LocalFile=$myJob.Name +$LocalFile=$myJob.Name $out = Receive-Job $myjob # capture as txt and xml for quick analysis according to taste $out | ft -AutoSize | Out-File -Width 9999 -Encoding ascii -FilePath "$LocalFile.txt" $out | Export-Clixml -Path "$LocalFile.xml" $myjob.Name=$myjob.Name+":JOBDONE" - $myjob.Dispose() +$myjob.Dispose() } $nodejobs | fl * | Out-File -FilePath (Join-Path $LocalNodeDir "GetNodeJobsStatus.txt") } while ($nodejobs.State -contains "Running") - $FailedJobs=@() +$FailedJobs=@() Foreach ($myjob in ($nodejobs | ? State -ne "Completed")) { - $FailedJobs+=$myjob + $FailedJobs+=$myjob #Show-Warning "'$myjob' failed for node $Node ($(Receive-Job $myjob))" } - $FailedJobs | fl * | Out-File -FilePath (Join-Path $LocalNodeDir "GetNodeJobsStatus.txt") +$FailedJobs | fl * | Out-File -FilePath (Join-Path $LocalNodeDir "GetNodeJobsStatus.txt") $nodejobs | Remove-Job # Copy logs from the Report directory; exclude cluster/health logs which we're getting seperately - $RepFiles |% { +$RepFiles |% { if (($_.Name -notlike "Cluster.log") -and ($_.Name -notlike "ClusterHealth.log")) { try { Copy-Item $_.FullName $LocalReportDir } catch { Show-Warning "Could not copy report file $($_.FullName)" } @@ -2737,7 +2737,7 @@ function Get-SddcDiagnosticInfo Show-Update "Storage Pool & Tiers" - # Storage Node information +# Storage Node information try { Get-StorageNode -CimSession $AccessNode | @@ -2859,7 +2859,7 @@ function Get-SddcDiagnosticInfo } catch { Show-Warning "Gathering S2D connectivity failed" } - Show-Update "Cluster Performance History" +Show-Update "Cluster Performance History" try { $JobStatic += start-job -Name "Cluster Performance History" { @@ -2873,7 +2873,7 @@ function Get-SddcDiagnosticInfo } $Output | Sort-Object ClusterNode | Export-Clixml ($using:Path + "CPUIseeyou.xml") #}catch { Show-Warning("Unable to get CPU, I see you Data. `nError="+$_.Exception.Message) } - + try { #Show-Update " Gathering Sample 2: Fire, fire, latency outlier" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-2-fire-fire-latency-outlier @@ -2881,78 +2881,78 @@ function Get-SddcDiagnosticInfo $Cluster = Get-cluster $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue $o = Invoke-Command $ClusterNodes.Name { - - Function Format-Latency { - Param ( - $RawValue - ) - $i = 0 ; $Labels = ("s", "ms", "μs", "ns") # Petabits, just in case! - Do { $RawValue *= 1000 ; $i++ } While ( $RawValue -Lt 1 ) - # Return - [String][Math]::Round($RawValue, 2) + " " + $Labels[$i] - } - - Function Format-StandardDeviation { - Param ( - $RawValue - ) - If ($RawValue -Gt 0) { - $Sign = "+" - } - Else { - $Sign = "-" - } - # Return - $Sign + [String][Math]::Round([Math]::Abs($RawValue), 2) - } - - $HDD = Get-StorageNode | ?{$ENV:COMPUTERNAME -imatch ($_.name -split '\.')[0]} | Get-PhysicalDisk -PhysicallyConnected - - $Output = $HDD | ForEach-Object { + +Function Format-Latency { +Param ( +$RawValue +) +$i = 0 ; $Labels = ("s", "ms", "$([char]956)s", "ns") # Petabits, just in case! +Do { $RawValue *= 1000 ; $i++ } While ( $RawValue -Lt 1 ) +# Return +[String][Math]::Round($RawValue, 2) + " " + $Labels[$i] +} + +Function Format-StandardDeviation { +Param ( +$RawValue +) +If ($RawValue -Gt 0) { +$Sign = "+" +} +Else { +$Sign = "-" +} +# Return +$Sign + [String][Math]::Round([Math]::Abs($RawValue), 2) +} + +$HDD = Get-StorageNode | ?{$ENV:COMPUTERNAME -imatch ($_.name -split '\.')[0]} | Get-PhysicalDisk -PhysicallyConnected + +$Output = $HDD | ForEach-Object { $Iops = $_ | Get-ClusterPerf -PhysicalDiskSeriesName "PhysicalDisk.Iops.Total" -TimeFrame "LastWeek" $AvgIops = ($Iops | Measure-Object -Property Value -Average).Average - If ($AvgIops -Gt 0) { # Exclude idle or nearly idle drives - - $Latency = $_ | Get-ClusterPerf -PhysicalDiskSeriesName "PhysicalDisk.Latency.Average" -TimeFrame "LastWeek" - $AvgLatency = ($Latency | Measure-Object -Property Value -Average).Average - - [PsCustomObject]@{ - "FriendlyName" = $_.FriendlyName - "SerialNumber" = $_.SerialNumber - "MediaType" = $_.MediaType - "AvgLatencyPopulation" = $null # Set below - "AvgLatencyThisHDD" = Format-Latency $AvgLatency - "RawAvgLatencyThisHDD" = $AvgLatency - "Deviation" = $null # Set below - "RawDeviation" = $null # Set below - } - } - } - - If ($Output.Length -Ge 3) { # Minimum population requirement - - # Find mean u and standard deviation o - $u = ($Output | Measure-Object -Property RawAvgLatencyThisHDD -Average).Average - $d = $Output | ForEach-Object { ($_.RawAvgLatencyThisHDD - $u) * ($_.RawAvgLatencyThisHDD - $u) } - $o = [Math]::Sqrt(($d | Measure-Object -Sum).Sum / $Output.Length) - - $FoundOutlier = $False - - $Output | ForEach-Object { - $Deviation = ($_.RawAvgLatencyThisHDD - $u) / $o - $_.AvgLatencyPopulation = Format-Latency $u - $_.Deviation = Format-StandardDeviation $Deviation - $_.RawDeviation = $Deviation - # If distribution is Normal, expect >99% within 3 devations - If ($Deviation -Gt 3) { - $FoundOutlier = $True - } - } - } - - $Output +If ($AvgIops -Gt 0) { # Exclude idle or nearly idle drives + +$Latency = $_ | Get-ClusterPerf -PhysicalDiskSeriesName "PhysicalDisk.Latency.Average" -TimeFrame "LastWeek" +$AvgLatency = ($Latency | Measure-Object -Property Value -Average).Average + +[PsCustomObject]@{ +"FriendlyName" = $_.FriendlyName +"SerialNumber" = $_.SerialNumber +"MediaType" = $_.MediaType +"AvgLatencyPopulation" = $null # Set below +"AvgLatencyThisHDD" = Format-Latency $AvgLatency +"RawAvgLatencyThisHDD" = $AvgLatency +"Deviation" = $null # Set below +"RawDeviation" = $null # Set below +} +} +} + +If ($Output.Length -Ge 3) { # Minimum population requirement + +# Find mean u and standard deviation o +$u = ($Output | Measure-Object -Property RawAvgLatencyThisHDD -Average).Average +$d = $Output | ForEach-Object { ($_.RawAvgLatencyThisHDD - $u) * ($_.RawAvgLatencyThisHDD - $u) } +$o = [Math]::Sqrt(($d | Measure-Object -Sum).Sum / $Output.Length) + +$FoundOutlier = $False + +$Output | ForEach-Object { +$Deviation = ($_.RawAvgLatencyThisHDD - $u) / $o +$_.AvgLatencyPopulation = Format-Latency $u +$_.Deviation = Format-StandardDeviation $Deviation +$_.RawDeviation = $Deviation +# If distribution is Normal, expect >99% within 3 devations +If ($Deviation -Gt 3) { +$FoundOutlier = $True +} +} +} + +$Output } $o | Sort-Object PsComputerName | Export-Clixml ($using:Path + "latencyoutlier.xml") } catch { #Show-Warning("Unable to get latency outlier Data. `nError="+$_.Exception.Message) @@ -2994,11 +2994,11 @@ function Get-SddcDiagnosticInfo } catch { #Show-Warning("Unable to get Noisy neighbor Data. `nError="+$_.Exception.Message) } - - try { + +try { #Show-Update " Gathering Sample 4: As they say, 25-gig is the new 10-gig" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-4-as-they-say-25-gig-is-the-new-10-gig - $Cluster = Get-cluster + $Cluster = Get-cluster $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue $o = Invoke-Command $ClusterNodes.Name { @@ -3051,14 +3051,14 @@ function Get-SddcDiagnosticInfo catch { #Show-Warning("Unable to get 25gigisthenew10gig Data. `nError="+$_.Exception.Message) } - try { +try { #Show-Update " Gathering Sample 5: Make storage trendy again!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-6-memory-hog-you-can-run-but-you-cant-hide - Get-Volume | Where-Object FileSystem -Like "*CSV*" | %{$_ | Get-ClusterPerf -VolumeSeriesName "Volume.Size.Available" -TimeFrame "LastYear" | Sort-Object Time | Select-Object -Last 14} | Sort-Object ClusterNode | Export-Clixml ($using:Path + "trendyagain.xml") +Get-Volume | Where-Object FileSystem -Like "*CSV*" | %{$_ | Get-ClusterPerf -VolumeSeriesName "Volume.Size.Available" -TimeFrame "LastYear" | Sort-Object Time | Select-Object -Last 14} | Sort-Object ClusterNode | Export-Clixml ($using:Path + "trendyagain.xml") }catch { #Show-Warning("Unable to get Make storage trendy again! Data. `nError="+$_.Exception.Message) } - try { +try { #Show-Update " Gathering Sample 6: Memory hog, you can run but you can't hide" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-6-memory-hog-you-can-run-but-you-cant-hide $Output = Invoke-Command (Get-ClusterNode).Name { @@ -3094,20 +3094,20 @@ function Get-SddcDiagnosticInfo Show-Warning "Gathering Cluster Performance History failed" } } - Show-Update "AzureStack HCI info" - #Added by JG - try { - If ((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){ - Get-AzureStackHCI| Export-Clixml ($Path + "GetAzureStackHCI.xml") - Get-AzureStackHCIArcIntegration| Export-Clixml ($Path + "AzureStackHCIArcIntegration.xml") - } - } catch { - Show-Warning("Unable to get AzureStack HCI info. `nError="+$_.Exception.Message) - } - - - Show-Update "Start gather of Cluster Performance information..." - +Show-Update "AzureStack HCI info" +#Added by JG +try { +If ((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){ +Get-AzureStackHCI| Export-Clixml ($Path + "GetAzureStackHCI.xml") +Get-AzureStackHCIArcIntegration| Export-Clixml ($Path + "AzureStackHCIArcIntegration.xml") +} +} catch { +Show-Warning("Unable to get AzureStack HCI info. `nError="+$_.Exception.Message) +} + + + Show-Update "Start gather of Cluster Performance information..." + #### @@ -3147,24 +3147,24 @@ function Get-SddcDiagnosticInfo Show-Update "Start monitoring $($PerfSamples)s" -ForegroundColor Green $PerfProc = Start-Process -WindowStyle Hidden -FilePath "powershell.exe" -ArgumentList @("-Command", """& {Get-Counter -Counter (Get-Counter -ListSet 'Cluster Storage*','Cluster CSV*','Storage Spaces*','Refs','Cluster Disk Counters','PhysicalDisk','RDMA*','Mellanox*','Marvell*','Hyper-V Hypervisor Virtual Processor','Hyper-V Hypervisor Logical Processor','Hyper-V Hypervisor Root Virtual Processor' -ComputerName (Get-ClusterNode).Name -ErrorAction SilentlyContinue).paths -SampleInterval 1 -MaxSamples $PerfSamples -ErrorAction Ignore -WarningAction Ignore | Export-counter -Path ('$Path' + '\GetCounters.blg') -Force -FileFormat BLG}""") -Passthru Show-WaitChildJob $JobStatic 30 - $JobStatic | % {if ($_.Name -ne "Cluster Performance History" -and $_.Name -notlike "ClusterLogs*") { $o=Receive-Job $_; If ($o) {Write-Host "Job $($_.Name) Output:";$o}}} +$JobStatic | % {if ($_.Name -ne "Cluster Performance History" -and $_.Name -notlike "ClusterLogs*") { $o=Receive-Job $_; If ($o) {Write-Host "Job $($_.Name) Output:";$o}}} Remove-Job $JobStatic - Show-Update "Copying cluster logs." +Show-Update "Copying cluster logs." Foreach ($NodeName in ((Get-ClusterNode).Name)) { $NodeSystemRootPath = Invoke-Command -ComputerName $NodeName { $env:SystemRoot } - try { - $RPath = (Get-AdminSharePathFromLocal $NodeName "$NodeSystemRootPath\Cluster\Reports\cluster*.log") - $RepFiles = Get-ChildItem -Path $RPath -Recurse -ErrorAction SilentlyContinue | Sort LastWriteTime} - catch { $RepFiles = ""; Show-Warning "Unable to get reports for node $NodeName" } - $RepFiles |% { - $DestPath=(Join-Path $Path $NodeName)+"_$($_.Name)" - If (($_.Name -eq "Cluster.log" -or $_.Name -eq "ClusterHealth.log") -and -not (Test-Path $DestPath)) { - try { Copy-Item $_.FullName $DestPath } - catch { Show-Warning "Could not copy report file $($_.FullName)" } + try { + $RPath = (Get-AdminSharePathFromLocal $NodeName "$NodeSystemRootPath\Cluster\Reports\cluster*.log") + $RepFiles = Get-ChildItem -Path $RPath -Recurse -ErrorAction SilentlyContinue | Sort LastWriteTime} + catch { $RepFiles = ""; Show-Warning "Unable to get reports for node $NodeName" } +$RepFiles |% { +$DestPath=(Join-Path $Path $NodeName)+"_$($_.Name)" +If (($_.Name -eq "Cluster.log" -or $_.Name -eq "ClusterHealth.log") -and -not (Test-Path $DestPath)) { + try { Copy-Item $_.FullName $DestPath } + catch { Show-Warning "Could not copy report file $($_.FullName)" } } } - } +} if (Get-Member -InputObject $JobStatic ActiveSessions) { Remove-PSSession -Id $JobStatic.ActiveSessions @@ -3318,13 +3318,13 @@ function Get-SddcDiagnosticInfo $setPaths = (Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk","RDMA*","Mellanox*","Marvell*","Hyper-V Hypervisor Virtual Processor" -ComputerName $ClusterNodes.Name -ErrorAction SilentlyContinue).paths Show-Update "Start monitoring ($($PerfSamples)s) per node. Total est. time $($PerfSamples*2*($ClusterNodes.count-1))s" #$set = Get-Counter -ListSet "Cluster Storage*","Cluster CSV*","Storage Spaces*","Refs","Cluster Disk Counters","PhysicalDisk","RDMA*","Mellanox*","Marvell*","Hyper-V Hypervisor Virtual Processor" -ErrorAction SilentlyContinue - $CounterJobs=@() - $PerfRaw=$null - $CounterJobs+=Start-Job -Name "CounterJob" -ScriptBlock { - Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:PerfSamples -ErrorAction Ignore -WarningAction Ignore - } + $CounterJobs=@() + $PerfRaw=$null + $CounterJobs+=Start-Job -Name "CounterJob" -ScriptBlock { +Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:PerfSamples -ErrorAction Ignore -WarningAction Ignore + } Show-WaitChildJob $CounterJobs 30 - $CounterJobs | %{$PerfRaw=$PerfRaw+(Receive-Job $_ -AutoRemoveJob)} + $CounterJobs | %{$PerfRaw=$PerfRaw+(Receive-Job $_ -AutoRemoveJob)} #$PerfRaw = Get-Counter -Counter $set.Paths -SampleInterval 1 -MaxSamples $PerfSamples -ErrorAction Ignore -WarningAction Ignore Show-Update "Exporting counters" From be1ff047dc22d963589fb824dcdaaf4038be8022 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 6 Oct 2023 14:37:01 -0500 Subject: [PATCH 083/127] Update 4 Show error on zip file failure --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 | 2 +- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 8b98b7e..3fc09ca 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.3' +ModuleVersion = '1.3355.4' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 8957c50..5d653f6 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -3527,7 +3527,7 @@ Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:Per Remove-Item -Path $Path -ErrorAction SilentlyContinue -Recurse } catch { - Show-Error("Error creating the ZIP file!`nContent remains available at $Path") + Show-Error("Error creating the ZIP file!`nContent remains available at $Path",$Error[0]) } Show-Update "Cleaning up CimSessions" From 0184933e58fc08f4923b8e915da145c80ee41c8c Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 6 Oct 2023 15:36:38 -0500 Subject: [PATCH 084/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index f02556c..6501488 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2881,6 +2881,7 @@ Show-Update "Cluster Performance History" $Cluster = Get-cluster $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue $o = Invoke-Command $ClusterNodes.Name { + Function Format-Latency { Param ( $RawValue @@ -2909,7 +2910,6 @@ $HDD = Get-StorageNode | ?{$ENV:COMPUTERNAME -imatch ($_.name -split '\.')[0]} | $Output = $HDD | ForEach-Object { - $Iops = $_ | Get-ClusterPerf -PhysicalDiskSeriesName "PhysicalDisk.Iops.Total" -TimeFrame "LastWeek" $AvgIops = ($Iops | Measure-Object -Property Value -Average).Average @@ -3527,7 +3527,7 @@ Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:Per Remove-Item -Path $Path -ErrorAction SilentlyContinue -Recurse } catch { - Show-Error("Error creating the ZIP file!`nContent remains available at $Path",$Error[0]) + Show-Error "Error creating the ZIP file!`nContent remains available at $Path" $Error[0] } Show-Update "Cleaning up CimSessions" From 509f3e421414989d55addf6a347cb0aabe5655d1 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 6 Oct 2023 15:53:12 -0500 Subject: [PATCH 085/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 6501488..bb3245d 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -3527,7 +3527,7 @@ Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:Per Remove-Item -Path $Path -ErrorAction SilentlyContinue -Recurse } catch { - Show-Error "Error creating the ZIP file!`nContent remains available at $Path" $Error[0] + Show-Error "Error creating the ZIP file!`nContent remains available at $Path" $Error[1] } Show-Update "Cleaning up CimSessions" From b4ef7d29cb5b2b9f2d7a4b2f6ad89048aa4754e4 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:14:21 -0500 Subject: [PATCH 086/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index bb3245d..3ea954b 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2246,7 +2246,7 @@ Start-Process -FilePath "$env:comspec" -ArgumentList "/c SystemInfo.exe /S $usin #$MSINFO32Out=(Join-Path (Get-NodePath $using:Path $using:NodeName) "MSINFO32.NFO") #Start-Process -FilePath "$env:comspec" -ArgumentList "/c MSINFO32.exe /nfo $MSINFO32Out /Computer $using:NodeName" -WindowStyle Hidden -Wait $LocalFileMsInfo = (Join-Path $LocalNodeDir "\msinfo.nfo") -Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer $using:NodeName /nfo $LocalFileMsInfo" # -Wait +$msinfo=Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer $using:NodeName /nfo $LocalFileMsInfo" -PassThru # -Wait # Cmdlets to drop in TXT and XML forms # @@ -2455,6 +2455,7 @@ $RepFiles |% { } + While (-not ($msinfo.HasExited)) {Sleep -Milliseconds 100} } } From beef481c63134499d02b3a2f355ae78e01782746 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:16:39 -0500 Subject: [PATCH 087/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 3ea954b..f47d8af 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -3528,7 +3528,8 @@ Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:Per Remove-Item -Path $Path -ErrorAction SilentlyContinue -Recurse } catch { - Show-Error "Error creating the ZIP file!`nContent remains available at $Path" $Error[1] + Show-Error "$($Error[0])" + Show-Error "Error creating the ZIP file!`nContent remains available at $Path" } Show-Update "Cleaning up CimSessions" From 4ce4311f9a530dffe4413eb3c498075b0a744adc Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:32:02 -0500 Subject: [PATCH 088/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index f47d8af..18edf6d 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2455,7 +2455,7 @@ $RepFiles |% { } - While (-not ($msinfo.HasExited)) {Sleep -Milliseconds 100} + While ((Get-Process msinfo32 -ErrorAction SilentlyContinue).count) {Sleep -Milliseconds 100} } } @@ -3528,7 +3528,7 @@ Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:Per Remove-Item -Path $Path -ErrorAction SilentlyContinue -Recurse } catch { - Show-Error "$($Error[0])" + Show-Warning "Error=$($_.Exception.Message)" Show-Error "Error creating the ZIP file!`nContent remains available at $Path" } From ac2f228d3bf3d88ee5eecc9d09d88cce037c4633 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Tue, 10 Oct 2023 15:42:23 -0500 Subject: [PATCH 089/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 18edf6d..d1eefef 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2455,7 +2455,7 @@ $RepFiles |% { } - While ((Get-Process msinfo32 -ErrorAction SilentlyContinue).count) {Sleep -Milliseconds 100} + While ($msinfo.HasExited -ne $True) {Sleep -Milliseconds 100} } } From 1a406b19fa7b434851255e10bb14e92fa4acf026 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 13 Oct 2023 16:05:15 -0500 Subject: [PATCH 090/127] Update 4b #Add one hour timeout for jobs --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 1 + 1 file changed, 1 insertion(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index d1eefef..08e28e9 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -166,6 +166,7 @@ $CommonFuncBlock = { $t = get-date $j |? State -eq Running |% { $job_running += "Running: $($jobname) [$($_.Name) $($_.Location)]: $(TimespanToString ($t - $_.PSBeginTime)) : Start $($_.PSBeginTime.ToString('s'))" + if (($t - $_.PSBeginTime).TotalMinutes -gt 60) {Stop-Job -Name "$($_.Name)";Write-Host "Job $($_.Name) exceeded time limit" -ForegroundColor Yellow} } } } From 2ce419ed40d60425cccbc99e45c2e177d41ebd82 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 13 Oct 2023 16:20:18 -0500 Subject: [PATCH 091/127] Update 4c #better description of stopped job --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 08e28e9..0509213 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -166,7 +166,7 @@ $CommonFuncBlock = { $t = get-date $j |? State -eq Running |% { $job_running += "Running: $($jobname) [$($_.Name) $($_.Location)]: $(TimespanToString ($t - $_.PSBeginTime)) : Start $($_.PSBeginTime.ToString('s'))" - if (($t - $_.PSBeginTime).TotalMinutes -gt 60) {Stop-Job -Name "$($_.Name)";Write-Host "Job $($_.Name) exceeded time limit" -ForegroundColor Yellow} + if (($t - $_.PSBeginTime).TotalMinutes -gt 60) {Stop-Job -Name "$($_.Name)";Write-Host "Job $jobname exceeded time limit" -ForegroundColor Yellow} } } } From a3d1b858948e449b284fb78e66345363d5a0f5c4 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Sat, 14 Oct 2023 23:58:20 -0500 Subject: [PATCH 092/127] Update 4e #reqauire administrator --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 0509213..59710c3 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1,3 +1,4 @@ +#Requires -RunAsAdministrator <################################################### # # # Copyright (c) Microsoft. All rights reserved. # @@ -1165,6 +1166,7 @@ Null if default configuration is to be used. function Get-SddcDiagnosticInfo { + #Requires -RunAsAdministrator # aliases usage in this module is idiomatic, only using defaults [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingCmdletAliases", "")] From b0725392a9247787593353f0534e64a431652c66 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Sun, 15 Oct 2023 00:21:48 -0500 Subject: [PATCH 093/127] Update 4d #run as admin enahanced --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 59710c3..ec67e15 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1166,7 +1166,10 @@ Null if default configuration is to be used. function Get-SddcDiagnosticInfo { - #Requires -RunAsAdministrator + #check for Administrator + If (-not (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))) { + Write-Error "Please run this function as an administrator";exit + } # aliases usage in this module is idiomatic, only using defaults [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingCmdletAliases", "")] From 6f983ad9d26ff0724711ce2b5c1ccaa101a98970 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Sun, 15 Oct 2023 00:28:06 -0500 Subject: [PATCH 094/127] Update 4e #moved check for admin --- .../PrivateCloud.DiagnosticInfo.psm1 | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index ec67e15..2452e5c 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1166,10 +1166,6 @@ Null if default configuration is to be used. function Get-SddcDiagnosticInfo { - #check for Administrator - If (-not (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))) { - Write-Error "Please run this function as an administrator";exit - } # aliases usage in this module is idiomatic, only using defaults [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingCmdletAliases", "")] @@ -1627,6 +1623,11 @@ function Get-SddcDiagnosticInfo StartMonitoring } + #check for Administrator + If (-not (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))) { + Write-Error "Please run this function as an administrator";exit + } + if ($MonitoringMode) { StartMonitoring } From d890b33d61d315d2abb53615f45c53d4bf0e4a3e Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Wed, 18 Oct 2023 16:34:42 -0500 Subject: [PATCH 095/127] Remove bytes convertion for network.bandwidth --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 04af25a..91f6606 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -3023,10 +3023,10 @@ try { $LinkSpeed = $_.LinkSpeed $MeasureInbound = $Inbound | Measure-Object -Property Value -Maximum - $MaxInbound = $MeasureInbound.Maximum * 8 # Multiply to bits/sec + $MaxInbound = $MeasureInbound.Maximum $MeasureOutbound = $Outbound | Measure-Object -Property Value -Maximum - $MaxOutbound = $MeasureOutbound.Maximum * 8 # Multiply to bits/sec + $MaxOutbound = $MeasureOutbound.Maximum $Saturated = $False From bb01a35a8fe7b7664086c37810f8541d3c6ca36b Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 3 Nov 2023 14:49:10 -0500 Subject: [PATCH 096/127] Update 5 #change counters to get less Mellenox and all Storage Replica counters --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 5791c8e..89ce494 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -3153,7 +3153,7 @@ Show-Warning("Unable to get AzureStack HCI info. `nError="+$_.Exception.Message Show-Update "Completing background gathers ..." -ForegroundColor Green Show-Update "Start monitoring $($PerfSamples)s" -ForegroundColor Green - $PerfProc = Start-Process -WindowStyle Hidden -FilePath "powershell.exe" -ArgumentList @("-Command", """& {Get-Counter -Counter (Get-Counter -ListSet 'Cluster Storage*','Cluster CSV*','Storage Spaces*','Refs','Cluster Disk Counters','PhysicalDisk','RDMA*','Mellanox*','Marvell*','Hyper-V Hypervisor Virtual Processor','Hyper-V Hypervisor Logical Processor','Hyper-V Hypervisor Root Virtual Processor' -ComputerName (Get-ClusterNode).Name -ErrorAction SilentlyContinue).paths -SampleInterval 1 -MaxSamples $PerfSamples -ErrorAction Ignore -WarningAction Ignore | Export-counter -Path ('$Path' + '\GetCounters.blg') -Force -FileFormat BLG}""") -Passthru + $PerfProc = Start-Process -WindowStyle Hidden -FilePath "powershell.exe" -ArgumentList @("-Command", """& {Get-Counter -Counter (Get-Counter -ListSet 'Cluster Storage*','Cluster CSV*','Storage Spaces*','Storage Replica*','Refs','Cluster Disk Counters','PhysicalDisk','RDMA*','Mellanox WinOF-2 Port Traffic*','Mellanox WinOF-2 Congestion Control*','Mellanox WinOF-2 Diagnostics Ext 1*','Marvell*','Hyper-V Hypervisor Virtual Processor','Hyper-V Hypervisor Logical Processor','Hyper-V Hypervisor Root Virtual Processor' -ComputerName (Get-ClusterNode).Name -ErrorAction SilentlyContinue).paths -SampleInterval 1 -MaxSamples $PerfSamples -ErrorAction Ignore -WarningAction Ignore | Export-counter -Path ('$Path' + '\GetCounters.blg') -Force -FileFormat BLG}""") -Passthru Show-WaitChildJob $JobStatic 30 $JobStatic | % {if ($_.Name -ne "Cluster Performance History" -and $_.Name -notlike "ClusterLogs*") { $o=Receive-Job $_; If ($o) {Write-Host "Job $($_.Name) Output:";$o}}} Remove-Job $JobStatic From 1ef9e1925b89208292bb85536fbe514a6230f965 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 3 Nov 2023 14:58:01 -0500 Subject: [PATCH 097/127] Update 5 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 3fc09ca..c1cd9c1 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.4' +ModuleVersion = '1.3355.5' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' From 052edc23ea1944d5645d690d3e58cf4ed0416e09 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 3 Nov 2023 17:51:51 -0500 Subject: [PATCH 098/127] Update 5b #adding get-clusteraffinityrule --- .../PrivateCloud.DiagnosticInfo.psm1 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 89ce494..c6c1211 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1952,7 +1952,14 @@ Write-host "Dell SDDC Version" catch { Write-Warning "Unable to get ClusterFaultDomain. `nError=$($_.Exception.Message)" } } - + $JobStatic += start-job -Name GetClusterFaultDomain { + try { + $o = Get-ClusterAffinityRule | select * + $o | Export-Clixml ($using:Path + "GetClusterAffinityRule.XML") + } + catch { Write-Warning "Unable to get ClusterFaultDomain. `nError=$($_.Exception.Message)" + } + } Show-Update "Start gather of Network ATC information..." $NetworkATC=$False $NetworkATC=try {(Get-WindowsFeature NetworkATC).installed} catch {$False} From 02a6e04fbbec577e14ef67a56c42ccf717e6dbe5 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 3 Nov 2023 17:53:27 -0500 Subject: [PATCH 099/127] Update 5b ClusterAffinityRule --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index c6c1211..1c0826b 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1957,7 +1957,7 @@ Write-host "Dell SDDC Version" $o = Get-ClusterAffinityRule | select * $o | Export-Clixml ($using:Path + "GetClusterAffinityRule.XML") } - catch { Write-Warning "Unable to get ClusterFaultDomain. `nError=$($_.Exception.Message)" + catch { Write-Warning "Unable to get ClusterAffinityRule. `nError=$($_.Exception.Message)" } } Show-Update "Start gather of Network ATC information..." From 5ca1e5e38ab96b4f72fd0041975def10644233b4 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 3 Nov 2023 18:02:52 -0500 Subject: [PATCH 100/127] Update 5b Cluster affinity rules --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 1c0826b..8ece3e1 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1952,7 +1952,7 @@ Write-host "Dell SDDC Version" catch { Write-Warning "Unable to get ClusterFaultDomain. `nError=$($_.Exception.Message)" } } - $JobStatic += start-job -Name GetClusterFaultDomain { + $JobStatic += start-job -Name GetlusterAffinityRule { try { $o = Get-ClusterAffinityRule | select * $o | Export-Clixml ($using:Path + "GetClusterAffinityRule.XML") From a262084afbe12a1a13444aee6f92ecfe246fe3c8 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Mon, 18 Dec 2023 14:06:08 -0600 Subject: [PATCH 101/127] Update 5c Update 5c --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 8ece3e1..85e59c8 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1952,7 +1952,7 @@ Write-host "Dell SDDC Version" catch { Write-Warning "Unable to get ClusterFaultDomain. `nError=$($_.Exception.Message)" } } - $JobStatic += start-job -Name GetlusterAffinityRule { + $JobStatic += start-job -Name GetClusterAffinityRule { try { $o = Get-ClusterAffinityRule | select * $o | Export-Clixml ($using:Path + "GetClusterAffinityRule.XML") From 44231440318ca90676bc590420c4f4242fb71d27 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Thu, 29 Feb 2024 17:36:46 -0600 Subject: [PATCH 102/127] Update 6 #Get-NetFirewallRule -All --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 | 2 +- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index c1cd9c1..3d6bc65 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.5' +ModuleVersion = '1.3355.6' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 85e59c8..9219b04 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2261,6 +2261,8 @@ Start-Process -FilePath "$env:comspec" -ArgumentList "/c SystemInfo.exe /S $usin #Start-Process -FilePath "$env:comspec" -ArgumentList "/c MSINFO32.exe /nfo $MSINFO32Out /Computer $using:NodeName" -WindowStyle Hidden -Wait $LocalFileMsInfo = (Join-Path $LocalNodeDir "\msinfo.nfo") $msinfo=Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer $using:NodeName /nfo $LocalFileMsInfo" -PassThru # -Wait +#$LocalFileFWInfo = (Join-Path $LocalNodeDir "\FirewallRules.xml") +#netsh wfp show filters file = "$LocalFileFWInfo" # Cmdlets to drop in TXT and XML forms # @@ -2317,6 +2319,7 @@ $msinfo=Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer 'Invoke-Command -ComputerName _C_ {Echo Get-MSDSMSupportedHW;IF((Get-WindowsFeature -Name "Multipath-IO").Installed -eq "True"){Get-MSDSMSupportedHW -CimSession _C_}}', 'Invoke-Command -ComputerName _C_ {Echo Get-DriverSuiteVersion;Get-ChildItem HKLM:\SOFTWARE\Dell\MUP -Recurse | Get-ItemProperty}', 'Invoke-Command -ComputerName _C_ {Echo Get-ChipsetVersion;Get-WmiObject win32_product | ? Name -like "*chipset*"}', +'Invoke-Command -ComputerName _C_ {Echo Get-NetFirewallRule;Get-NetFirewallRule -All}', 'Invoke-Command -ComputerName _C_ {Echo Get-ProcessByService;$aps=GPs;$r=@();$Ass=GWmi Win32_Service;foreach($p in $aps){$ss=$Ass|?{$_.ProcessID -eq $p.Id};IF($ss){$r+=[PSCustomObject]@{Service=$ss.DisplayName;ProcessName=$p.ProcessName;ProcessID=$p.Id}}}$r}', 'Get-NetNeighbor -CimSession _C_', 'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' From 44c29d194cc5dd637e32314cde19de3ad25dbd55 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Wed, 6 Mar 2024 16:28:41 -0600 Subject: [PATCH 103/127] Update 7 #Adding new parameter RunCluChk --- .../PrivateCloud.DiagnosticInfo.psd1 | 2 +- .../PrivateCloud.DiagnosticInfo.psm1 | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 3d6bc65..5b077a2 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.6' +ModuleVersion = '1.3355.7' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 9219b04..b964752 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1158,6 +1158,10 @@ Include a performance counter capture. Include Storage Reliability counters. This may incur a short but observable latency cost on the physical disks due to varying overhead in their internal handling of SMART queries. +.PARAMETER RunCluChk +Downloads and runs the latest Dell CluChk utility. It saves a copy in the report as well as the access +nodes C:\Windows\Cluster\Reports folder. + .PARAMETER SessionConfigurationName SessionConfigurationName to connect to other nodes in cluster. Null if default configuration is to be used. @@ -1314,6 +1318,10 @@ function Get-SddcDiagnosticInfo [parameter(ParameterSetName="WriteN", Mandatory=$false)] [switch] $IncludeReliabilityCounters, + [parameter(ParameterSetName="WriteC", Mandatory=$false)] + [parameter(ParameterSetName="WriteN", Mandatory=$false)] + [switch] $RunCluChk, + [parameter(ParameterSetName="WriteC", Mandatory=$false)] [parameter(ParameterSetName="WriteN", Mandatory=$false)] [string] $SessionConfigurationName = $null @@ -3506,6 +3514,32 @@ Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:Per Stop-Transcript } + If ($RunCluChk) { + Show-Update "Running CluChk" -ForegroundColor Green + $url = 'https://gsetools.blob.core.windows.net/cluchk/CluChk.ps1.remove?sv=2020-10-02&si=ReadAccess&sr=b&sig=BpFR0jPXaQUNNATR7%2FqNj7CXjNw9bJH8jmeX0melJxM%3D' + $start_time = Get-Date + Try{Invoke-WebRequest -Uri $url -UseDefaultCredentials + } + Catch{Write-Host "ERROR: Source location NOT accessible. Please try again later"-foregroundcolor Red + } + Finally{ + $xtimer=0 + Invoke-Command -ScriptBlock {$wc = New-Object System.Net.WebClient;$wc.UseDefaultCredentials = $true;Invoke-Expression ($wc.DownloadString($using:url).Replace('$runType = 0','$runType = 3').Replace('$SDDCInputFolder = ''''',"`$SDDCInputFolder='$using:Path'"))} -AsJob -ComputerName (hostname) -JobName "RunCluChk" + Do { + Sleep 2 + Get-Job | Receive-Job + $xtimer++ + } While ((Get-Job "RunCluChk").State -ne "Completed" -and $xtimer -lt 400) + } + Get-Job | Remove-Job + $CluChkFile=gci "$(Split-Path $Path -parent)\CluChkreport*" -ErrorAction SilentlyContinue + $NodeSystemRootPath = Invoke-Command -ComputerName $AccessNode -ConfigurationName $SessionConfigurationName { $env:SystemRoot } + If ($CluChkFile) { + Copy-Item $CluChkFile -Destination "$NodeSystemRootPath\Cluster\Reports" -ToSession (New-PSSession -ComputerName $AccessNode) + Copy-Item $CluChkFile -Destination $Path + } + } + # # Phase 4 # From a75addf91dfa9cc154f12afd593ccd08f4733298 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Wed, 6 Mar 2024 16:57:49 -0600 Subject: [PATCH 104/127] Update 7a #Added RunCluChk parameter. #Added Force to Remove Job to avoid an error. --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index b964752..b7a4e94 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -3531,7 +3531,7 @@ Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:Per $xtimer++ } While ((Get-Job "RunCluChk").State -ne "Completed" -and $xtimer -lt 400) } - Get-Job | Remove-Job + Get-Job | Remove-Job -Force $CluChkFile=gci "$(Split-Path $Path -parent)\CluChkreport*" -ErrorAction SilentlyContinue $NodeSystemRootPath = Invoke-Command -ComputerName $AccessNode -ConfigurationName $SessionConfigurationName { $env:SystemRoot } If ($CluChkFile) { From d4e57b0bd9f3043f8bd21df9c39d949ba0e092e8 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Tue, 19 Mar 2024 15:23:30 -0500 Subject: [PATCH 105/127] Update 7b # Get-ClusterNodeSupportedVersion --- .../PrivateCloud.DiagnosticInfo.psm1 | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index b7a4e94..cfbacc7 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1968,6 +1968,15 @@ Write-host "Dell SDDC Version" catch { Write-Warning "Unable to get ClusterAffinityRule. `nError=$($_.Exception.Message)" } } + $JobStatic += start-job -Name ClusterNodeSupportedVersion { + try { + $o = Get-ClusterNodeSupportedVersion -Cluster $using:AccessNode + $o | Export-Clixml ($using:Path + "GetClusterNodeSupportedVersion.XML") + } + catch { Write-Warning "Unable to get Cluster Node Supported Version `nError=$($_.Exception.Message)" + } + } + Show-Update "Start gather of Network ATC information..." $NetworkATC=$False $NetworkATC=try {(Get-WindowsFeature NetworkATC).installed} catch {$False} From 2fe9a5af245e92506bd577fa30c00a9b378ebb87 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Tue, 19 Mar 2024 15:29:25 -0500 Subject: [PATCH 106/127] Update 7c #Get-ClusterNodeSupportedVersion --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index cfbacc7..351ba54 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1970,7 +1970,7 @@ Write-host "Dell SDDC Version" } $JobStatic += start-job -Name ClusterNodeSupportedVersion { try { - $o = Get-ClusterNodeSupportedVersion -Cluster $using:AccessNode + $o = Get-ClusterNodeSupportedVersion $o | Export-Clixml ($using:Path + "GetClusterNodeSupportedVersion.XML") } catch { Write-Warning "Unable to get Cluster Node Supported Version `nError=$($_.Exception.Message)" From 4754f07f566547c743240f2aa6976bec3d9c859f Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Wed, 20 Mar 2024 14:29:53 -0500 Subject: [PATCH 107/127] Update 7d #Run cluchk --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 351ba54..49f875f 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -3545,7 +3545,7 @@ Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:Per $NodeSystemRootPath = Invoke-Command -ComputerName $AccessNode -ConfigurationName $SessionConfigurationName { $env:SystemRoot } If ($CluChkFile) { Copy-Item $CluChkFile -Destination "$NodeSystemRootPath\Cluster\Reports" -ToSession (New-PSSession -ComputerName $AccessNode) - Copy-Item $CluChkFile -Destination $Path + Copy-Item $CluChkFile -Destination "$Path\CluChk.html" } } From 9b9eebb65dd55c831d196105dc32f18013cb86ea Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:52:43 -0500 Subject: [PATCH 108/127] Update 7f Update 7f --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 49f875f..1956168 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -3533,7 +3533,7 @@ Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:Per } Finally{ $xtimer=0 - Invoke-Command -ScriptBlock {$wc = New-Object System.Net.WebClient;$wc.UseDefaultCredentials = $true;Invoke-Expression ($wc.DownloadString($using:url).Replace('$runType = 0','$runType = 3').Replace('$SDDCInputFolder = ''''',"`$SDDCInputFolder='$using:Path'"))} -AsJob -ComputerName (hostname) -JobName "RunCluChk" + Invoke-Command -ScriptBlock {Invoke-Expression('$module="RunCluChk";$repo="PowershellScripts"'+(new-object net.webclient).DownloadString('https://raw.githubusercontent.com/DellProSupportGse/source/main/cluchk.ps1').Replace('$runType = 0','$runType = 3').Replace('$SDDCInputFolder = ''''',"`$SDDCInputFolder='$using:Path'"));Invoke-RunCluChk} -AsJob -ComputerName (hostname) -JobName "RunCluChk" Do { Sleep 2 Get-Job | Receive-Job From 036a3d3c793525f10a4b1d00fea773f720cd8fff Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:57:14 -0500 Subject: [PATCH 109/127] Update 7.1 Update 7.1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 5b077a2..a175ff5 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.7' +ModuleVersion = '1.3355.7.1' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' From 59661db137b9419e557b12b14446cce702e7035b Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 5 Apr 2024 14:17:54 -0500 Subject: [PATCH 110/127] Update 7.1b Update 7.1b --- .../PrivateCloud.DiagnosticInfo.psm1 | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 1956168..a76743c 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -3525,21 +3525,13 @@ Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:Per If ($RunCluChk) { Show-Update "Running CluChk" -ForegroundColor Green - $url = 'https://gsetools.blob.core.windows.net/cluchk/CluChk.ps1.remove?sv=2020-10-02&si=ReadAccess&sr=b&sig=BpFR0jPXaQUNNATR7%2FqNj7CXjNw9bJH8jmeX0melJxM%3D' - $start_time = Get-Date - Try{Invoke-WebRequest -Uri $url -UseDefaultCredentials - } - Catch{Write-Host "ERROR: Source location NOT accessible. Please try again later"-foregroundcolor Red - } - Finally{ $xtimer=0 - Invoke-Command -ScriptBlock {Invoke-Expression('$module="RunCluChk";$repo="PowershellScripts"'+(new-object net.webclient).DownloadString('https://raw.githubusercontent.com/DellProSupportGse/source/main/cluchk.ps1').Replace('$runType = 0','$runType = 3').Replace('$SDDCInputFolder = ''''',"`$SDDCInputFolder='$using:Path'"));Invoke-RunCluChk} -AsJob -ComputerName (hostname) -JobName "RunCluChk" + Invoke-Command -ScriptBlock {Invoke-Expression('$module="RunCluChk";$repo="PowershellScripts"'+(new-object net.webclient).DownloadString('https://raw.githubusercontent.com/DellProSupportGse/source/main/cluchk.ps1'));Invoke-RunCluChk -SDDCInputFolder "$using:Path" -runType 3} -AsJob -ComputerName (hostname) -JobName "RunCluChk" Do { Sleep 2 Get-Job | Receive-Job $xtimer++ } While ((Get-Job "RunCluChk").State -ne "Completed" -and $xtimer -lt 400) - } Get-Job | Remove-Job -Force $CluChkFile=gci "$(Split-Path $Path -parent)\CluChkreport*" -ErrorAction SilentlyContinue $NodeSystemRootPath = Invoke-Command -ComputerName $AccessNode -ConfigurationName $SessionConfigurationName { $env:SystemRoot } From f3560b44c684be1176551063df7492f9490cef84 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 9 May 2024 14:47:04 -0500 Subject: [PATCH 111/127] Update PrivateCloud.DiagnosticInfo.psm1 JG: Added RunCluChk job clean up --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index a76743c..5db2294 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -3525,6 +3525,8 @@ Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:Per If ($RunCluChk) { Show-Update "Running CluChk" -ForegroundColor Green + #Added job clean up + If(Get-Job -Name "RunCluChk" -ErrorAction SilentlyContinue ){Stop-Job -Name "RunCluChk" -ErrorAction SilentlyContinue ;Remove-Job -Name "RunCluChk" -Force} $xtimer=0 Invoke-Command -ScriptBlock {Invoke-Expression('$module="RunCluChk";$repo="PowershellScripts"'+(new-object net.webclient).DownloadString('https://raw.githubusercontent.com/DellProSupportGse/source/main/cluchk.ps1'));Invoke-RunCluChk -SDDCInputFolder "$using:Path" -runType 3} -AsJob -ComputerName (hostname) -JobName "RunCluChk" Do { @@ -3532,7 +3534,7 @@ Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:Per Get-Job | Receive-Job $xtimer++ } While ((Get-Job "RunCluChk").State -ne "Completed" -and $xtimer -lt 400) - Get-Job | Remove-Job -Force + Get-Job "RunCluChk" | Remove-Job "RunCluChk" -Force $CluChkFile=gci "$(Split-Path $Path -parent)\CluChkreport*" -ErrorAction SilentlyContinue $NodeSystemRootPath = Invoke-Command -ComputerName $AccessNode -ConfigurationName $SessionConfigurationName { $env:SystemRoot } If ($CluChkFile) { From ffcf194f2544c4a10975326b83be94aedd97cacb Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Thu, 23 May 2024 13:29:42 -0500 Subject: [PATCH 112/127] Update PrivateCloud.DiagnosticInfo.psm1 added Get-NetAdapterStatistics --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 5db2294..aa5212f 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2300,6 +2300,7 @@ $msinfo=Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer 'Get-NetAdapterRsc -CimSession _C_', 'Get-NetAdapterRss -CimSession _C_', 'Get-NetAdapterVmq -CimSession _C_', + 'Get-NetAdapterStatistics -CimSession _C_', 'Get-NetIPv4Protocol -CimSession _C_', 'Get-NetIPv6Protocol -CimSession _C_', 'Get-NetIpAddress -CimSession _C_', @@ -2309,7 +2310,7 @@ $msinfo=Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer 'Get-NetOffloadGlobalSetting -CimSession _C_', 'Get-NetPrefixPolicy -CimSession _C_', 'Get-NetQosPolicy -CimSession _C_', -'Get-NetAdapterQos -CimSession _C_', + 'Get-NetAdapterQos -CimSession _C_', 'Get-NetRoute -CimSession _C_', 'Get-Disk -CimSession _C_', 'Get-NetTcpConnection -CimSession _C_', From fdbcd549041cd64b23502535d781ba44676d87c0 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Wed, 12 Jun 2024 13:07:22 -0500 Subject: [PATCH 113/127] Update 7.2 # --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 | 2 +- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index a175ff5..9479966 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.7.1' +ModuleVersion = '1.3355.7.2' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index a76743c..b25e8de 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -1564,7 +1564,7 @@ function Get-SddcDiagnosticInfo $SmbShares = Get-SmbShare -CimSession $AccessNode $Associations = Get-VirtualDisk -CimSession $AccessNode |% { - $o = $_ | Select-Object FriendlyName, CSVName, CSVNode, CSVPath, CSVVolume, + $o = $_ | Select-Object FriendlyName, CSVName, CSVNode, CSVPath, CSVFS,CSVVolume, ShareName, SharePath, VolumeID, PoolName, VDResiliency, VDCopies, VDColumns, VDEAware $AssocCSV = $_ | Get-ClusterSharedVolume -Cluster $ClusterName @@ -1573,6 +1573,7 @@ function Get-SddcDiagnosticInfo $o.CSVName = $AssocCSV.Name $o.CSVNode = $AssocCSV.OwnerNode.Name $o.CSVPath = $AssocCSV.SharedVolumeInfo.FriendlyVolumeName + $o.CSVFS = ($_ | Get-Disk | Get-Partition | Get-Volume).FileSystemType if ($o.CSVPath.Length -ne 0) { $o.CSVVolume = $o.CSVPath.Split("\")[2] } @@ -3025,7 +3026,7 @@ $Output } - $o | Sort-Object RawIopsTotal -Descending | Select-Object -First 10 | Export-Clixml ($Path + "Noisyneighbor.xml") + $o | Sort-Object RawIopsTotal -Descending | Select-Object -First 10 | Export-Clixml ($using:Path + "Noisyneighbor.xml") } catch { #Show-Warning("Unable to get Noisy neighbor Data. `nError="+$_.Exception.Message) } From 80b7877bc600c08713f878e35dd9c737b2c8f6df Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 14 Jun 2024 12:54:28 -0500 Subject: [PATCH 114/127] Update 1.3355.7.2 # Fix NoisyNeighbor.XML getting put in the users documents directory # Add FileSystem property to GetVirtualDisk object --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 1 + 1 file changed, 1 insertion(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index b25e8de..04ad591 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2745,6 +2745,7 @@ $RepFiles |% { try { $VirtualDisk = Get-VirtualDisk -CimSession $AccessNode -StorageSubSystem $Subsystem + $VirtualDisk = $VirtualDisk | Select *,@{L="FileSystem";E={($_ | Get-Disk | Get-Partition | Get-Volume).FileSystemType}} $VirtualDisk | Export-Clixml ($Path + "GetVirtualDisk.XML") } catch { Show-Warning("Unable to get Virtual Disks.`nError="+$_.Exception.Message) } From 2926fd6186da762c1fc8d43785aef7e88ac139f0 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Fri, 14 Jun 2024 13:01:02 -0500 Subject: [PATCH 115/127] Update PrivateCloud.DiagnosticInfo.psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 77d535e..b7ae77b 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -3537,7 +3537,7 @@ Get-Counter -Counter ($using:set).Paths -SampleInterval 1 -MaxSamples $using:Per Get-Job | Receive-Job $xtimer++ } While ((Get-Job "RunCluChk").State -ne "Completed" -and $xtimer -lt 400) - Get-Job "RunCluChk" | Remove-Job "RunCluChk" -Force + Get-Job "RunCluChk" | Remove-Job -Force $CluChkFile=gci "$(Split-Path $Path -parent)\CluChkreport*" -ErrorAction SilentlyContinue $NodeSystemRootPath = Invoke-Command -ComputerName $AccessNode -ConfigurationName $SessionConfigurationName { $env:SystemRoot } If ($CluChkFile) { From d2ad975f230b80663e71fb210e38d0af35443210 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Mon, 1 Jul 2024 10:59:06 -0500 Subject: [PATCH 116/127] Update 1.3355.7.3 #Fix CPU, I see you! missing information after changing to a job --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 | 2 +- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 9479966..86419fd 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.7.2' +ModuleVersion = '1.3355.7.3' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index b7ae77b..411f5fd 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2905,6 +2905,8 @@ Show-Update "Cluster Performance History" #try { #Show-Update " Gathering Sample 1: CPU, I see you!" #Ref: https://learn.microsoft.com/en-us/windows-server/storage/storage-spaces/performance-history-scripting#sample-1-cpu-i-see-you + $Cluster = Get-cluster + $ClusterNodes = Get-ClusterNode -Cluster $Cluster -ErrorAction SilentlyContinue $Output ="" $Output = $ClusterNodes | ForEach-Object { $_ | Get-ClusterPerf -ClusterNodeSeriesName "ClusterNode.Cpu.Usage" -TimeFrame "LastWeek" -ErrorAction SilentlyContinue From 08cc897e9dcf53e2665b1dc9ebd6767b4b2a310c Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:32:38 -0500 Subject: [PATCH 117/127] Update PrivateCloud.DiagnosticInfo.psm1 Added CurrentVersion to be able to see the UBR --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 1 + 1 file changed, 1 insertion(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 411f5fd..3ac45e4 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2341,6 +2341,7 @@ $msinfo=Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer 'Invoke-Command -ComputerName _C_ {Echo Get-NetFirewallRule;Get-NetFirewallRule -All}', 'Invoke-Command -ComputerName _C_ {Echo Get-ProcessByService;$aps=GPs;$r=@();$Ass=GWmi Win32_Service;foreach($p in $aps){$ss=$Ass|?{$_.ProcessID -eq $p.Id};IF($ss){$r+=[PSCustomObject]@{Service=$ss.DisplayName;ProcessName=$p.ProcessName;ProcessID=$p.Id}}}$r}', 'Get-NetNeighbor -CimSession _C_', + 'Invoke-Command -ComputerName _C_ {Echo Get-CurrentVersion;Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion}', 'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' #[System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::GetComputerSite() From 71558e0cd41ee790bae9680f7a57d3f71ab807c0 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Wed, 21 Aug 2024 14:16:09 -0500 Subject: [PATCH 118/127] Update PrivateCloud.DiagnosticInfo.psm1 Added 'Invoke-Command -ComputerName _C_ {Echo Get-CurrentVersion;Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"}' with quotes due to the space in Windows NT --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 3ac45e4..0f5289b 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2341,7 +2341,7 @@ $msinfo=Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer 'Invoke-Command -ComputerName _C_ {Echo Get-NetFirewallRule;Get-NetFirewallRule -All}', 'Invoke-Command -ComputerName _C_ {Echo Get-ProcessByService;$aps=GPs;$r=@();$Ass=GWmi Win32_Service;foreach($p in $aps){$ss=$Ass|?{$_.ProcessID -eq $p.Id};IF($ss){$r+=[PSCustomObject]@{Service=$ss.DisplayName;ProcessName=$p.ProcessName;ProcessID=$p.Id}}}$r}', 'Get-NetNeighbor -CimSession _C_', - 'Invoke-Command -ComputerName _C_ {Echo Get-CurrentVersion;Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion}', + 'Invoke-Command -ComputerName _C_ {Echo Get-CurrentVersion;Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"}', 'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' #[System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::GetComputerSite() From 803ffda31b65ff6ed9d9233279b5b267288f2824 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Wed, 21 Aug 2024 14:16:51 -0500 Subject: [PATCH 119/127] Update PrivateCloud.DiagnosticInfo.psd1 Updated for the last set of changes to the psm1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 86419fd..2740b3d 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.7.3' +ModuleVersion = '1.3355.7.4' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' From c40ddc3c74a44e527d6b2ed11fc9bab8bca7ecbb Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Wed, 21 Aug 2024 15:22:29 -0500 Subject: [PATCH 120/127] Update PrivateCloud.DiagnosticInfo.psm1 added #Added tun run commands that only exist on 23H2 and APEX nodes --- .../PrivateCloud.DiagnosticInfo.psm1 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 0f5289b..7ed4207 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2342,7 +2342,7 @@ $msinfo=Start-Process C:\Windows\System32\msinfo32.exe -ArgumentList "/computer 'Invoke-Command -ComputerName _C_ {Echo Get-ProcessByService;$aps=GPs;$r=@();$Ass=GWmi Win32_Service;foreach($p in $aps){$ss=$Ass|?{$_.ProcessID -eq $p.Id};IF($ss){$r+=[PSCustomObject]@{Service=$ss.DisplayName;ProcessName=$p.ProcessName;ProcessID=$p.Id}}}$r}', 'Get-NetNeighbor -CimSession _C_', 'Invoke-Command -ComputerName _C_ {Echo Get-CurrentVersion;Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"}', -'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' + 'Get-VMNetworkAdapterIsolation -ManagementOS -CimSession _C_' #[System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::GetComputerSite() # These commands are specific to optional modules, add only if present @@ -2375,6 +2375,11 @@ $CmdsToLog += "Get-DedupVolume -CimSession $clusterCimSession" If ((Get-WmiObject -Class Win32_OperatingSystem).Caption -imatch "HCI"){ $CmdsToLog += "Get-AzureStackHCI" $CmdsToLog += "Get-AzureStackHCIArcIntegration" +} +#Added tun run commands that only exist on 23H2 and APEX nodes +IF(Invoke-Command -ComputerName _C_ {IF(gcm Get-StampInformation -ErrorAction SilentlyContinue)}){ + $CmdsToLog += 'Invoke-Command -ComputerName _C_ {Get-StampInformation}', + 'Invoke-Command -ComputerName _C_ {Get-SolutionUpdate}' } $nodejobs=@() From e43a3111ef7611a0da6011dce2a798a4d359a2aa Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Wed, 21 Aug 2024 15:22:46 -0500 Subject: [PATCH 121/127] Update PrivateCloud.DiagnosticInfo.psd1 #Added tun run commands that only exist on 23H2 and APEX nodes --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 2740b3d..a1a3398 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.7.4' +ModuleVersion = '1.3355.7.5' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' From 47b8f48b5d0df4b60c218aa3281b142907c700a1 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Tue, 27 Aug 2024 12:09:11 -0500 Subject: [PATCH 122/127] Update PrivateCloud.DiagnosticInfo.psm1 Resolved missing closing ) in #Added tun run commands that only exist on 23H2 and APEX nodes --- .../PrivateCloud.DiagnosticInfo.psm1 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 7ed4207..9c6113d 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2377,9 +2377,11 @@ $CmdsToLog += "Get-AzureStackHCI" $CmdsToLog += "Get-AzureStackHCIArcIntegration" } #Added tun run commands that only exist on 23H2 and APEX nodes -IF(Invoke-Command -ComputerName _C_ {IF(gcm Get-StampInformation -ErrorAction SilentlyContinue)}){ - $CmdsToLog += 'Invoke-Command -ComputerName _C_ {Get-StampInformation}', - 'Invoke-Command -ComputerName _C_ {Get-SolutionUpdate}' +IF(gcm Get-StampInformation -ErrorAction SilentlyContinue){ + Invoke-Command -ComputerName _C_ { + $CmdsToLog += 'Invoke-Command -ComputerName _C_ {Get-StampInformation}', + 'Invoke-Command -ComputerName _C_ {Get-SolutionUpdate}' + } } $nodejobs=@() From 334872de3d433764e1aab3340e2fa6cb5bc2fc60 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Tue, 27 Aug 2024 12:09:31 -0500 Subject: [PATCH 123/127] Update PrivateCloud.DiagnosticInfo.psd1 --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index a1a3398..9d6aa93 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.7.5' +ModuleVersion = '1.3355.7.6' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' From 85f0338f79c715b9b96fe42dda4466c501ccf4c7 Mon Sep 17 00:00:00 2001 From: TommyPaulkDell <107584414+TommyPaulkDell@users.noreply.github.com> Date: Tue, 27 Aug 2024 13:10:00 -0500 Subject: [PATCH 124/127] Update 7 #Changed 23H2 node commands to work properly --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 | 2 +- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 9d6aa93..6ad54e7 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.7.6' +ModuleVersion = '1.3355.7.7' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 9c6113d..fe713c9 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2377,11 +2377,9 @@ $CmdsToLog += "Get-AzureStackHCI" $CmdsToLog += "Get-AzureStackHCIArcIntegration" } #Added tun run commands that only exist on 23H2 and APEX nodes -IF(gcm Get-StampInformation -ErrorAction SilentlyContinue){ - Invoke-Command -ComputerName _C_ { +IF(Invoke-Command -ComputerName $using:NodeName {gcm Get-StampInformation -ErrorAction SilentlyContinue}){ $CmdsToLog += 'Invoke-Command -ComputerName _C_ {Get-StampInformation}', 'Invoke-Command -ComputerName _C_ {Get-SolutionUpdate}' - } } $nodejobs=@() From db0e9c5ba7ee99f4ac83764f1474c3e65697a9fe Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 10 Jan 2025 14:11:04 -0600 Subject: [PATCH 125/127] Added to FLTMC Company/Description info from driver properties --- .../PrivateCloud.DiagnosticInfo.psd1 | 2 +- .../PrivateCloud.DiagnosticInfo.psm1 | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 index 6ad54e7..3b67e0c 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psd1 @@ -10,7 +10,7 @@ RootModule = 'PrivateCloud.DiagnosticInfo.psm1' # Version number of this module. -ModuleVersion = '1.3355.7.7' +ModuleVersion = '1.3355.7.8' # ID used to uniquely identify this module GUID = '7e0bc824-c371-4936-98e6-b7216ba5f348' diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index fe713c9..2576dc4 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2079,6 +2079,33 @@ Write-host "Dell SDDC Version" $LocalFile = Join-Path $env:temp "fltmc.txt" fltmc > $LocalFile Write-Output (Get-AdminSharePathFromLocal $env:COMPUTERNAME $LocalFile) + # Run fltmc to get basic filter driver info + $filters = fltmc | ForEach-Object { + $line = $_.Trim() -split "\s{2,}" + if ($line.Length -ge 4 -and $line[0] -notmatch '^-+$' -and $line[0] -ne "Filter Name") { + [PSCustomObject]@{ + FilterName = $line[0] + NumInstances = $line[1] + Altitude = $line[2] + Frame = $line[3] + WindowsDriver = $line[0] + ".sys" # Assume the driver file matches FilterName + } + } + } + # Add Company/description information by checking driver properties + $filters | ForEach-Object { + $driverPath = "C:\Windows\System32\drivers\$($_.WindowsDriver)" + if (Test-Path $driverPath) { + $_ | Add-Member -MemberType NoteProperty -Name Company -Value (Get-ItemProperty $driverPath).VersionInfo.CompanyName + } else { + $_ | Add-Member -MemberType NoteProperty -Name Company -Value "Unknown" + } + } + + $filters | Export-Clixml $LocalFileXml + $LocalFileXml = Join-Path $env:temp "fltmc.xml" + Write-Output (Get-AdminSharePathFromLocal $env:COMPUTERNAME $LocalFileXml) + $LocalFile = Join-Path $env:temp "fltmc-instances.txt" fltmc instances > $LocalFile From 49a2c5c54dea3ed19b1166ddf4ef2ee9c93e7a10 Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 10 Jan 2025 15:03:58 -0600 Subject: [PATCH 126/127] fltmcxml file output varible was in the wrong place --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 2576dc4..266f15b 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2101,9 +2101,8 @@ Write-host "Dell SDDC Version" $_ | Add-Member -MemberType NoteProperty -Name Company -Value "Unknown" } } - - $filters | Export-Clixml $LocalFileXml $LocalFileXml = Join-Path $env:temp "fltmc.xml" + $filters | Export-Clixml $LocalFileXml Write-Output (Get-AdminSharePathFromLocal $env:COMPUTERNAME $LocalFileXml) From 6ff6493196f70093c383952ffc51d17ff931531c Mon Sep 17 00:00:00 2001 From: Dell ProSupport GSE <79069476+DellProSupportGse@users.noreply.github.com> Date: Fri, 10 Jan 2025 15:33:19 -0600 Subject: [PATCH 127/127] add FileDescription to FLTMC.xml --- PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 | 1 + 1 file changed, 1 insertion(+) diff --git a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 index 266f15b..2046182 100644 --- a/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 +++ b/PrivateCloud.DiagnosticInfo/PrivateCloud.DiagnosticInfo.psm1 @@ -2097,6 +2097,7 @@ Write-host "Dell SDDC Version" $driverPath = "C:\Windows\System32\drivers\$($_.WindowsDriver)" if (Test-Path $driverPath) { $_ | Add-Member -MemberType NoteProperty -Name Company -Value (Get-ItemProperty $driverPath).VersionInfo.CompanyName + $_ | Add-Member -MemberType NoteProperty -Name Description -Value (Get-ItemProperty $driverPath).VersionInfo.FileDescription } else { $_ | Add-Member -MemberType NoteProperty -Name Company -Value "Unknown" }