Skip Navigation
pwshguy (mdowst)
pwshguy (mdowst) @ pwshguy @programming.dev

Father, author, blogger, enthusiast of all things PowerShell and automation. http://linktr.ee/mdowst

Posts
97
Comments
33
Joined
2 yr. ago
Powershell @programming.dev
pwshguy (mdowst) @programming.dev

PowerShell Weekly for April 25, 2025

Announcements!

Blogs, Articles, and Posts

  • Restrict and report logon hours for Active Directory accounts
    \ For security purposes, it may be beneficial to restrict Active Directory account logins to regular working hours. These logon times can be configured using the calendar widget in Active Directory Users and Computers (ADUC). However, PowerShell provides a more efficient and flexible alternative, particularly because it offers reporting capabilities that the graphical interface does not.
  • How to Report the Sponsors of Entra ID Guest Accounts
    \ Entra ID populates the sponsor property for new guest accounts with details of the person who invites the guest to the tenant. It's data that can be used
Powershell @programming.dev
pwshguy (mdowst) @programming.dev

PowerShell Weekly for April 18, 2025

Announcements!

  • Important Purview eDiscovery Changes Take Effect in May 2025
    \ Microsoft is making some important changes to Purview eDiscovery from May 26, 2025. The changes affect how content searches work and are likely to affect many Microsoft 365 tenants. Administrators and eDiscovery investigators will both have to master new ways of working with eDiscovery cases, searching for information, reviewing search results, and exporting what’s found. Changes to PowerShell cmdlets might affect scripts, so there’s lots to consider.
  • PowerShell, OpenSSH, and DSC team investments for 2025
    \ Come read about the investments Microsoft has planned for PowerShell in 2025.
  • PnP PowerShell v3 released!
    \ It has been in the works for a long time, but finally w
Powershell @programming.dev
pwshguy (mdowst) @programming.dev

PowerShell Weekly for April 11, 2025

Announcements!

Blogs, Articles, and Posts

Powershell @programming.dev
pwshguy (mdowst) @programming.dev

PowerShell Weekly for April 4, 2025

Announcements!

