Real-World Examples

avatar

Hello! I’m trying to collect some real-world examples of what folks are using PSU for to put on our website. I get a lot of questions about what to actually use PSU for since it has a lot of features.

If you’re willing to do so either on this thread or via DM, I’m all ears. I can include as little or as many details as you want (company, name, job title, etc). I’d love screenshots but realize that’s not always possible.

Adam Driscoll
PowerShell Expert and Developer at Devolutions

All Comments (51)

avatar

@Adam Driscoll I always felt this would be beneficial as a way to provide inspiration to others and to sell the product. My son has a really cool dashboard for the local police department and he encouraged me to look at Universal.

I’ve only been using it for a few months and here are two dashboards I currently have running at the office.

Server Dashboard


bea3fc1ab21d7ebcd6a9a1e9df48b93493826975

Clicking on any of the donut (doughnut) charts will bring up a separate page providing a table of the items and some of these have actions that can be perform. Here is an example of the VM Snapshot Status with an action to delete a snapshot.
6e9324de27c583a1d46a95d3105dffb64c4beacb
Another item I’m releasing in the coming days is a tool for managers to handle contractor accounts around our policies for these accounts.

Contractor Account Management


7b0717f57c6af3cc78367db9fe20632cb3954249

Managers can extend (modify end date) accounts, reassign to another manager, request new accounts, or disable accounts. They can also filter the accounts by clicking different segments of the donut chart. Here is a view of the add request form (clicking Add).
f547c4644879f374b5f2424523c7f9b2231fc9c8

The request form is not using New-UDForm as it didn’t provide the look and feel I desired.I hope these are helpful for others.

f547c4644879f374b5f2424523c7f9b2231fc9c8.jpeg

7b0717f57c6af3cc78367db9fe20632cb3954249.jpeg

6e9324de27c583a1d46a95d3105dffb64c4beacb.jpeg

bea3fc1ab21d7ebcd6a9a1e9df48b93493826975.jpeg

avatar

Thanks! This is extremely helpful!

Adam Driscoll
PowerShell Expert and Developer at Devolutions

avatar

Not to hi-jack the post, but how did you build the form without new-udform?

avatar

I simply created a modal (Show-UDModal) and added all of the components necessary to make the form, to include New-UDGrid (for layout), New-UDTypography (for form field labels), New-UDDynamic (for the red asterisk on the form field labels), New-UDElement and New-UDStyle (for spacing and styling), New-UDButton (Submit, Cancel, Clear), and of course New-UDTextbox, New-UDRadio, New-UDSelect, and New-UDAutoComplete for collecting inputs.

The biggest reason I didn’t use New-UDForm was that I wanted an indicator showing required forms and to dynamically change that indication. Therefore, I used New-UDTypography for the form field labels and then New-UDDynamic to add the red asterisk. When clicking submit but leaving a required field empty, I change the asterisk to REQUIRED as part of my button’s on click event. Additionally, I wanted a cancel and clear button on the form and adding one to an existing New-UDForm was clunky.

For reading the data, I simply build an custom object from the values of each field, run it through a validation, and then handle results as needed as part of the on click event.

Hope that helps.

avatar

Here is part of a “utilities” website/dashboard that allows users to run SQL Jobs that are maintained by d/b admins who are not proficient in PowerShell.

It’s a single .ps1 page in PSU that targets different SQL Agent Jobs based on the URL parameter.

One of these processes (screenshots below) requires running 5 separate SQL jobs in order (yes yes because “reasons” the users need to control the running and timing of each step). Each “UD-Chip” across the top is a SQL Job which reloads the “Job” tab reading in the SQL Job information like “Description” and each “job step”. The UD-Chips are either black when they haven’t been run for the day yet, red if the job previously failed or green when complete for that day.

(showing UD-Chip 3 and how each job step is shown matching the job steps from the sql job)
aVz4vBl


Upon clicking the “Run” button a confirmation modal pops up, and after clicking “Start” a broadcast message is sent out to all users, as well as updating/syncing the SQL Job info table and button states across all users who have the page open (this means if person A starts a job while person B is also looking at the same job info table, person B will be informed that the job has started and the “Run” button will be disabled for everyone)

uEp7zaU


(showing UD-Chip 1 - halfway through the sql job at job step 3)
EtDDBHD


While running, the job info table updates as each step is completed so the users can monitor what the SQL Job is doing.

Once complete a broadcast message is sent to all users, and the job info table updated to allow it to be run again if required (and the UD-Chip updates for this day)

(UD-Chip 1 complete, job info table resets, users can see last time the job was run)
GUukSzK


This allows us to only give access to run the SQL jobs to the PSU service account.

We’re logging when each user runs a SQL job from PSU into a SQL Lite d/b (timestamp, username, ip etc) and display access to that for admins using a simple UD-Table.

avatar

Great idea. I have been looking for real-world examples myself a lot. For inspiration as well as education!

