Neer94
October 4, 2019, 3:21pm
1
Im attempting to create table within a dashboard that checks if services are running. THe way I would normally do this is by running the Command:
“Get-Process -Name ”
When I try to run this command within the dashboard script, I get the following errors:
Please see the code below and if you are able to point me in the right direction I would be appreciative.
$MyDashboard = New-UDDashboard -Title “Lenel Communication Server Health” -Content {
New-UDTable -Title “Process Check” -Headers @(" ", " ") -Endpoint{
@{
‘GS-COA-EW1A001P’ = Invoke-Command -ComputerName GS-COA-EW1A001P -ScriptBlock {Get-Process -Name Lnlcomsrvr}
guy
October 4, 2019, 3:56pm
2
Hi Neer94,
Welcome to the UD community!!!
I would try something like this.
Get-UDDashboard | Stop-UDDashboard
$MyDashboard = New-UDDashboard -Title “Lenel Communication Server Health” -Content {
New-UDTable -Title “Process Check” -Headers @("Name", "HandleCount", "WorkingSet") -Endpoint
{
$TargetDevice = Invoke-Command -ComputerName "GS-COA-EW1A001P" -ScriptBlock {Get-Process -Name
Lnlcomsrvr}
$TargetDevice | Out-UDTableData -Property Name, HandleCount, WorkingSet
}
}
Start-UDDashboard -Dashboard $MyDashboard -Port 8080
You will need to pick the properties you are interested in displaying. I hope this helps.
guy
1 Like
Hi @Neer94 just second what @guy said, welcome to the universal dashboard forums. Hope this first post is not your last post…I been on this forum since it opened and have seen this question asked quite a few times…so not saying in anyway shape or form I can beat @guy answer, but instead of re-inventing the wheel I will post you to a tasty cookbook recipe cooked up by the one and only @adam it’s right here:-
This is an example of how to create a table of services in UD and add a column with a cell that is colored based on the status of the service.
New-UDTable -Title "Service Status" -Headers @('Name', 'Status') -Endpoint {
Get-Service | ForEach-Object {
$BgColor = 'green'
$FontColor = 'white'
if ($_.Status -ne 'Running') {
$BgColor = 'red'
$FontColor = 'white'
}
[PSCustomObject]@{
…
There are also a lot of other posts, but I know your question got answered, but just to show how nice we are in here this is my help and advice…I would also recommend visiting poshud as @adam has once again provided neat examples:-
https://poshud.com/New-UDTable
Peace
1 Like
Neer94
October 4, 2019, 4:26pm
4
Thank you both for your quick response. I really appreciate the help!
Neer94
October 4, 2019, 6:22pm
5
I have one more question.
I took both of your advice and created the following:
Get-UDDashboard | Stop-UDDashboard
$LenelComDashboard = New-UDDashboard -Title "Lenel Communication Server Health" -Content {
New-UDTable -Title "Service Status" -Headers @('Hostname', 'Service Status') -Endpoint {
$serverlist = get-content -file \\ant\dept\GSS\Serverlist.csv
foreach ($servername in $serverlist){
Get-Service -ComputerName $servername -Name 'LS Communication Server' {
$BgColor = 'green'
$FontColor = 'white'
if ($_.Status -ne 'Running') {
$BgColor = 'red'
$FontColor = 'white'
}
[PSCustomObject]@{
Name = $servername
Status = New-UDElement -Tag 'div' -Attributes @{ style = @{ 'backgroundColor' = $BgColor; color = $fontColor } } -Content { $_.Status.ToString() }
}
} | Out-UDTableData -Property @("Name", "Status")
}
}
}
Start-UDDashboard -Dashboard $LenelComDashboard -Port 8080 -AutoReload
#Get-UDDashboard | Stop-UDDashboard
I get the following error:
A positional parameter cannot be found that accepts argument ’ $BgColor = ‘green’ $FontColor = ‘white’ if ($.Status -ne ‘Running’) { $BgColor = ‘red’ $FontColor = ‘white’ } [PSCustomObject]@{ Name = $servername Status = New-UDElement -Tag ‘div’ -Attributes @{ style = @{ ‘backgroundColor’ = $BgColor; color = $fontColor } } -Content { $ .Status.ToString() } } '.
Any suggestions?
Evening my dude,
you forgot a “| foreach-object” after your get-service.
Get-UDDashboard | Stop-UDDashboard
$LenelComDashboard = New-UDDashboard -Title “Lenel Communication Server Health” -Content {
New-UDTable -Title "Service Status" -Headers @('Hostname', 'Service Status') -Endpoint {
$serverlist = get-content "\\ant\dept\GSS\Serverlist.csv"
foreach ($servername in $serverlist){
Get-Service -ComputerName $servername -Name 'LS Communication Server' | ForEach-Object {
$BgColor = 'green'
$FontColor = 'white'
if ($_.Status -ne 'Running') {
$BgColor = 'red'
$FontColor = 'white'
}
[PSCustomObject]@{
Name = $servername
Status = New-UDElement -Tag 'div' -Attributes @{ style = @{ 'backgroundColor' = $BgColor; color = $fontColor } } -Content { $_.Status.ToString() }
}
} | Out-UDTableData -Property @("Name", "Status")
}
}
}
Start-UDDashboard -Dashboard $LenelComDashboard -Port 8080 -AutoReload
Should work.
Have a good one!
1 Like
DOh I just did this:-
Import-Module -Name UniversalDashboard.Community
Get-UDDashboard | Stop-UDDashboard
Start-UDDashboard -Port 10005 -Dashboard (
New-UDDashboard -Title “Computer Services” -Content {
New-UDTable -Title “Service Status” -Headers @(‘MachineName’, ‘Name’, ‘Status’) -Endpoint {
$Computers = Get-Content -Path C:\UD\sig\computers.txt
Foreach ($computer in $Computers) {
Get-Service -ComputerName $computer | ForEach-Object {
$BgColor = ‘green’
$FontColor = ‘white’
if ($_.Status -ne ‘Running’) {
$BgColor = ‘red’
$FontColor = ‘white’
}
[PSCustomObject]@{
MachineName = $_.MachineName
Name = $_.DisplayName
Status = New-UDElement -Tag 'div' -Attributes @{ style = @{ 'backgroundColor' = $BgColor; color = $fontColor } } -Content { $_.Status.ToString() }
}
} | Out-UDTableData -Property @("MachineName", "Name", "Status")
}
}
}
)
1 Like
This gives this
Although
@BoSen29 beat me to the buzzer this time, I see that neither of you looked at using the MACHINENAME output from get-service
so you would of had a massive list of computer services not having a clue to which computer they related too…thats why it took me that little bit longer than
@BoSen29
I hope both these examples help you complete this dashboard
1 Like
Pfft, the code runs!
Nice catch doe, good job bro!
Doh beat me to it man…must be a timezone thing
With that logic, you should’ve beat me by an hour…
Prolly better fiber from Norway to California, #justsayin
1 Like
@BoSen29 bro it’s 8pm see you at 9pm UK still has crappy internet…especially in my shed so you had an hour headstart on me…told you it was a timezone thing
Touché,
Nuff said above, but 20 character limit…
Neer94
October 4, 2019, 7:42pm
16
Doh… Nice catch! Thank you guys. You are Rockstars!
2 Likes
It’s really worth hanging about on this forum I have learnt so much by the code people are willing to share, and the questions being asked, and how they are answered…for example this just got posted by @wsl2001 who has good skills in the UD area look at this juicy script he kindly uploaded:-
Are the issues that the data isn’t consistent? The cache is now a simple dictionary rather than a MemoryCache object. It should give way more control over what is stored and for how long.
I’d be curious to see how you are using the cache as well.
Scroll right to the bottom but it’s there, only really pointing you to this as using the same colouring on the service, but @wsl2001 has also given it steroids so his dashboard here is monitoring lots of things…this is for one computer…however if you piped your computer list into a select list, then sync’d all the components on the page to the UD selection, you could monitor a load more things than just services for a computer.
I did this to monitor all of our severs, which then displays Ironman Software Marketplace - ud-bginfo
for the server I select from the drop down list
Hope this gives you some ideas for some of the cool things you can do with UD. Peace
1 Like
So here is how I am currently monitoring any given server in my environment…please note I used a tabbed menu for this dashboard, and this is ONE of many tabs…
New-UDTab -Text "Server Info" -Content {
New-UDLayout -Columns 2 -Content {
New-UDInput -Title "Select" -Id "card1" -Content {
New-UDInputField -Type 'select' -Name 'Servers' -Values @("Select Server","Server1","Server2","Server3","Server4")
} -Endpoint {
param($Servers)
$Cache:Loading = $True
Set-UDElement -Id 'output' -Content {$Servers}
$Session:ServerName = $Servers
@("Table1","Chart2","Monitor1","Monitor2","Monitor3","Monitor4","Grid1","Heading","Loading") | Sync-UDElement
}
New-UDElement -Id Loading -Tag div -Endpoint {
If ( $Cache:Loading -eq $True)
{
New-UDCard -Content {
New-UDHeading -Text 'Loading data background components please wait' -Size 3
New-UDPreloader -Size medium }
}
} -AutoRefresh -RefreshInterval 5
}
New-UDRow -Columns {
New-UdColumn -Size 6 -AutoRefresh -Endpoint {
if (-not($Session:ServerName -eq $null)) {
New-UdTable -Id Table1 -Title "Server Information" -Headers @(" ", " ") -Endpoint {
Sync-UDElement -Id card1
@{
'Computer Name' = "$Session:ServerName"
'Operating System' = (Get-WmiObject Win32_OperatingSystem -ComputerName "$Session:ServerName").Caption
'Total Disk Space (C:)' = (Get-WmiObject Win32_LogicalDisk -ComputerName "$Session:ServerName" -Filter "DeviceID = 'C:'").Size / 1GB | ForEach-Object { "$([Math]::Round($_, 2)) GBs " }
'Free Disk Space (C:)' = (Get-WmiObject Win32_LogicalDisk -ComputerName "$Session:ServerName" -Filter "DeviceID = 'C:'").FreeSpace / 1GB | ForEach-Object { "$([Math]::Round($_, 2)) GBs " }
}.GetEnumerator() | Out-UDTableData -Property @("Name", "Value")
} -AutoRefresh
}
}
New-UdColumn -Size 6 -AutoRefresh -Endpoint {
Sync-UDElement -Id card1
if (-not($Session:ServerName -eq $null)) {
New-UdChart -Id Chart2 -Title "Disk Space by Drive" -Type Bar -AutoRefresh -RefreshInterval 5 -Endpoint {
Get-WmiObject Win32_LogicalDisk -ComputerName "$Session:ServerName" | ForEach-Object {
[PSCustomObject]@{ DeviceId = $_.DeviceID;
Size = [Math]::Round($_.Size / 1GB, 2);
FreeSpace = [Math]::Round($_.FreeSpace / 1GB, 2);
} } | Out-UDChartData -LabelProperty "DeviceID" -Dataset @(
New-UdChartDataset -DataProperty "Size" -Label "Size" -BackgroundColor "#80962F23" -HoverBackgroundColor "#80962F23"
New-UdChartDataset -DataProperty "FreeSpace" -Label "Free Space" -BackgroundColor "#8014558C" -HoverBackgroundColor "#8014558C"
)
}
}
}
}
New-UdRow {
New-UdColumn -Size 6 -AutoRefresh -Endpoint {
Sync-UDElement -Id card1
if (-not($Session:ServerName -eq $null)) {
New-UdMonitor -Id Monitor1 -Title "CPU (% processor time)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#80FF6B63' -ChartBorderColor '#FFFF6B63' -Endpoint {
try {
Get-Counter '\Processor(_Total)\% Processor Time' -ComputerName "$Session:ServerName" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
}
catch {
0 | Out-UDMonitorData
}
}
}
}
New-UdColumn -Size 6 -AutoRefresh -Endpoint {
Sync-UDElement -Id card1
if (-not($Session:ServerName -eq $null)) {
New-UdMonitor -Id Monitor2 -Title "Memory (% in use)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#8028E842' -ChartBorderColor '#FF28E842' -Endpoint {
try {
Get-Counter '\memory\% committed bytes in use' -ComputerName "$Session:ServerName" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
}
catch {
0 | Out-UDMonitorData
}
}
}
}
New-UdRow {
New-UdColumn -Size 6 -AutoRefresh -Endpoint {
Sync-UDElement -Id card1
if (-not($Session:ServerName -eq $null)) {
New-UdMonitor -Id Monitor3 -Title "Network (IO Read Bytes/sec)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#4392f1' -ChartBorderColor '#3d85dc' -Endpoint {
try {
Get-Counter '\Process(_Total)\IO Read Bytes/sec' -ComputerName "$Session:ServerName" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
}
catch {
0 | Out-UDMonitorData
}
}
}
}
New-UdColumn -Size 6 -AutoRefresh -Endpoint {
Sync-UDElement -Id card1
if (-not($Session:ServerName -eq $null)) {
New-UdMonitor -Id Monitor4 -Title "Disk (% disk time)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#80E8611D' -ChartBorderColor '#FFE8611D' -Endpoint {
try {
Get-Counter '\physicaldisk(_total)\% disk time' -ComputerName "$Session:ServerName" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
}
catch {
0 | Out-UDMonitorData
}
}
}
}
}
}
New-UDRow {
New-UDColumn -size 12 -AutoRefresh -Endpoint {
Sync-UDElement -Id card1
if ($Session:ServerName -eq $null)
{New-UDHeading -id Heading -Text "Waiting for selection..."}
if (-not($Session:ServerName -eq $null)) {
New-UdGrid -Id Grid1 -Title "Processes" -Headers @("Name", "ID", "Working Set", "MachineName") -Properties @("Name", "Id", "WorkingSet", "MachineName") -AutoRefresh -Endpoint {
Get-Process -ComputerName "$Session:ServerName" | Out-UDGridData
$Cache:Loading = $False
Sync-UDElement -ID Loading
}
}
}
}
}
1 Like
wsl2001
February 13, 2020, 3:37pm
19
@psDevUK
Hey Adam i was testing your monitoring good above but am running into an issue i hope you have a answer.
the issue is related to -values @(“server1”,“server2”,“server3”) , if i put the the servers names like you did everything works fine but if i tried to pull the servers objects from a variable it wont work and i see err::abort 500 a lot in chrome dev tools.
my servers are located in aws and am pulling the instances names thru powershell and save them in a variable like $servers = (array of objects)
psDevUK
February 13, 2020, 5:26pm
20
I think this overloaded my machine…personally now I would probably look at using that new-udselector component I did. Maybe could look at re-writing it…?
wsl2001
February 13, 2020, 5:28pm
21
i see i was just wondering why it wont take objects array vs manually type them.