Blogs, Articles, and Posts

  • How to Check CPU Temperature Using PowerShell Command
    \ Let's check real-time CPU temperature logging using powershell command. In this guide we have discuss best powershell command to monitor CPU temp.
  • Duplicate Mail User Objects Created for Guest Accounts
    \ The February 2025 EX1015484 incident explains why mail user objects with duplicate SMTP addresses are created for guest accounts. That’s a problem because Exchange Online can’t route messages to objects with duplicate email addresses. Fortunately, you can find out if any duplicates exist in your tenant with some PowerShell. Problems happen!
  • [How to Find Who Assigned Retention Labels t
Powershell @programming.dev
pwshguy (mdowst) @programming.dev

PowerShell Weekly for March 28, 2025

Announcements!

Blogs, Articles, and Posts

Powershell @programming.dev
pwshguy (mdowst) @programming.dev

PowerShell Weekly for March 21, 2025

Blogs, Articles, and Posts

  • Mastering Active Directory Hygiene: Automating SIDHistory Cleanup with CleanupMonster
    \ Security Identifier (SID) History is a useful mechanism in Active Directory (AD) migrations. It allows users and groups in a new domain to retain access to resources that still rely on permissions from the old domain. However, once migrations are completed, these historical SIDs can become clutter, posing both security and administrative challenges.
  • SharePoint Online PowerShell Module Gets Modern Authentication
    \ Microsoft has announced that the SharePoint Online PowerShell module will be upgraded from the very old and now obsolete IDCRL protocol to use modern (OAuth) authentication in versions released from March 28, 2025. The update to OAuth should not affect scripts, but it’s alwa
Powershell @programming.dev
pwshguy (mdowst) @programming.dev

PowerShell Weekly for March 14, 2025

Announcements!

Blogs, Articles, and Posts

Powershell @programming.dev
pwshguy (mdowst) @programming.dev

PowerShell Weekly for March 7, 2025

Announcements!

  • Microsoft Graph PowerShell SDK V2.26.1 Remains Flawed
    \ The developers rushed out Version 2.26.1 of the Microsoft Graph PowerShell SDK to fix some obvious issues. Alas, problems persist in PowerShell SDK cmdlets, including licensing failures and an issue that prevents the Connect-MgGraph cmdlet from being able to obtain an access token from Entra ID. My advice is to stay with V2.25 until Microsoft resolves the problems and generates a new stable version of the SDK.

Blogs, Articles, and Posts

  • The not so simplified syntax of Where-Object in PowerShell
    \ PowerShell 3.0 introduced several notable improvements to its cmdlet library, with one of the most useful features in this release being the simplified syntax for the Where-Object cmdlet. This enhancement made filtering objects more efficient and user
Powershell @programming.dev
pwshguy (mdowst) @programming.dev

PowerShell Weekly for February 28, 2025

Announcements!

Blogs, Articles, and Posts

Powershell @programming.dev
pwshguy (mdowst) @programming.dev

PowerShell Weekly for February 21, 2025

Blogs, Articles, and Posts

Powershell @programming.dev
pwshguy (mdowst) @programming.dev

PowerShell Weekly for February 14, 2025

Blogs, Articles, and Posts

  • Primer: Using Exchange Online PowerShell in Azure Automation Runbooks
    \ In this primer, we cover how to create and execute Azure Automation Exchange Online runbooks (scripts) using cmdlets from the Exchange Online management module. Some setup is necessary before runbooks can process Exchange cmdlets, but once the necessary resources and permissions are in place, it’s all plain sailing.
  • Custom Maester Tests: Validate Full Addresses Now and Cleaned Up Wording
    \ Added 3 new tests which I think the first two will be game changers. The first 2 are tests for validating locations, in which the user must have street, city, state, postal code, country, business phone, and company name the same as the valid location in the json.
  • [02-14-2025 MSOnline and AzureAD PowerShell modules..
Powershell @programming.dev
pwshguy (mdowst) @programming.dev

PowerShell Weekly for February 7, 2025

Announcements!

Blogs, Articles, and Posts

Powershell @programming.dev
pwshguy (mdowst) @programming.dev

PowerShell Weekly for January 31, 2025

Announcements!

Blogs, Articles, and Posts

  • Projects, Scripts, and Modules

    • All About the Office 365 for IT Pros GitHub Repository
      \ The Office365ITPros GitHub repository holds over 300 PowerShell scripts showing how to interact with Microsoft 365 and Entra ID. Anyone can contribute to Office365ITPros by forking the code to a copy of the repository and making changes to scripts there. If you want, you can push the changes back to us so that we can consider their inclusion in Office365ITPros. It's a great example of community in action.
    • Creating a ConfigMgr (SCCM) Bootable Media – PowerShell Style
      \ Here is a PowerShell script that will create Bootable Media for ConfigMgr.
    • pipEnv v 0.1.2
      \ Unofficial installer, runner and utilities for pipenv.

    Books, Media, and Learning Resources

    Community

    • PowerShell Changed My Life... with Adam Bacon.
      \ In this episode of the PowerShell Podcast, Andrew catches up with returning guest Adam Bacon. Adam shares an update on his career and shares how PowerShell has played a huge role in helping him accomplish his dream. 
    • The Art and Science of PowerShell Module Development with Fred Weinmann
      \ In this episode of the PowerShell Podcast, we sit down with Fred Weinmann, a prolific PowerShell module creator, to explore his remarkable contributions, including PSFramework, PSModuleDevelopment, PSUtil, and PSFramework.Nuget. Fred shares insights on developing impactful solutions, such as the KRBTGT module and the evolution of module development in large-scale environments.

     

    Events

  • Powershell @programming.dev
    pwshguy (mdowst) @programming.dev

    PowerShell Weekly for January 24, 2025

    I really appreciate your understanding for the missed edition last week. To make up for it, this week’s issue is packed with even more tips, insights, and updates to level up your PowerShell skills.

    Blogs, Articles, and Posts

    Powershell @programming.dev
    pwshguy (mdowst) @programming.dev

    PowerShell Weekly for January 10, 2025

    Announcements!

    • Pester v5.7.0
      \ Pester 5.7.0 is out, it adds new code coverage format Cobertura, and other fixes

    Blogs, Articles, and Posts

    • PowerShell Pester 101: A Practical Guide for Beginners
      \ Learn how to validate your PowerShell scripts with Pester testing. This hands-on guide shows you how to write tests that ensure your code works as intended.
    • Automated Provisioning of Windows 365 Cloud PCs: Advanced Scripts
      \ We decided that we would create some more advanced scripts for admins, which would include some error handling, prompts for input, and more. You will be able to use these scripts to provision your Entra ID joined Cloud PCs for various scenarios, be it using a Microsoft Hosted network or an Azure Network Connection, Enterprise or Frontline buil
    Powershell @programming.dev
    pwshguy (mdowst) @programming.dev

    PowerShell Weekly for January 3, 2025

    Blogs, Articles, and Posts

    Powershell @programming.dev
    pwshguy (mdowst) @programming.dev

    PowerShell Weekly for December 20, 2024

    This is the final edition of PowerShell Weekly for 2024. Since this newsletter is hand-curated, I always take the last week of the year off to rest and reflect. I’ll return in the New Year with fresh content and my annual year-in-review, covering all the major PowerShell highlights from 2024.

    Announcements!

    • Announcing a free GitHub Copilot for VS Code
      \ We're excited to announce an all new free plan for GitHub Copilot, available for everyone today in VS Code. All you need is a GitHub account. No trial. No subscription. No credit card required.

    Blogs, Articles, and Posts

    Powershell @programming.dev
    pwshguy (mdowst) @programming.dev

    PowerShell Weekly for December 13, 2024

    Blogs, Articles, and Posts

    • Install and integrate Microsoft AI Shell with a PowerShell module
      \ Microsoft’s new AI Shell integrates AI into command-line workflows, featuring the Azure OpenAI Agent and Copilot in Azure Agent for tasks like PowerShell scripting and cloud automation. You can install AI Shell (aish.exe) as a standalone app or PowerShell module to streamline coding, error resolution, and resource management on Windows, macOS, or Linux.
    • Jingle All the Way to Savings: Automate Azure Bastion with Azure Automation!
      \ In my blog post contribution for this year’s Festive Tech Calendar, I’ll show you how to reduce Azure costs by automating the runtime of your Azure Bastion host(s) with Azure Automation.
    • [Setting Up VS Code for PowerShell Development: A Beginner’s
    Powershell @programming.dev
    pwshguy (mdowst) @programming.dev

    Using PowerShell in JupyterHub for Sharing and Collaboration

    Hey c/PowerShell community!

    I’m excited to announce the launch of my new YouTube series, PowerShell Collaboration Unleashed!.

    In the first part, we dive into The Littlest JupyterHub— an awesome tool for creating shared environments on a single server. These environments are accessible from any web browser, allowing you to create, run, and share scripts effortlessly.

    Here’s what you’ll learn in the first part of the series:

    • An intro to JupyterHub and why it’s a game-changer for collaboration.
    • How to provision an Ubuntu server for The Littlest JupyterHub.
    • Installing and configuring The Littlest JupyterHub and support for dotnet and PowerShell.
    • Setting up shared environments you can start using right away.

    Future videos will cover topics like setting up SSH, adding AzureAD/Entra ID authentication, connecting to external resources, securing secrets, logging, and integration with source control.

    If yo

    Powershell @programming.dev
    pwshguy (mdowst) @programming.dev

    PowerShell Weekly for December 6, 2024

    Announcements!

    • PowerShell VSCode Extension v2024.5.2-preview
      \ New PowerShell VSCode extension preview release v2024.5.1! This includes the breakpoint performance improvement I developed, you should see stepping through code work much faster. Please try to break this feature before release!

    Blogs, Articles, and Posts

  • No Azure DevOps automatically increments it every time you run the pipeline.

  • Just looking at it from the point of view of making the script more portable and easier for someone else to run, there are a few things I would address.

    The first is the Write-Host commands all over the script. I would recommend converting those to Write-Verbose. Here is a great explanation when to use Write-Host vs other outputs.

    There are also numerous Write-Output commands in the script. Anything sent to the Write-Output will be returned to the calling console. If you need to take additional actions based on the results of this script, this could cause issues. You can run into problems with the New-Item commands in there too, as they will produce output. You might consider saving them to a variable or piping to Out-Null.

    Also, there is no need to call exit and set an exit code in the way you are. If you want to write and error but have the script continue you can use, Write-Error. If you want the processing to terminate then use throw. Doing it this way will allow PowerShell’s built-in error handling to take care of the exit codes. It will also give you greater flexibility with using Error Action Preferences and using try/catch statements.

    Finally, you have a path hardcoded for the workingDir. I would suggest making this a parameter or using an environment variable as this will make it more portable. Also, when creating the log variable, you will want to use the Join-Path cmdlet instead of just joining strings.

  • Community

    • Kubernetes is Easy with Anthony Nocentino
      \ In this episode of the PowerShell Podcast, we sit down with Anthony Nocentino, a Senior Principal Field Solution Architect at Pure Storage, to dive deep into the world of Kubernetes. Anthony breaks down what Kubernetes is and how it fits into the modern IT landscape. We explore his fascinating career journey, from consulting and SQL Server to educating the masses on Kubernetes and Linux. Anthony also shares invaluable insights on becoming a force multiplier in your career and the critical role of mentorship and offers sage advice for anyone looking to elevate their professional path.
    • PSSaturday Karlsuhe Call for Speakers
      \ We are excited to announce that we are looking for speakers for the upcoming PSSaturday in Germany this November! Whether you're a first-time speaker or an experienced presenter, we welcome you to share your ideas. If you have an interesting topic and are willing to speak for up to 45 minutes, we want to hear from you.
  • Projects, Scripts, and Modules

    Books, Media, and Learning Resources

    • Build a Superfast Research Assistant using PowerShell and AI
      \ In this episode, I’ll show you how to combine PowerShell with AI to automate tasks, chat with your data, and build intelligent agents—all within your console and scripts.
    • Interactive Data at Your Fingertips: PowerShell AI Converts Data to Interactive HTML
      \ Transform your data with PowerShell and AI. In this video, Doug Finke, a 15x Microsoft MVP, shows how to use the PSAI module to convert Excel and CSV files into interactive HTML pages. You'll learn how to sort and interact with your data directly in your browser using the new ConvertTo-InteractiveHTML function. Doug walks through generating HTML tables with sortable columns and customizing them using AI. Whether you're managing large datasets or need a quick way to visualize your data, this tutorial will guide you through the process. Install the PSAI module and start making your data more dynamic.
    • How To PowerShell Code in Docker Containers
      \ In this video, we guide you through the process of installing and running Docker using PowerShell on Windows. Whether you're a beginner or an experienced developer, this step-by-step tutorial will help you get Docker up and running quickly and efficiently.
  • I remember before scrambling they just put blocks that prevented you from going to certain channels. I somehow figured out if you ran the cable box through the VCR first and put it on channel 2 while the TV was still on 3, it would shift all the channels down one. Cinemax was channel 14, which our box just would not go to. But it would go to 13, so doing my little trick teenage me got to watch a lot of skinamax.

  • It took me longer than I would have liked, but I did finally get the next video uploaded. I hope you enjoy it as well.

    https://youtu.be/Do5Ve6M9mmU

  • Projects, Scripts, and Modules

    • 365AutomatedLab and new companion module coming soon
      \ 365AutomatedLab and new companion module coming soon I promise I haven’t forgotten about 365AutomatedLab, but I’ll be honest after Microsoft made the announcement of no more new Dev tenants it hurt a bit as I know how useful they are on learning and testing features and PowerShell without hurting your production environment.
    • How to Create SharePoint List & Add Columns Using PnP PowerShell?
      \ Recently, I developed one Power Apps application that needed a SharePoint list data source. Before running the application, the client must create the specific SharePoint list on their site. So, I wrote a Power Shell script to create the SharePoint list along columns to avoid mistakes when creating it manually.
    • PowerShell-Yayaml v0.5.0
      \ What's changed…
    • PSDates v1.0.4
      \ Tons of new stuff added including calculating sunrise and sunset time.

    Books, Media, and Learning Resources

    Community

    • Behind the Scenes at PSConf.EU: Harm Veenstra’s Experience and Insights
      \ In this episode of the PowerShell Podcast, we sit down with Microsoft MVP Harm Veenstra to discuss his exciting experiences at PSConf.EU, where he attended for the first time and embarked on a new journey into public speaking. Harm shares his thoughts on receiving the prestigious Microsoft MVP award and delves into his recent projects, including creating a TCP/UDP listener for testing firewall ports and using a Pi-hole to block ads on his home network. We also explore his perspectives on automation in the MSP world, the power of Microsoft Graph, and why he hasn’t yet adopted AI tools. Tune in for an engaging conversation filled with insights, tips, and highlights from PSConf.EU!
    • Write Code, Write Blogs: Lessons with Brock Bingham
      \ In our latest Powershell Podcast episode, we chat with Brock Bingham. We explore his transition from sysadmin to writer and his viewpoint of coding as creative problem-solving. Brock also shares insightful blogging tips and advises against the pitfalls of comparison. A must-listen for aspiring PowerShellers. (plz create a blog and share your learnings for future you)
  • Nice write up, and a great primer for someone coming from the Linux/Bash world.

  • Thanks! I'd love to hear your thoughts once you've watched it.

  • Community

    • PipeScript, Formatting, and Docker: An In-Depth Conversation with James Brundage
      \ In this episode of the PowerShell Podcast, we are joined by Microsoft MVP, former PowerShell team member, and module maker extraordinaire James Brundage. We hear about his experience at Microsoft Build, learn all docker and kubernetes while discussing his Rocker module, UserGroup updates, implicit interpretation in Pipescript, formatting and types, and so much more. Strap in because we go deep in this one.
    • Breaking Down ModuleFast and More with Justin Grote
      \ In this episode of the PowerShell Podcast, host Andrew Pla interviews Microsoft MVP and PowerShell aficionado Justin Grote. They delve into an issue in the Az.Accounts 3.0.0 module, with Justin offering insights and a workaround (use an earlier version of the module). Justin also discusses his innovative ModuleFast project, explaining its architecture and his approach to writing PowerShell scripts and modules. The conversation highlights Justin's passion for APIs and celebrates his contributions as an official PowerShell project contributor. Listeners get a glimpse into Justin's workflow working at a Managed Service Provider (MSP) and how he writes to much PowerShell. He offers valuable advice for those early in their careers. Additionally, Justin shares updates on his PowerHTML (1.2m downloads) project, which originated from a GitHub pull request, showcasing his continuous contributions to the PowerShell community.
    • PowerShell Community Call - May 16th, 2024
      \ Last month's community call with the PowerShell team.
  • Books, Media, and Learning Resources

  • Projects, Scripts, and Modules

    • passwordstate-management v 4.4.49
      \ Powershell Module for managing Password State
    • PowerQualys v 0.3.0
      \ Helper module for Qualys
    • WinTuner v 0.8.9
      \ Package and publish any apps from WinGet to Intune.
    • Interpreting Audit Records for Teams Meeting Recordings (Again)
      \ Three years ago, I wrote a script to analyze the audit records generated for Teams meeting recordings. Then things changed in terms of how the audit records were generated and how the Search-UnifiedAuditLog cmdlet returns audit search results. All of which meant that considerable work was needed to revamp (rewrite) the script. Maybe you need to check any script that uses the Search-UnifiedAuditLog cmdlet too?
    • tiPS v 1.3.10
      \ PowerShell tips delivered straight to your terminal.
  • Thanks! I'm glad to hear you are finding it useful.

  • Thanks! I'm glad to hear others are finding it useful.

  • If I understand correctly, the signatures generated by PuTTY aren’t perfectly random, so if someone got a hold of a bunch of keys from a server, they could figure out the pattern. It takes about 60 keys. This affects not just PuTTY, but also FileZilla, WinSCP, TortoiseGit, and TortoiseSVN.

    In other words if you have NIST P-521 keys, or any others using 521-bit ECDSA, you should revoke them and generate new key pairs. After you update your software.

  • I installed some security cameras around my house and set up Shinobi using an old PC. Unfortunately the PC is too old to use the built-in detectors in Shinobi. So, I took my first dive into playing around with some image detectors.

    I wrote some python to download the daily recording from old PC to a newer one with a 3080 GPU. Then checks the videos for people. It will then trim the videos to only include times were there are people in frame. It cut my the storage requirements by over 95%.

  • Joel "Jaykul" Bennet is an opinionated DevOps engineer, programmer, speaker, and Microsoft MVP.

    I love that description. I can't wait to listen to it tonight!

  • Just a heads up, I received confirmation from the product team that the AZUREPS_HOST_ENVIRONMENT environment variable is going away. They are moving the backend to containers. Also, the COMPUTERNAME one that was always "client" is going to change too. The COMPUTERNAME will now be "Sandbox-###" with # being random numbers. I started using the code block below in my runbooks to find if they are running in Azure or hybrid worker/locally. It accounts for the current and the updates that will be rolling out in the near future.

     undefined
        
    $isHybridWorker = $true
    if (($env:computername) -eq "CLIENT") {
        $isHybridWorker = $false
    }
    elseif ($env:USERNAME -eq 'ContainerAdministrator') {
        $isHybridWorker = $false
    }
    ``
      
  • Typically, when I have a script I need to test locally, I’ll comment out the identity connection command and just authenticate outside of my script. If I’m feeling real fancy, I’ll write a try/catch to attempt to authenticate first as the managed identity then if it fails prompt me for credentials. Not the most elegant solution, but it works.

     undefined
        
    try {
        Add-AzAccount -Identity -SubscriptionId $SubscriptionId -ErrorAction Stop | Out-Null
    }    
    catch {
        Add-AzAccount -SubscriptionId $SubscriptionId
    }