I’ll write a fairly detailed report of what I’ve created . As sort of a token of appreciation! PSU has benefited me in a lot of ways so far. I’ll finish/post the write-up Thursday or Friday.

avatar

Hello Adam,
Here is a Nutanix VM creator / remover dashboard.
This page hooks into the Nutanix Powershell module and creates a form dynamically from the data from within the Nutanix system. So should new networks or clusters get added to Nutanix etc they will appear as options. Also is the ability to schedule a two stage removal of said systems with the options to create a Veeam backup and shutdown before a second schedule creates a removal and cleanup of all the meta data across the domain. Schedules can also be removed if needed.



36ec24d8d8736829d9d2cd054735fc59de9c5844

8b3bcf20a825bfb0f2189adbacafeb2ade8d5c41

8b3bcf20a825bfb0f2189adbacafeb2ade8d5c41.jpeg

36ec24d8d8736829d9d2cd054735fc59de9c5844.jpeg

avatar

ORGANISATIONAL CONTEXT:

I work for a relatively small MSP, so our environments are quite diverse.
I am a sysadmin, co-functioning as “tech lead / escalation filter” for our helpdesk/tier 1 support. If one of them have technical questions, they should generally come to me first.
If I can’t help, I make sure they escalate the issue to the correct tech/department/contact.

PSU has resparked my interest in PowerShell, and throughout the past couple of months I’ve built various tools with it for a multitude of reasons. Such as:

  • To automate recurring tasks, as well as easing the “learning curve” for our helpdesk i.e. helping them understanding troubleshooting steps through a simplified interface.
  • To avoid mistakesExample: On/offboarding processes vary greatly among our clients. Hybrid (Exchange) environments were particulary prone to human errors. Automating these tasks avoids errors as well as improving client satisfaction.These scripts/dashboards are not included in this post, but if anybody is interested I’ll try to post them as soon as I find them satisfactory.
  • To avoid recurring questions (for both myself and my colleague’s)
  • To save timeThis goes a couple of ways. Our company generally bills by the quarter of an hour at minimum;We can still bill the time spent as we did before, but now the task takes us only a couple of clicks. (Business is business)
  • Some of our clients are billed a fixed price per user per month, so the time saved still benefits us.
  • To improve my own PowerShell skills / to teach myself / to teach othersI gotta be honest… I thought I was pretty proficient with PowerShell/automation, but PSU has humbled me in the best of ways. The last couple of months, I’ve learned more by slowly expanding PSU than any other PowerShell-related project so far.

TECHNICAL CONTEXT:

  • Client-specific credentials are managed through the PSU Secret store.
  • Client-specific parameters/information that’s more ambiguous is managed through the PSU API with JSON files.
  • Authentication is all done through Azure AD/OIDC with DUO MFA, and AppTokens.

Anyways, here’s the current main dashboard for our helpdesk. I’ll summarize all the tools:

1. PassGen / Send SMS
- Custom password-generator for multiple languages
- Custom syntax to make the passwords user friendly yet complex enough for most systems / password requirements
- (OPTIONAL) Send the generated password to the user by SMS after verification by phone

2. Custom SMS
- Send a SMS with a custom multiline message

3. VM Host lookup
- Oftentimes our tier 2 needs to expand VM resources when our monitoring notifies. This form finds the required VM, and associated host.
- Back in the day we manually clicked through the list of hosts, but we have too many hosts to do that now…

4. DNS Lookup
- Basically a form around Resolve-DnsName. Pops up a modal with some options such as SPF syntax validation. This is mainly used for SPF records.
- Going to add some features to this such as a check for max. DNS lookups (RFC7208)

5. DNS Lookup for our main domain/DNS registrar
- Uses the API of our registrar. Working on some tools to make direct changes without using their control panel.
- Also working on a module to easily copy/transfer DNS zones between this provider and Azure… For failover reasons…

6. ASB/PBX Lookup
- We manage hosted VOIP servers and admin panels. This is to find which server/panel a client is hosted on. (Our provider is working on their own tool, which will be better)

7. RIPE/ARIN/RIR Lookup
- Basically a WHOIS wrapper for IP address lookups at multiple RIR’s. This is mainly used to see if an IP address is managed by us, or to see where a visiting IP address is from.

8. SSL-Certs
- Multiple custom tools/options for SSL-Certificate management through our main registrar’s API
- Has some custom options for ease-of-use; mainly for certificate management on our webservers



5ae46b8cf142c81b877ab44addd711c4d6be7fb8
Some of the forms/code are mixed language-wise (NL/EN). I know.

I’ll post some of the code later, as I’m sure there are a lot of improvements to be made in my code, as well as in my (general) way of doing things.
So if anybody has any pointers or questions, I’d be happy to hear them.

Special thanks to Adam and the rest of Ironman Software for building this “suite”, and building/improving the (PowerShell/Windows/Sysadmin) community.
I’d love it for you guys to teach me some things on a more personal basis sometime.

Thanks so far.

Tom

5ae46b8cf142c81b877ab44addd711c4d6be7fb8.png

avatar

All I can say to everyone is and thank you! You are building some amazing things!

Adam Driscoll
PowerShell Expert and Developer at Devolutions

avatar

We decided to remove administrative rights from our monitoring application (LogicMonitor), but wanted to retain the ability to query for performance and system configuration data that require administrative rights to access (in Windows).
We use PowerShell Universal to provide an API for LogicMonitor to proxy any queries that need administrative rights to query a monitored resource. Instead of directly accessing the monitored resource to ask it something (usually by running a script or querying WMI), we have it use a PU API call running under elevated permissions to handle the query. This way LogicMonitor never has direct access to administrative credentials.

avatar

I dont have any fancy dashboards to share but our organization has been using PSU for a few years now and we have been really focused on using the endpoints/APIs to tie into our ticketing system to automate processes.

We currently use APIs to call various scripts to perform the following tasks

  • On/Off boardingHooking into various other 3rd party APIs such as Azure AD.
  • Permission requests (AD group memberships)

We also have some simple dashboards with UDForms that allows techs (helpdesk) to run various scripts.

PSU has matured so much over the last year or so and I look forward to seeing how much it will continue to grow!

avatar

New guy here.
My first dashboard allows me to pause alarms from PRTG utilizing the PrtgAPI in set intervals. This can be done even though I don’t have write permission to the PRTG core server which normally is needed.

rSFejoq


Its really simple.

Also a big thanks to this forum and some particular members that has been very helpful

avatar

This is a really cool thread, I feel dumb posting my examples after seeing the awesome stuff here.

Just getting back into PSU now but will be using for some self service stuff and to help co-coworkers who are not familiar\confident enough with PowerShell to just run scripts.

Hope to add some examples soon @Adam Driscoll, you have helped me so much in the past and now as well its all I can do to try and give back…well beside getting my current company to buy a license!

avatar

Would love to see the code for this, cool stuff. I haven’t read through the entire post so maybe Adam posted somewhere already…

Thanks!

avatar

yeah it would be really helpful to be able to get the code behind all these dashboars/scripts. It would help alot with learning the stuff.

avatar

@AnonymousUser@AnonymousUser I posted a bunch of the code here: Broadcast update dynamic sections - #6 by pharnos (there might be something in there you can use?)

avatar

We use PSU (currently migrating to PSU from v2.9 UD) to provide a frontend to our SaaS solution which is used by our customers - standalone and MSPs who can manage their own customers through the portal, as a platform for management, monitoring, optimisation and governance for their cloud environments.



33199477a19a93cb459cae679332329ab53d5df3
The backend is all azure automation and the frontend provides a self-service portal for customers to install the product, view automated optimisation recommendations, download their automated documentation, view an overview of the service, build out new environments and much more!



f1f5db0fc08de6e85d37a59c02828c1e52458e11
If it’s of any use I’m happy to write up a case study which goes into more detail.
Once we’re fully moved over to PSU I’ll definitely be using APIs and some of the built in automation to allow our customers to run API calls to kick off documentation runs and various other cool things. Looking forward to getting stuck into that!

f1f5db0fc08de6e85d37a59c02828c1e52458e11.png

33199477a19a93cb459cae679332329ab53d5df3.jpeg

avatar

This gave me a lot of motivation to get started on something similar for our PRTG servers. Currently running in beta for a small group of our servicedesk engineers and thus far the feedback has been great.

Thanks for the inspiration by sharing this!

avatar

Let me know if you need any of the code behind the dashboard

Since I wrote last I have implemented 3 new features:

  1. Ability to unpause an object
  2. Autocomplete search for devices (Its a must have!)
  3. Update the autocomplete list with a click - list is updated every 8 hours, but if a newly added needs to be paused we can initiate an list update with a single click



e35d18ec6d9cb8d8fada9d3e75df25eb08a0e17f


f50169d8bff200b4e3089257b8ef2c8181a1895c

e35d18ec6d9cb8d8fada9d3e75df25eb08a0e17f.png

f50169d8bff200b4e3089257b8ef2c8181a1895c.png

avatar

Hi, I could probably provide screen-shots once I got the dev-test environment up and running if interesting.

I’m working at the Swedish Police agency as an infrastructure architect with a special focus on IT-forensics.

Our primary use case is transfer of IT-forensic data across the country from the local departments where extractions are made to centralised systems for different types of analysis in datacenters. The system also traverses different security domains with separate active directories. Data is put on large NAS systems (many PB) and we use PSU to provide a dashboard with which forensic scientists and investigators can initiate transfers of data between preconfigured folders.

Dashboards are available to monitor house keeping, basic performance counters of computers, statistics, whether windows defender have identified any threats etc.

It’s a simple PS hack using minimal resources for a problem we couldn’t find any reasonable ready-made solution for.

We will continue to use the platform for further automation of repetetive tasks in the domain. It seems ideally suited for quick development of basic tools for the continously evolving and fast moving area of IT-forensics.

avatar

My employer probably wouldn’t be a big fan of me posting screenshots, since we’re under FSA regs but we’ve been maturing our PSU implementation over the past couple of years and it’s something I’m becoming immensely proud of.

It’s now running out of a fully automated app service deployment using Terraform and an Azure DevOps Pipeline for the infrastructure and then the git integration with PSU delivers the source code to our dev and prod layers based on branch meaning we can trial changes in Dev and then push to Production with a simple PR.

We all started as server techs, so initially we used it for making the server team’s life easier - we’re able to provide great server build forms using the UDStepper component which feeds our build database (which in turn provides data to a build status page) and we’ve got pages that manage things like Print Spooler restarts, SCCM stats and various bits of monitoring/stat display.

Over the past year or so the company has been transitioning to use more microservice based digital services which has been an extremely tough journey for some of our more “traditional” teams and we’ve adapted our PSU offerings to fit the bill… for instance where enabling a holding page on a website would usually entail PRing a code update then running a pipeline with the correct runtime variables (easier said than done when there are 10 different pipelines feeding an application and maybe the devs didn’t name the required variables particularly descriptively) - with PSU we’re able to offer a web form with simple, plain English options and a single button to push that fires the DevOps Rest API under the logged-in user’s name meaning not only are we making things easier for everyone, we’re not compromising on security or audit trail to do it all under a service account/service principal.

One particularly smelly regular bit of maintenance we have to do involves changing some secrets in a KeyVault before running a pipeline - last time Operations ran it, it dragged on for over 2 weeks with people lacking confidence at every step… now they visit a web page, pick the state they want and hit a button. It takes 30 seconds.

A recent baby is my DSC Toolkit which provides all sorts of management for Azure Automation DSC which can be an unpleasant thing to manage from the Azure portal. Actually, that’s pretty safe to show:



35065684b6143c4867d7a6af6670938696991128
From a single page we can see what modules are installed in each environment, the state of all the nodes and can run jobs like compilations/merges or configuration changes either targeted to single servers or groups.

We’ve built a Powershell module for PSU functions including buttons that trigger pipelines and Azure Automation runbooks then track the job all the way to completion so we’re not rewriting code every time we think of a new application.

PSU really is an absolute game changer for infrastructure management… I’m a total evangelist about it. We’re not about to build customer-facing websites with PSU, but the speed at which we can get new dashboards out that change our colleagues lives is absolutely astounding. I have a feeling we’re still only scratching the surface of what it can do for us.

35065684b6143c4867d7a6af6670938696991128.png

avatar

This has been great to see what others are doing with PowerShell Universal. Here are some of the things that we are doing with it today:

API

I have needed to create APIs that can be used by other systems for awhile. This allows me to create these APIs and fully manage their output. Here are some of the APIs I have created:
• Authoritative Address
o We have over 900 locations and have struggled in the past to have a single source of truth for our addresses. This API lets me pull from our authoritative source the correct address for a given unit and provide it to multiple different systems without them needing to store the address directly.
• Reporting
o Need to pull some data from SQL and provide it to a different vendor so that the information can be displayed in their system. This made it easy to generate the data for the report and pass it on via API.

Dashboards

AdminToolkit
This is a large dashboard that is used by our techs. Rather than give our 80+ techs direct access to make changes, we use a proxy system to allow them to update information in Active Directory and Microsoft 365. (This is still on 2.9 dashboard, but I am working on upgrading it to PowerShell Universal.) To help with performance (as we have over 10,000 user accounts and tons of groups/Teams, computers, etc…), I have a cache built into this to do the initial lookup. I actually update the information in SQL as I gather information on each item that means generating it can take half hour or more. Then, I can easily update the cache in the dashboard by pulling in the SQL query in a matter of seconds.
In addition, most changes are done via a proxy system (where a request on their behalf is submitted to SQL and PowerShell then processes those requests. This allows me to do specific logging on each request, as well as maintain consistency so that changes made are done in the same way by everyone.



f626d32d507e697c03f40f7f49edbb5fadd71fea
User Screens:



b6ffb5b8383f554742e48b102e836359c3c7b41f


323d62a56bface6f2ecedc9ff852b91e2ca6f8a2


6a8237b4d5d0b19eb7f2d87f0b88e20291093844
I do cache some of the information so that it responds faster. At times, I do show the last time that cache was refreshed



2e223df3a0f2d5f0fd43e19f8f3bfb111879cf86
OneDrive info and expansion panels for other information


bf0f643d6260249eb8b78cc05188264b21ed3a6f
Group membership information that also shows if that membership has been synced to O365:



adc674349cd1bb1760709925585875aafaa2ba16
Add to a group:



91eba82280e28fd4d447faf6758f1d9b2d1a6bf4
In addition to managing users, we also manage groups.



8ace55b684984de7f22ad68ee4bd360d6f9e865c
Clicking on a group will let a tech see direct and indirect group membership and add users. The list of users that can be added is filtered based upon the group type and location to help prevent users being added to groups that they shouldn’t be added to.
For computers, if it is online, I make some WMI calls to get some live information about the computer, as well as pulling information from AD:



5f86014d50a77dd85706004cbf13ec6d27e83c0c


c0f2aaf2f87c5e9721778a796dd4e0687069854d
For shared mailboxes, I allow techs to see who currently has permissions on the shared mailbox and update that list of permissions. They can also see basic Exchange information about each mailbox.
For Microsoft Teams, I am able to display some information to a tech that might help them when they are assisting end users. This includes Team membership (owners, members and guests), channels on a Team, SharePoint site URL and email address.

App Inventory
I’ve created a site that has a list of the various applications in use across our locations. This allows our techs to look up applications that they may not be familiar with to find out more about it. It includes tier level support so they know who to escalate issues to.



2791c7fd379850e1aaef4943ed4336fb49eccace
I also have KB articles that can be easily added for reference, as well that are specific to a given application. I include information about the application including what servers it may be running on and the “owner” of the application.


c121ddd6e3327e6b609836503791c246b8094e0f
In addition, I use this to keep track of spending on each application (whether it is license renewal or software development). This allows me to know the lifetime expense spent on a product, how much we spend on a given vendor and keep track of invoices.

Manage My Groups
This is a dashboard that I have created to allow our end users to manage specific group membership. This is to get around clunky native methods in Exchange by filtering the lists to only the groups they can manage membership and using the same user/group cache information to only add appropriate people to a group.


d5aa494632f5305943483c3c993d27ef4ab2c12a
Address Lookup
Using my authoritative address API, they can look up addresses and verify it through various systems.



f499eda4d44f73afde8e10ab273bf13f49abc264
In addition, I have tied to a 3rd party API to standardize and validate addresses to make sure that they actually exist.

f499eda4d44f73afde8e10ab273bf13f49abc264.png

d5aa494632f5305943483c3c993d27ef4ab2c12a.png

c121ddd6e3327e6b609836503791c246b8094e0f.png

2791c7fd379850e1aaef4943ed4336fb49eccace.png

c0f2aaf2f87c5e9721778a796dd4e0687069854d.png

5f86014d50a77dd85706004cbf13ec6d27e83c0c.png

8ace55b684984de7f22ad68ee4bd360d6f9e865c.png

91eba82280e28fd4d447faf6758f1d9b2d1a6bf4.png

adc674349cd1bb1760709925585875aafaa2ba16.png

bf0f643d6260249eb8b78cc05188264b21ed3a6f.png

2e223df3a0f2d5f0fd43e19f8f3bfb111879cf86.png

6a8237b4d5d0b19eb7f2d87f0b88e20291093844.jpeg

323d62a56bface6f2ecedc9ff852b91e2ca6f8a2.png

b6ffb5b8383f554742e48b102e836359c3c7b41f.png

f626d32d507e697c03f40f7f49edbb5fadd71fea.png

avatar

We don’t have anything wildly impressive yet. but we do have some time savers.

a couple of scripts that pulls and parses GPO’s in our domains, and simple pages to display said GPO settings to allow us to search for a setting across all GPO’s and determine what GPO’s affect that setting



f5561b3b637366966ed663c3f9d5564c2b4ad38f
And similar to that, a script that queries Cloudflares API and lists all our DNS records across our Zones, so that we can easily lookup all our SPF records etc, or export a list of domains (well, once Pages allow us to export using other than US delimiters )

Our Servicedesk automation guy, made a dashboard for his colleagues, that allows them to search for a user/employeeID etc. and get that employees AD data from all our domains



65f3b3e57559d404bf9cb9c7bfd0cc2e5c753859
This allows them to quickly diagnose Password Sync issues, lockouts etc.
Includes a critical component: random Calamity Bert pic

65f3b3e57559d404bf9cb9c7bfd0cc2e5c753859.png

f5561b3b637366966ed663c3f9d5564c2b4ad38f.png

avatar

it’s good to see other people building similar tools to ourselves and architecting them in the same way. Staging the data to sql and then consuming it directly in the dashboard then proxying updates - exactly what we re doing

avatar

Hi,

with the PSU dashboard fonctionnality, we have built web forms to allow the helpdesk people to create and manage ad user accounts, user homes and shared folders, security groups and mail boxes / distribution groups in an easy way. So admins can work on more valuable tasks.
But the goal is to automate all these tasks from the begining ( user request ) to the end ( apply to ad / exchange etc … )
API Rests allow us to manage the communication between networks.

PSU is the more important and ambitious IT project.

avatar

@AnonymousUser This is so cool. Crazy how close our needs are between technician and various external systems.

Do you have any of the components in Open Source space or a POC that could be made public? I could definitely see some of these components being useful to other teams if it was not proprietary.

Our team are about to tackle something similar and would love a good jump off point if some of the underling modular setup work was available. If you have any available prebuilt solutions or resources for architecture work it would be a great help. Even any generalized documentation available could go a long way.

avatar

Could I ask you how you got your properties to display with them stacked vertically along with the value to the right of them? Like in your Password and Account info Card? I am certain I am overthinking this but can’t seem to figure it out.

avatar

I’m almost complete in migrating to a new version of this using PowerShell Universal (instead of Universal Dashboard 2.9). It has been a long process just because there are a lot of changes, but also lots of things I can improve. I hope to be done by the end of the month and will look to see if I can share some of my code.

avatar

Sure, I use the following code:

                $tablePwd = [ordered]@{
                    'Password Expiration'  = $PasswordExpiration
                    'Account Expiration'   = $AccountExpiration
                    'Last Logon Timestamp' = $LastLogon
                    'Account Lockout'      = "$ADAccountLocked"
                    'Account Lockout Time' = $ADAcctLockoutTime
                }
                    
           
            $Data = , @($tablePwd.GetEnumerator())
            $DateColumns = @(
                New-UDTableColumn -Property Name -Title " "
                New-UDTableColumn -Property Value -Title " "
            )
            New-UDTable -Id "PasswordInfo" -Title "Password and Account Info" -Data $Data[0] -Columns $DateColumns -Dense


I love being able to present tables this way. I am actually working on upgrading my existing UD 2.9 dashboard to PowerShell Universal right now. I have most of the major work done on it, and will look at some ways I might be able to share some of the code.

avatar
$tablePwd = [ordered]@{
                    'Password Expiration'  = $PasswordExpiration
                    'Account Expiration'   = $AccountExpiration
                    'Last Logon Timestamp' = $LastLogon
                    'Account Lockout'      = "$ADAccountLocked"
                    'Account Lockout Time' = $ADAcctLockoutTime
                }
                    
           
            $Data = , @($tablePwd.GetEnumerator())
            $DateColumns = @(
                New-UDTableColumn -Property Name -Title " "
                New-UDTableColumn -Property Value -Title " "
            )
            New-UDTable -Id "PasswordInfo" -Title "Password and Account Info" -Data $Data[0] -Columns $DateColumns -Dense


Thank you so much! I truly appreciate it.

avatar

Do you throw the tables onto UDCards after to condense them onto the page?

avatar

Hi Tom,

Did you end up posting the code for your dashboard?

I’m looking to create a similar password generator / reset password / SMS to user dashboard, and would love an example to get me started!

Many thanks,
Finn

avatar

Big fan of Universal Dashboard, started ~ v2…

… started with a dashboard for server power/thermal/spread…


ef25e4741a56ed176e2ba7b12cc660ace0f022a1

ef25e4741a56ed176e2ba7b12cc660ace0f022a1.png

avatar

… more recently, created a dashboard to review disaster recovery planning…


8c01b71466b68879cf02bbbb899a781091b95991

8c01b71466b68879cf02bbbb899a781091b95991.png

avatar

… and to provide status updates during recovery…


e62db0f32e42ffdc472d64ec9858a18e4ee06cc6
… sorry, had more pictures and examples, but ran into forum limitations for new users.

… looking forward to v4, thanks for all the hard work Adam!

e62db0f32e42ffdc472d64ec9858a18e4ee06cc6.png

avatar

Just wanted to say, love threads like this that show what sysadmins are crushing in their different companies.

I built a VMWare server build tool several years back for an insurance company, with a form where the user could input the details of their request. The backend would then connect to the appropriate (on-prem) DC and check things like storage, memory, etc. against company sizing policies. Once the process passed this gate it would connect to ServiceNow and create a ticket, then complete a review and approval process amongst a group of managers before continuing. Once the approval process completed, the flow would then pick up and build the server in the specified DC, create tasks on the ticket for other teams (backup, security, etc.), monitor those tasks through to completion, then update and close the ticket. Finally, a notification would go out to the requester with all the necessary details for their newly provisioned server. It took server build SLAs from 5 business days to 4 hours.

I’ve since moved to another state, but was back in town where this company is located recently, and was gratified to find out this process is still in place and working fine for them.

avatar
SCCM stats

@AnonymousUser I hate to necro an old thread, but are you able to share the code for the SCCM Stats dashboard?

Thanks,
Mike

avatar

I would also be interested.

avatar

So I’ve been tasked with creating a complete solution to keeping our Microsoft Partner Center licenses and Autotask contracts in sync for all our customers.
There’s a lot of 3rd party offerings out there, but none of them exactly fitted our needs - or demanded an absolute fortune for features we wouldn’t be using at all.

PSUniversal to the rescue.

The homepage
Should speak for itself. It’s the home page after all


7ffcd922d8123fe62cb9fc1f53323e59b3b0e9f3
NCE Subscriptions
Where most of our employees would find all relevant information about active subscriptions for each customer tenant.
34b9f3a017b1511058c3bc12fc299fc784bfe5a9




845d2af62eb8b11f8ac95a2ddbbd6c97f7026aa3
The first section shows a few details about the selected customer tenant.

  • Tenant name (+ tenant domain)
  • Last subscription sync timestamp

Quick links to the related Partner Center page for the selected tenant and the respective Autotask company details
d1890990ba23c894b0ab0b336a30ff9d27596ab0
Autotask Mapping- Customers
This is where the configurations are taken care of by the employees with the required role to do so.
Not everyone has access, for obvious reasons.


8616ead727da5a6f5e81b25609d2195153cd9b64

Here we see the mapping status for all tenants to their respective Autotask Company, or if they were configered to be ignored entirely.
There’s also an indicator for when there is no mapping yet.The actions column has the same quick links to Partner Center, Autotask Company details, editing the configuration and to copy the tenant Id to the clipboard (which is only visible to a few roles, for QoL purposes)

To edit the mapping configuration for a tenant that is set to “Ignored”, the following modal pop ups:
c561f616e25f09e625eb62a46f0e9c910410cf7b

Which allows the user to undo the Ignore setting or reset all mapping configurations entirely for this tenant. When the configuration changes, the user will immediately have the ability to select the Autotask Company to map the tenant to instead.
5946443fd6a2723a06ca548255e1d19af3eda4bc


When editing the mapping for an already mapped tenant, the modal shows accordingly:
b0ba4eb21ef4284479aa5a215e677899928d40f0


This behavior and functionality is then also available for mapping the Microsoft Offerings/Subscriptions to their respective Autotask Services, with the additional option to create the service if none is found in Autotask that fits the templated/pre-defined naming scheme.

Autotask Mapping- Contracts
Where the fun actually began…



8fd31863d5d25a81e82b79149b3d88171fd11c26


20e01f37cc40075ce38e99111ad46f68e6e335e0
Bla bla bla...When the customer/tenant is selected, all subscriptions will be sorted into “Suggested Contracts”, based on their Term (P1M, P1Y, P3Y) and respective Term Start Date + Term End Date.
A tenant might have multiple monthly term subscriptions, all starting on a different day of the month - making them incompatible to be used on the same Autotask contract - that will renew every month on a set date.
Thus, the subscriptions will only be on the same contract when the start and end date align.
When the subscriptions are not yet found on an active contract in Autotask, the tool will present the option to create it. If all subscriptions are on a contract, the user will be able to open that contract in Autotask or force the contract to update.
Updating a contract might be required when one of the shown subscriptions indicates an error in the “On Contract” column, or the table shows a red exclamation mark in the “Quantity” column - caused by the sync job not being run yet (in the background).

There’s a lot more to talk about that goes on in the background, but as this has already become quite the large post - I’ll leave that for any conversations outside of this topic

20e01f37cc40075ce38e99111ad46f68e6e335e0.png

8fd31863d5d25a81e82b79149b3d88171fd11c26.png

b0ba4eb21ef4284479aa5a215e677899928d40f0.png

5946443fd6a2723a06ca548255e1d19af3eda4bc.png

c561f616e25f09e625eb62a46f0e9c910410cf7b.png

8616ead727da5a6f5e81b25609d2195153cd9b64.png

d1890990ba23c894b0ab0b336a30ff9d27596ab0.png

845d2af62eb8b11f8ac95a2ddbbd6c97f7026aa3.png

34b9f3a017b1511058c3bc12fc299fc784bfe5a9.png

7ffcd922d8123fe62cb9fc1f53323e59b3b0e9f3.png

avatar

You make my dashboards look bad. Lol, excellent work!

avatar

Thanks! I put a lot of effort into it so your compliment is highly appreciated

avatar

I’m using PSU for two instances, the most used one is for a password self-service portal for internal production domains. I’d like to include screenshots, but they would contain too much blurred company info

For a textual overview of what the portal allows the user to do:

  • The user can request a service PIN (once only), which will be sent to his email address.Will be provided in the future during onboarding
  • While unauthenticated, the user canChange (known) passwords for users
  • Can reset a password for a user ifhe knows the service PIN of the user account, and
  • has access to the user’s mailbox, since a transaction code is sent.
  • If the user authenticates to the portal with his external/office credentials, he can change/reset passwords without the TAN (the service PIN is still required for a reset).Since we have matching information (the office user ID), we present a dropdown with all associated production user accounts.

Next to the dashboard, a scheduled task will query all user accounts with the timespan when the password expires. For the configured timespans, users will receive an email notifying them which user is about to expire.

avatar

I’ve built a few dashboards over the years for various orgs, but like others haven’t really been able to showcase much due to sensitive info etc. Well I’m an avid home brewer and decided on a personal project recently using PSU.

Still quite a way to go and some definite tweaks to the look and feel are needed. But here’s a list of what’s been completed:

  • Public access as well as member and admin role based access (the auth is relayed through a second app)
  • Google OIDC Auth (pass through avatar, name & email address)
  • Profile page with on the fly editable settings
  • Recipes page with global, personal and saved lists
  • Rateable recipes, scores are aggregated
  • Recipes can be exported from any brewing software and imported into the site (adheres to the BeerXML standard)
  • Recipes can be exported from the site back to xml
  • Map view shows members approx location, breweries, and notable pubs that the collective visit with links to their external sites
  • New users can self register for access
  • Access requests have to be approved by site admins (custom admin portal for elevated members that doesnt use PSU back end)

maxresdefault
Future plans:

  • Better profile pages that allow for showing off pictures of your own homebrew kit
  • Uploadable pictures to the recipes
  • Hop exchange, list and see others surplus stock, propose trades with members for the next meetup
  • Notifications, maybe integration with OneSignal for mobile notifications, or fall back to email if I give up trying to get that working
  • Meetup/Event information
  • Label Designer (integration with stable diffusion automatic1111 api)
  • Suggestion box & reportable issues
  • Figure out how to get Facebook auth working
  • More direct integration with the leeds homebrew club facebook group
avatar

I am currently building something similar. Would you be able to share (some) code of your solution? Would be greatly appreciated!!

avatar

Looks awesome!
Would you mind sharing the code, for the home page?
I cant get my cards / papers to behave like yours, where the image, header and normal text is aligned so nicely

avatar
$Parameters = @{
	Name    = 'home'
	Title   = 'Home'
	url     = '/'
	Content = {
		New-UDStack -Direction column -Content {
			New-UDCard -Content {
				New-UDCardHeader -Title 'Welcome to the NCE Dashboard!' -Avatar (New-UDAvatar -Image 'https://some.host.com/Cubics-icon_non-transparant.ico')
				New-UDCardBody -Content {
					New-UDTypography -Text 'Use the menu on the left or the cards below to navigate and use the various functions.' -Sx @{
						fontSize = '0.8rem'
						color = 'text.secondary'
					}
				}
			}
		}
		New-UDLayout -Columns 2 -Content {
			$features = @(
				@{
					Title = "Microsoft Partner Center"
					SubTitle = "NCE Subscriptions"
					Avatar = 'https://some.host.coml/microsoft.png'
					Url = "/nce-subscriptions"
					Description = "Quickly view all NCE subscriptions and Azure Plan charges per customer."
				},
				@{
					Title = 'Autotask'
					SubTitle = 'Customer Mapping'
					Avatar = 'https://some.host.com/autotask.png'
					Url = '/customer-mapping'
					Description = 'View and edit the mapping between Autotask and Microsoft Partner Companies.'
				},
				@{
					Title = 'Autotask'
					SubTitle = 'Contract Mapping'
					Avatar = 'https://some.host.com/autotask.png'
					Url = '/contract-mapping'
					Description = 'View and edit the mapping between Autotask and Microsoft Partner Contracts.'
				},
				@{
					Title = 'Autotask'
					SubTitle = 'Service Mapping'
					Url = '/service-mapping'
					Avatar = 'https://some.host.com/autotask.png'
					Description = 'View and edit the mapping between Autotask and Microsoft Partner Subscriptions.'
				}
			)

			$features | ForEach-Object {
				New-UDElement -Tag 'div' -Content {
					New-UDCard -Content {
						New-UDCardHeader -Title $_.Title -SubHeader $_.SubTitle -Avatar (New-UDAvatar -Image $_.Avatar)
						New-UDCardBody -Content {
							New-UDTypography -Text $_.Description -Sx @{
								fontSize = '0.8rem'
								color = 'text.secondary'
							}
						}
					} -Style @{
						cursor = 'pointer'
					}
				} -Attributes @{
					onClick = {
						Invoke-UDRedirect $_.Url
					}
				}
			}
		}
	}
}
New-UDPage @Parameters


hope it helps!

avatar

We are finally starting to utilize dashboards. I’ve stolen some ideas off of this thread (great thread!)… is there a dedicated place with links to open source dashboard people have created? Through this thread and some google foo I found a couple, but I have to believe there are more. Just not sure if there is a central “link” location I can’t find… I know the scripts area exists on ironman but I’m talking about links to community created dashboards / projects on GitHub, etc.

avatar

I am not aware of any open source examples, other than the ones Ironman software have created - they can be found here:
PowerShell Universal Templates - Ironman Software

I had the same issue when i started using it, and sadly found the demo site very late in the process:
https://demo.powershelluniversal.com/

You can find a ton of inspiration there

avatar

Just to note this link PowerShell Universal Templates - Ironman Software appears to be broken. Does anyone have some good samples of using Invoke PSUScript and apptokens with the upgrade to 5 defaulting to this model.

avatar

Hey

Here is a basic example I use in a dashboard; however, I am not using AppToken. Not sure if this is what you are looking for.

$hhLookupObj = Invoke-PSUScript -Script 'Retail\Handhelds\Intune-GetDevice.ps1' -hhSerialNumber $serialNumber -TrustCertificate -Wait


avatar

I created an App to manage 1 or multiple Pi-Hole’s using the free version of PSU v5.5.2 and wanted to share here for a real world example. If you have a Pi-Hole (or a few like me) you should be able to make this work as well. All details are here



123b9ca610e4f9e145e433897d84d1671084f5d2

123b9ca610e4f9e145e433897d84d1671084f5d2.png