Intune Detection Script

Intune Detection Script

Hi there! Have you ever scratched your head and wondered if you loaded software the right way? You’re not by yourself. This gives a lot of system administrators a headache. This is especially hard to do when handling programs like AutoCAD 2022 in a variety of settings. That is where Microsoft Intune really shines. The fact that you can use your own recognition scripts makes it very useful. A custom Intune detection script is key.

These scripts save my life a lot. They help you check every network gadget. This makes sure that not only is there an app, but it’s also the right version for you. Today, we’re going to look in detail at a PowerShell script that can find AutoCAD 2022. This guide will help make your business life a little easier, no matter how much you know about Intune or how new you are to it. Allow us to begin on our Intune detection script!

How do I make a Intune Detection Script?

First, what does a custom Intune recognition script really mean? It’s just a script for your control tool for Microsoft Intune. It checks automatically to make sure that all of your devices have the same version of software loaded. What makes this cool? Because it takes care of one of the most boring jobs in IT management automatically. Imagine making sure that software is compliant and installations are correct without having to check each machine by hand. Not interested!

PowerShell is used to make custom scripts like the one we’re talking about today. It is a strong programming language that can do a lot with just a few lines of code. These scripts can get into the Windows Registry, find loaded programs, and check out different versions of installed programs. It’s not just about saving time; it’s also about making sure that your software deployments work well and stay stable. We all hate those crazy support calls, but this cuts down on them.

The Breakdown

Getting into the nitty-gritty of our PowerShell script, let’s break it down line by line. This will help you understand exactly what each part does. Let’s get our geek on!

The Script

$ProductName = "AutoCAD 2022"
$ProductVersion = "24.1.173.0"
$RegPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
$apps = Get-ChildItem -Path $RegPath 
$Test = foreach ($app in $apps) {
    $app | Get-ItemProperty | Where-Object {($_.DisplayName -like "$ProductName")} | select-object *
}
if ($Test.displayversion -ge "$ProductVersion") {
    write-host "Installed - $($test.DisplayVersion)"
    exit 0
} else {
    exit 1
}

Lets go line by line in our Intune Detection script and break it down.

Line 1-2: Define the Product

These two lines allow you to define the product you want to search for and the Version you wish to check for. The product name can take wild cards, but I don’t suggest it as it can cause more conflicts than be helpful.

$ProductName = "AutoCAD 2022"
$ProductVersion = "24.1.173.0"

Line 3: Setting the Registry Path

The next line is where we look in the registry for the uninstall strings and product information. These registry keys is what win32_product looks at to get information. Thus, it’s much faster than using the win32_product.

$RegPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"

Line 4: Gather Installed Applications

Here, we’re grabbing a list of all items in the paths defined earlier. It’s akin to gathering all the potential treasure chests. We will use these magical coins later to get what we need.

$apps = Get-ChildItem -Path $RegPath

Lines 5 – 7: filter and test for the product

In these lines, we loop through each app and check if it matches our product name. If it does, we take a closer look at its properties. Here we are checking for our gold coins vs the silver coins. We take each of the products we want, and put it into our test varaible, or chest.

$Test = foreach ($app in $apps) {
    $app | Get-ItemProperty | Where-Object {($_.DisplayName -like "$ProductName")} | select-object *
}

Lines 8-12: Check Version and Provide Output

Assuming you have chosen a name that will only show up once, we now check to see if the version matches up. If it does, then we say, yep, it’s installed and exit with a code of ZERO, the big 0. If it doesn’t, then we exit with the error code of 1. This is important as Intune is looking for a string and an error code of 0 for success.

if ($Test.displayversion -ge "$ProductVersion") {
    write-host "Installed - $($test.DisplayVersion)"
    exit 0
} else {
    exit 1
}

To Deploy Your Script with Intune

Intune’s custom detection script deployment requires more than copying and pasting code. Ensure the script operates smoothly on all targeted devices. Step-by-step instructions:

  1. The first step in script preparation is to test it locally. You shouldn’t distribute something without testing on your own machines.
  2. Put the script in Intune:
    • Enter the Microsoft Endpoint Manager admin center.
    • Select Windows 10 under Devices > Scripts > Add.
    • PowerShell script upload and settings. This involves choosing a system or user context for the script based on access level.
  3. Assign script:
    • After uploading your script, assign it to device groups. You can choose groups by organizational units or other deployment parameters.
  4. Monitor script deployment:
    • Monitor script execution on the script profile’s Device Status and User Status tabs after deployment. This shows if the script is executing properly or if any devices are failing.
  5. Update as needed:
    • Monitoring feedback may need script or deployment parameters changes. Maintaining compatibility with new system updates or IT environment changes may need regular updates.

Effective script deployment guarantees that all network devices meet software standards. Assuring all machine parts are well-oiled and working together.

    Common Issues and Troubleshooting Tips for a Intune Detection Script

    Even with the best preparation, things might not always go as planned. Here are some common issues you might face with custom Intune scripts and how to troubleshoot them:

    1. Script Fails to Execute:
      • Check Execution Policy: Ensure that the script’s execution policy allows it to run. This policy can sometimes block scripts if not set to an appropriate level.
      • Review Script Permissions: Make sure the script has the necessary permissions to access the registry paths or any other resources it uses.
    2. Incorrect Script Output:
      • Verify Script Logic: Double-check your script’s logic. Look for typos in variable names or incorrect operators in conditions.
      • Test Locally: Always run the script locally on a test machine before deploying it to avoid simple errors.
    3. Issues with Script Deployment:
      • Assignment Errors: Make sure the script is assigned to the correct device groups. Incorrect assignments can lead to the script not being run where it’s needed.
      • Check Intune Logs: Use the logs provided by Intune to identify what’s going wrong when the script runs.

    Troubleshooting is an integral part of managing scripts in a large environment. It’s a little like detective work, where you need to keep a keen eye on clues and sometimes think outside the box.

    What can we learn as a person today?

    Even though we don’t always mean it that way, we frequently execute “scripts” in our day-to-day lives, much like a PowerShell script checks for certain conditions before proclaiming success or failure. These are the things we do on a regular basis without thinking, like automated checks on a computer system; they help us evaluate and respond to the many opportunities and threats that life presents.

    When we look for patterns in our own lives, we can see what’s working and what isn’t. By exercising first thing in the morning, for instance, you may find that you get more done that day. This would be an example of a positive pattern, like a script that verifies everything is going according to plan. In contrast, if you find yourself feeling low after a session of social networking, it’s a sign that something needs to be changed, similar to a script fault.

    It is essential to listen to environmental feedback in order to make modifications. Our emotional and physiological responses, the opinions of others around us, and the outcomes we attain can all serve as sources of this type of feedback. Like adjusting a screenplay that isn’t working as planned, when our life’s routines bring about less ideal consequences, it’s a warning to halt and re-calibrate. Perhaps it necessitates reevaluating our current habits and deciding how much time is best spent on specific pursuits.

    The idea is to embrace learning and refining as a process, just like scripts that are updated over time. There is no instruction manual for life, and sometimes the only way to learn is by making mistakes. Being self-aware and willing to make adjustments for the better is more important than striving for perfection.

    Additional Resources

    Windows 11 VM on Hyper-V with PowerShell

    Windows 11 VM on Hyper-V with PowerShell

    Hi there! When you were setting up a virtual machine, did you ever get stuck and scratch your head? You’re not the only one. I still remember the first time I tried it; let’s just say there were more “oops” than I’d like to admit. The good news is that I’ve been there, and I can show you how to use PowerShell to set up a Windows 11 VM on Hyper-V.

    The next question you might have is “Why PowerShell?” Believe me, you’ll be a pro at setting up VMs once you get the hang of it. Also, it’s always good to have a cool trick handy, right? I’ll show you how to set up a VM whether you need it for work, testing, or simple fun. Let’s go on this trip together and setup Windows 11 VM on Hyper-V with PowerShell.

    Why Set Up a VM with PowerShell?

    Then you might ask, “What’s the big deal about PowerShell?” I can tell you, it’s like having a magic wand for your computer, but it’s more of a little blue box instead of a wooden stick. (Not a Tardis, sorry, Dr. Who fans.) You can make a VM, set it up, and have it going in no time with just a few commands. But it’s not just about speed. You can be precise, have full control, and automate jobs with PowerShell. This makes your life a lot easier.

    I remember setting up several virtual machines for a job. It would have been a headache to do it by hand. It was like telling my computer, “Hey, do this for me, will you?” with PowerShell. And that was it, it was done. It was like having your own genie!

    But here’s the really cool part: Standardization through automation is a big reason why people use PowerShell. It’s important to be able to do things over and over again in IT. We can do this with PowerShell, which makes sure that every VM setting is the same and free of mistakes. You know that every time you bake that cake, it will turn out just right because you have a plan.

    Using PowerShell for your VM setups is a game-changer, no matter how experienced you are or how new you are to it. When you do it this way, you’ll be more efficient, in charge, and consistent. Are you ready to use your magic wand? Let’s do it.

    Prerequisites

    Before we dive into the magical world of setting up a VM, let’s make sure everything is ready. To begin, you will need these things:

    1. A Windows 10 or 11 Pro computer: This is our trusty horse, ready to take us through the process of setting up our VM. To get to Hyper-V, make sure it’s at least the Pro version.
    2. Make sure that Hyper-V is turned on for your machine. For me, it’s like letting the world of virtualization in.
    3. The Windows 11 ISO file is: This is a plan for the VM that we are going to build soon. It’s available for download on the Microsoft page.
    4. TPM chip and system that can handle virtualization: Make sure that your computer has a TPM chip and an engine that can handle virtualization. It’s like having the right engine and safety features to make the ride go smoothly.
    5. RAM: For running properly, your host OS needs at least 8 GB of RAM, and the VM needs at least 6 GB. I think you should have 16 GB of RAM so that both your host and VM work right.
    6. Finally, enough disk space. This is dependent on you, but at least 32 gb of free space is recommended for a useful system.

    Lets get started

    Setting up Hyper-V

    Now, it’s time to start sounding like a robot. So, lets roll up our sleeves and get our fingers dirty. Setting up Hyper-V is our first step towards creating our Windows 11 VM. Here’s how we do it:

    1. Enable Hyper-V: Open PowerShell as an administrator. Then we will flip the virtualization engine on inside Windows with the following command:
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
    
    1. Verify Hyper-V Installation: Once the installation is complete, We need to make sure it all worked. We can do this by running the following command in the same window:
    Get-WindowsOptionalFeature -FeatureName Microsoft-Hyper-V -Online
    
    1. Restart Your Machine: Because we are working with windows, We need to restart after installing hyper-v. Thanks windows. You can restart from your powershell console.
    Restart-Computer -force
    

    So that’s it for Hyper-V! Now that Hyper-V is set up, our Windows 11 VM can run on it. Setting up the stage for a big show is like that.

    Creating the Windows 11 VM

    Now that we have Hyper-V ready, it’s time to create our Windows 11 VM. Follow these steps, and you’ll have your VM up and running in no time:

    1. Open PowerShell as Administrator: Start by opening PowerShell with administrative privileges. It’s like putting on your wizard hat before casting a spell.
    2. Create a New Virtual Machine: The below command conjures up a new VM named “Windows11VM” with 6GB of RAM and a 50GB virtual hard drive. It’s like building the foundation of your virtual house.
    New-VM -Name "Windows11VM" -MemoryStartupBytes 6GB -BootDevice VHD -NewVHDPath "C:\VMs\Windows11VM.vhdx" -NewVHDSizeBytes 50GB -Generation 2 -SwitchName "Default Switch" 
    
    1. Mount the Windows 11 ISO: Now, let’s attach the Windows 11 ISO to our VM. This step is like putting the key in the ignition, getting ready to start the engine.
    Set-VMDvdDrive -VMName "Windows11VM" -Path "C:\Path\To\Your\Windows11.iso"
    
    1. Start the VM and Install Windows 11: Finally, start your VM and go through the Windows 11 installation. Connect to your VM using the Hyper-V Manager and proceed with the Windows 11 installation. It’s like watching your virtual house come to life, brick by brick.
    Start-VM -Name "Windows11VM"
    

    And there you have it! Your Windows 11 VM is now created and ready for action. It’s like having a brand-new playground to explore and enjoy.

    What can we learn as a person today?

    Do you remember exploring your toy box for your favorite toy as a kid? Always bottom, right? However, the thrill was finding all those great gadgets you forgot you had. Techies feel like way when fiddling with virtual machines. It’s our adult toy box full with electronic toys waiting to be played with.

    Our VM is like an old toy box every time we use it. We may be looking for something specific, but we often find interesting new tricks or forgotten skills. Exploring and playing keeps us interested in tech and exercises our minds.

    Having a place to experiment, make errors, and learn is crucial. It’s about exploring and having fun, not just making virtual machines. Please enjoy your virtual toy boxes and the excitement and growth they offer to your life as we navigate the tech world.

    Additional Resources

    Tailscale and Linux

    Tailscale and Linux

    Hey there, tech aficionado! So, you’ve got yourself a Linux-based home lab, and you’re probably thinking, “How do I make all these gadgets talk to each other without going down the rabbit hole of traditional VPN setups?” Well, let me introduce you to your new digital BFF, Tailscale and Linux in your home lab. It’s about to make your life a whole lot easier, and I’m here to guide you through it, minus the techno-babble. You can find more information about Tailscale here.

    Why Tailscale? Because Simplicity is King

    Tailscale is like that one friend who knows everybody and can help you sneak into any club. It uses WireGuard under the hood, which is like the VIP pass of VPN technologies: sleek, fast, and doesn’t bog you down with unnecessary baggage. The real kicker? It makes your devices think they’re on the same network, so they can share stuff securely without a middleman. In the world of home labs, that’s gold.

    Getting Tailscale Up and Running: The Quick and Dirty

    Alright, roll up your sleeves. It’s easier than you think.

    1. Install Tailscale: Open a terminal window and let’s get the party started. Paste this command and hit. This is like sending out the invitations.
    curl -fsSL https://tailscale.com/install.sh | sh
    
    1. Sign Up or Log In: With Tailscale installed, it’s time to make it official. Type. This will pop open a browser window for you to either log in or sign up. Think of it as the bouncer checking your ID.
    tailscale up
    
    1. Bringing in the Squad: Now that you’re in, start installing Tailscale on all your devices. Just rinse and repeat the steps above. It’s like gathering your friends for an exclusive party.
    2. Who’s in the Club?: Wondering if all your devices made it? This gives you a guest list of all the devices connected to your Tailscale network.
    tailscale status 
    
    1. Sharing is Caring: Got a service running on one device that you want to share? Tailscale’s got your back with easy-peasy sharing options. It’s like telling your friends, “Hey, check out this cool thing!”

    Why You’ll Love Tailscale for Your Linux Home Lab

    • No More Headaches: Forget about diving into complex VPN setups or battling port forwarding. Tailscale makes it look like child’s play.
    • Safe and Secure: With Tailscale and Linux, your data is Fort Knox safe, wrapped up in encryption so tight not even Houdini could escape.
    • Be Everywhere at Once: Access your home lab services securely from anywhere, as if you’re teleporting around the digital universe.

    Wrap-Up: Your Home Lab, Supercharged

    And just like that, you’re not just a tech enthusiast anymore; you’re a networking wizard. Tailscale turns your home lab into a fortress of solitude where all your devices can hang out securely, no matter where you are in the world.

    So, give Tailscale a spin. Play around with it. Break things (figuratively, please). Fix them. That’s the beauty of a home lab, after all. It’s your playground. And with Tailscale, it’s like having the best toys without the mess. Happy networking, my friend!

    What can we learn as a person today?

    Have you ever come across the K.I.S.S. principle? It stands for “Keep It Simple, Stupid,” and was made up by Kelly Johnson of Lockheed Skunk Works. The idea behind it is that keeping things simple often leads to the best results. In addition to being useful in engineering, this piece of advice can also be used to clear out our daily lives and the places we live in. In a world that’s always looking for new and difficult things, getting back to the basics has a lot of power.

    Imagine applying K.I.S.S. to every part of your life, like picking tasks, responsibilities, and even your social media interactions, with a focus on how simple they are. What if we focused on the things that really make life better, make us happy, or are absolutely necessary? We don’t need to do less; we just need to be more thoughtful about how we spend our time and energy. Cutting through the noise isn’t about making things easier; it’s about making things clearer and better.

    When you use K.I.S.S., it’s like deciding to juggle fewer balls more skillfully instead of more balls that you might drop. To breathe, focus, and do well, you need to make space for that. It’s easier to grow, be creative, and find peace when you have fewer responsibilities to choose. It’s not only smart to keep things simple, it’s also a way to live a more focused and satisfying life.

    Additional Readings

    PowerShell App Deployment Toolkit

    PowerShell App Deployment Toolkit

    Over the years of Intune deployments, I have searched for a way to let my end users know that an application is being installed or uninstalled from their computer. I have used things ranging from notification bubbles to blanking a screen. All of these methodologies are poor at best. I found a few paid items that companies just didn’t want to pay for due to the insanity of the pricing. For example, one company wanted us to pay 150 USD per deployment. Times that by 1500 devices, that adds up quickly. It wasn’t until I found the PowerShell App Deployment Toolkit that I found what I was finally looking for.

    What is the PowerShell App Deployment Toolkit?

    This toolkit is an immensely powerful and amazingly simple setup. You can download the tool kit here. It provides a framework to install and uninstall applications using PowerShell through a signed application. This allows us to deploy complex and confusing deployments as a single package. A good example would be AutoCAD. Recently, I was tasked with standardizing AutoCAD in a single department. Some members used AutoCAD 2016, some used 2024. This was a problem as the 2024 files did not work with the 2016 AutoCAD. Thus, I needed to uninstall the previous versions of AutoCAD before I installed the current version. As all files are backed up, I didn’t have to worry about them losing any files. The toolkit was perfect for this.

    Key items I like of the toolkit

    Simple packaging

    Many application toolkits come with complex packaging. It’s normally an application that wraps itself around another application that keeps doing this until it’s all transparent. With the PowerShell App Deployment Toolkit, all you need to interact with is the deploy-application.ps1 file. That’s assuming you are doing more than an a MSI file. If you are only using an MSI file, all you need to do is drop the file in.

    As you can see in the screen shot, this is the package. When you download the zip file, you will be greeted with this amazing structure. The Deploy-Application.ps1 is where our code will go. The Files folder is where the installer files would go. Following our auto cad example, the installer and updates would all be placed inside the Files folder.

    Deploy-Application.ps1

    This file has an amazing setup. It first has a wall of documentation inside the file itself. The file explains each step along the way. It is broken up into installation, uninstallation, and repair. Each section has a Pre, during and post process in each section. This is great if you need to kill some services, send a message or more. It’s also helpful because it gives you a structure to work within.

    The Commands

    Inside this packaging there are many useful commands. As I stated in the intro, it’s full of ways to communicate what you are doing with the end user. During an application install, you can show which applications needs to be turned off for the install to work by using the show-installationwelcome command.

    Show-InstallationWelcome -CloseApps 'acad,adSSO,AutodeskDesktopApp,AdAppMgrSvc,AdskLicensingService,AdskLicensingAgent,FNPLicensingService' -CloseAppsCountdown 60
    

    This example shows us it wants to close the applications and gives the user a 60 second window to do so. This isn’t the only thing this command can do.

    SYNTAX
        Show-InstallationWelcome [-CloseApps <String>] [-Silent] [-CloseAppsCountdown <Int32>] [-ForceCloseAppsCountdown 
        <Int32>] [-PromptToSave] [-PersistPrompt] [-BlockExecution] [-AllowDefer] [-AllowDeferCloseApps] [-DeferTimes 
        <Int32>] [-DeferDays <Int32>] [-DeferDeadline <String>] [-MinimizeWindows <Boolean>] [-TopMost <Boolean>] 
        [-ForceCountdown <Int32>] [-CustomText] [<CommonParameters>]
        
        Show-InstallationWelcome [-CloseApps <String>] [-Silent] [-CloseAppsCountdown <Int32>] [-ForceCloseAppsCountdown 
        <Int32>] [-PromptToSave] [-PersistPrompt] [-BlockExecution] [-AllowDefer] [-AllowDeferCloseApps] [-DeferTimes 
        <Int32>] [-DeferDays <Int32>] [-DeferDeadline <String>] -CheckDiskSpace [-RequiredDiskSpace <Int32>] 
        [-MinimizeWindows <Boolean>] [-TopMost <Boolean>] [-ForceCountdown <Int32>] [-CustomText] [<CommonParameters>]
    

    Other commands like execute-process, will launch processes that you need from the file directory and more. All while logging what’s going on. You can find a full help system for all the unique commands inside the tool kit. Navigate to the tool kit > AppDeployToolkit > AppDeployToolkithelp.ps1 will bring up a gui that allows you to read all about the commands.

    Using the Toolkit with Intune

    If you want the tool kit to work with the end user profile, then you will need to grab a unique little tool from MDT. We will need the ServiceUI.exe from the MDT software. You can download MDT here. Once you have the MDT installed. we need to pull the ServiceUI.exe out of the MDT install. Navigate to, C:\Program Files\Microsoft Deployment Toolkit\Templates\Distribution\Tools\x64 and copy the ServiceUI.exe file. Place this file in the home of your PowerShell App Deployment Toolkit file structure.

    As you can see, the ServiceUI.exe is in the root folder. Now we need to create the package. We can create a win32 app package. I covered this here. This is the same concept.

    • The folder would be the folder with your toolkit
    • The setup file would be the Deploy-Application.exe
    • The output file would be wherever you want the Intune app to be dumped.
    • and we don’t need to catalog the folder.

    Once you have your application built, it’s time to see how it works inside Intune. We start by building your application package. As stated in the previous blog, we start the application by uploading. The big difference here is our install and uninstall commands.

    Understanding the commands

    Our install command will be the using the ServiceUI.exe and the deploy-application.exe

    • Install: ServiceUI.exe -process:explorer.exe Deploy-Application.exe
    • Uninstall: ServiceUI.exe -process:explorer.exe Deploy-Application.exe -DeploymentType “Uninstall” -DeployMode “Interactive”

    By default, the Deploy-application.exe will be interactive. There are two flags for the Deploy-Application and here are what they are.

    • DeploymentType: (Super Straight forward)
      • Install: Installs the application
      • Uninstall: Uninstalls the application
      • Repair: repairs the application.
    • DeployMode:
      • Interactive: Shows all of the prompts needed.
      • NonInteractive: Only shows the required prompts.
      • Silent: Shows no prompts.

    We can translate the command above by using these flags. By default the Deploy-application.exe is install and interactive. So, we know that the application would be prompted and the end user will see the command. The uninstall command will uninstall and it will be interactive. The ServiceUI.exe allows you to run applications as the user in and the system at the same time. The biggest issue with the ServiceUI.exe is the application will not install until someone logs in. No flags are needed here.

    Over all, PSappdeploytoolkit changes the ball game with deployments. I encourage anyone and everyone to dig deeper into it.

    What can we learn as a person today?

    I live in the south of United states. From time to time I will hear people battling over belief systems. In my life time I have come to an understanding of how these systems work. I liken “objective truth” as fish in a sea. Our belief systems is the net we use to capture those fish. Some nets are better than others. The water of the sea is useless, distracting, or misinformation. It only makes it harder to bring those pieces of the objective truth into ourselves. A good net can capture a lot of fish, and let the water out at the same time. A bad net, like a tarp, captures some but becomes unmanageable due to the water. This is the same way with our beliefs. We are only strong enough to lift so much at different points in our lives.

    Premade Nets

    I see organized religions as premade nets. Think of it like a tool kit. It’s a format that is easy to use and allows you to do stuff with it. Does the toolkit work for everyone, no. Just like this PowerShell toolkit, it would be useless in a world without powershell. So chromeOS, this toolkit isn’t useful. This is the same with some beliefs. They are useful where they are, but not useful in other places. Sometimes these toolkits/nets, are useful for some but not others. If you don’t know PowerShell, this toolkit wouldn’t be useful to you. If you are shame sensitive, some religions are not for you.

    Everyone has their own tool set or net. No single tool set is inherently bad. It’s how we use them and where we use them. If you take a net to a small pond, get ready to waste your time and damage your net. If you throw your net aggressively into a aggressive sea, get ready to lose that net.

    Homemade Nets

    Once someone understands how the nets are made and how to repair them, It’s always best for them to start building their own nets using the techniques they have used on their previous nets. By having a net/toolset of your own, this allows you to have full knowledge and be able to repair quickly. This belief system would be uniquely yours and different from others. So, when it breaks, you can grow it, replace parts, and more without having any problems. It’s yours and no one elses.

    Let’s build our own beliefs.

    General Uninstaller for Intune

    General Uninstaller for Intune

    This past month I was given a task to Uninstall a few applications in Intune. However, the app’s uninstall feature did not work according to plan. However, a bunch of these worked with the cim methods of uninstall. Which I thought was funny. After writing a bunch of the same code over and over again, I decided to write a General Uninstaller for Intune. This also requires a custom Detection Script.

    The General Uninstaller Script

    param (
        [string[]]$ProductNames
    )
    $Products = Get-CimInstance -ClassName win32_Product
    foreach ($Product in $ProductNames) {
        if ($null -eq ($Products | where-object {$_.name -like "$Product"})) {
            write-host "Success"
            exit 1212
        } else {
            #Grabs the install Location
            $InstallLocation = ($Products | where-object {$_.name -like "Product"}).InstallLocation
    
            #Uninstalls the product in question
            $Products | where-object {$_.name -like "Product"} | Invoke-CimMethod -MethodName uninstall
            
            if ($Null -ne $InstallLocation) {
                foreach ($Location in $InstallLocation) {
                    if (Test-Path $Location) {
                        Remove-Item -Path $Location -Force -Recurse
                    }
                }
            }
            exit 1212
        }
    }
    

    Here we have a general uninstaller for Intune. This script allows us to feed the product name as is or we can add wild cards to the name. We start off the script by grabbing the product names from the user. This will be done during the intune setup. When it deploys, the first thing this script does is grab all the applications inside the win32_product. If the application didn’t register in this windows system, then this script is going to be pointless for you.

    Once we have the products, we go through each Product Name. We first check to see if the product is on the system. If it isn’t, we output success and exit with a unique exit code. This will be used later. However, if the product is on the machine, we grab the install location. Then we pipe the product into the uninstall method in the cim method command. Finally, we see if the install location exists inside the installed object. Some applications give us this information some don’t. Some give us multiple locations while others don’t.

    To work around this, we check if install location property is null. If it isn’t null, then we move on and start a loop. The loop is only because some install locations have more than one location. Then we test if the file path still exists. Sometimes, the applications uninstaller will remove the folder, sometimes, it doesn’t and that’s why we test. If the file location is there still, we remove it with a good old force and recurse. Finally, we exit with the unique exit code.

    The General Uninstall Detection Script

    $ProductNames = "ProductName","Product2Name"
    $Products = Get-CimInstance -ClassName win32_Product
    foreach ($Product in $ProductNames) {
        if ($null -ne ($Products | where-object {$_.name -like "$Product"})) {    
            exit 1
        } 
    }
    write-host "Success"
    exit 0
    

    With any custom script installs or uninstalls, a custom detection script is necessary. The first step is to grab the product names. Just like before, it’s a list of strings. So they can do more than one. Then we grab all the products with our cim instance and win32_product. Then we loop through each product name and see if the product exists still. If it does, we exit with a 1. This basically says, I failed! Intune needs a string and an exit code of 0 to be successful. The exit of 1 without the string ends the script and without that string, intune assumes failure. However, if we go through them all, and none trigger the exit, then we are safe to exit with a 0 and the beautiful word success.

    Building it out in Intune.

    Building the IntuneWin File

    The first thing you will need to do is save your script into a folder and then download the WinIntuneApp, aka, Win32 Prep Tool, to package up the powershell script. Unpackage this tool and start up your command prompt. The application will guide you through the process of setting up a intunewin app.

    General Uninstaller for Intune
    1. Please specify the source folder: This is the folder that will have your script inside of it. If you wanted to create something more complex, this part would change your way of deployment. Future blog post coming.
    2. Please Specify the setup file: This is going to be the powershell name. General-Uninstall.ps1
    3. please specify the output folder: This is the folder that the intunewin file will be dropped.
    4. Do you want to specify catalog folder (Y/N)? This one is for more advanced packages. We can say no to this option for this setup.

    Setting Up Intune for Your Uninstaller

    Now we have the IntuneWin file. It’s time to setup the intune Deployment. This is where you will be able to add things like the productname to our General Uninstaller for Intune.

    • Navigate to Endpoint Manager
    • Click Apps
    • Click Windows
    • Click Add
    • Click the Select App Package File.
    • Add the General-Uninstall.IntuneWin file.
    • Click ok
    • Change the Name
    • Click the edit Description and add a detailed description for other users. Make sure to provide instructions on what to do with the detection script.
    • The publisher can be your company or in my case self.
    • The gategory is going to be computer management as it is a general uninstaller.
    • Feel free to add any additional information. Link this blog post if you wish for the information URL.
    • Click Next when finished.

    The next screen is programing.

    • Install command:
    PowerShell.exe -ExecutionPolicy Bypass -File .\General-Uninstall.ps1 -ProductName "*Product Name*"
    
    • The Uninstall command can be as simple as a removal file.
    • Device Restart Behavior: Determine behavior based on return codes
    • Return Codes: Remember that unique exit code we had in the script. This is where you would place that code. I have it as 1212 is a success.

    The next screen the requirement screen. We can do a lot with this screen, but we don’t need to here.

    • Operating System Architecture:
      • 32
      • 64
    • Minimum Operating System: Windows 10 1607.

    Now we need to setup the custom detection.

    • Select User A custom Detection Script
    • Validate your product names to be uninstalled.
    • Upload and click next.
    • Accept the defaults for Dependencies and Supersedences.

    The final screen is where you are able to assign the script to people. There are three sections. Required, aviable for enrolled devices and uninstall. This is where you will select who is going to get what.

    Testing, Monitoring, and deployment

    The assignment area is where you assign the script to who you want. This is very important. Here is where you would want to test the users. Have a test group and apply it first. H

    • Deploy the uninstall app to the test device group.
    • Monitor the Intune deployment status for the app to ensure successful deployment to devices/users.
    • Test if the application is still on a target computer. This can be done with control pannel, powershell, and more options.
    • Redefine and correct any issues and restart the testing.
    • Deploy

    What can we learn as a person today?

    When was the last time you threw a rock? How about a rock in a lakes? The last time you did, did you notice the ripples? Just like a deployment like this can cause ripples in your company, removing things from your life can cause just as many ripples in yourself. Make sure you are ready to let go of that thing you are holding onto. It’s always a good idea to test it out, or have a support group to help you. Those ripples can do some damage. So be ready to Uninstall parts of your life before you do it.

    Additional Reading

    Get Intune Devices with PowerShell

    Get Intune Devices with PowerShell

    Recently I was working with a company that gave me a really locked down account. I wasn’t use to this as I have always had some level of read only access in each system. I was unable to create a graph API application either. So, I was limited to just my account. This was a great time to use the newer command lines for graph Api as when you connect to Graph API using the PowerShell module, you inherit the access your account has. So today we will Get Intune Devices with PowerShell and Graph API.

    The Script

    Function Get-IntuneComputer {
        [cmdletbinding()]
        param (
            [string[]]$Username,
            [switch]$Disconnect
        )
        begin {
    
            #Connects to Graph API
    
            #Installs the Module
            if ($null -eq (Get-Module Microsoft.Graph.Intune)) {Install-module Microsoft.Graph.Intune}
    
            #Imports module
            Import-Module Microsoft.Graph.Intune
    
            #Tests current Connection with a known computer
            $test = Get-IntuneManagedDevice -Filter "deviceName eq 'AComputer'"
    
            #If the test is empty, then we connect
            if ($null -eq $test) {Connect-MSGraph}
        }
        process {
    
            #Checks to see if the username flag was used
            if ($PSBoundParameters.ContainsKey('Username')) {
                #if it was used, then we go through each username get information
                $ReturnInfo = foreach ($User in $Username) {
                    Get-IntuneManagedDevice -Filter "userPrincipalName eq '$User'" | select-object deviceName,lastSyncDateTime,manufacturer,model,isEncrypted,complianceState
                }
            } else {
                
                #Grabs all of the devices and simple common information. 
                $ReturnInfo = Get-IntuneManagedDevice | Get-MSGraphAllPages | select-object deviceName,lastSyncDateTime,manufacturer,model,isEncrypted,complianceState,userDisplayName,userPrincipalName
            }
        }    
        end {
    
            #Returns the information
            $ReturnInfo
    
            #Disconnects if we want it. 
            if ($Disconnect) {Disconnect-MgGraph}
        }
    }
    

    The Breakdown

    Parameters

    We enter the script with the common parameters. Command let binding flag. This gives us additional parameters like verbose. Next, we have a list of strings called Username. We are using a list of strings to allow us to have multiple inputs. Doing this, we should be able to use a list of usernames and get their Intune Device information. Note that this is a multiple input parameter, thus, you will need to deal with it with a loop later. Next is the Disconnect switch. It’s either true or not. By default, this script will keep connected to Intune.

    Connecting to Intune

    Next we will connect to the Intune system. First, we need to check and install the module. We check the install by using the get-module command. We are looking for the Microsoft.Graph.Intune module. If it doesn’t exist, we want to install it.

    if ($null -eq (Get-Module Microsoft.Graph.Intune)) {Install-module Microsoft.Graph.Intune}
    

    If the module does exist, we will simply skip the install and move to the import. We will be using the importing the same module

    Import-Module Microsoft.Graph.Intune
    

    Afterwards, We want to test the connection to Microsoft Intune. The best way to do this is to test a command. You can do it however you want. I am testing against a device that is in Intune.

    $test = Get-IntuneManagedDevice -Filter "deviceName eq 'AComputer'"
    

    We will be using this command later. Notice the filter. We are filter the deviceName here. Replace the ‘AComputer’ with whatever you want. If you want to use another command, feel free. This was the fastest command that tested. The above command will produce a null response if you are not connect. Thus, we can test, $test with an if statement. If it comes back with information, we are good, but if it is null, we tell it to connect.

    if ($null -eq $test) {Connect-MSGraph}
    

    Get Intune Devices with PowerShell

    Now it’s time to Get Intune Devices with PowerShell. The first thing we check to see is if we used a username parameter. We didn’t make this parameter mandatory to give the script flexibility. Now, we need to code for said flexibility. If the command contained the Username flag, we want to honor that usage. We do this with the PowerShell Bound Parameters. The PowerShell Bound Parameters is the that come after the command. We are looking to see if it contains a key of username. If it does, we want to grab the needed information with the username. While if it doesn’t, we grab everything.

    if ($PSBoundParameters.ContainsKey('Username')) {
        #Grab based on username
    } else {
        #get every computer
    }
    

    As we spoke about the list of string parameter needing a loop, this is where we are going to do that. We first create a foreach loop of users for the username. Here, the we will dump the gathered information into a Return variable of $ReturnInfo. Inside our loop, we gather the requried information. The Get-IntuneManagedDevice command filter will need to use the userPrincipalName. These filters are string filters and not object filters. Thus, the term like will cause issues. This is why we are using the equal term.

    Now, if we are not searching the Username, we want to grab all the devices on the network. This way if you run the command without any flags, you will get information. Here, we use the Get-IntuneManagedDevice followed by the Get-MSGraphAllPages to capture all the pages in question.

    if ($PSBoundParameters.ContainsKey('Username')) {
                $ReturnInfo = foreach ($User in $Username) {
                    Get-IntuneManagedDevice -Filter "userPrincipalName eq '$User'"
                }
            } else {
                $ReturnInfo = Get-IntuneManagedDevice | Get-MSGraphAllPages 
            }
    

    Ending the Script

    Now it’s time to end the script. We want to return the information gathered. I want to know some basic information. The commands presented produces a large amount of data. In this case we will be selecting the following:

    • DeviceName
    • LastSyncDateTime
    • Manufacturer
    • Model
    • isEncrypted
    • ComplianceState
    • UserDisplayName
    • UserPrincipalName
    $ReturnInfo | select-object deviceName,lastSyncDateTime,manufacturer,model,isEncrypted,complianceState,userDisplayName,userPrincipalName
    

    Finally, we test to see if we wanted to disconnect. A simple if statement does this. If we choose to disconnect we run the Disconnect-MgGraph command.

    if ($Disconnect) {Disconnect-MgGraph}
    

    What can we learn as a person

    In PowerShell, we can stream line the output that we get. Often times commands like these produce a lot of useless but useful information. It’s not useful at the moment. This is like our work enviroment. I use to be a big advacate of duel, and not more screens. I would often have 5 things going on at once. My desk use to have everything I needed to quickly grab and solve a personal problem. For example, my chapstick sat on my computer stand. My water bottle beside the monitor. Papers, sticky notes, and more all scattered accross my desk. I wondered why I couldn’t focus. Our brains are like batteries. How much focus is the charge. Our brains take in everything. Your brain notices the speck of dirt on the computer monitor and the sticky note, without your password on it, hanging from your monitor. This takes your charge.

    Having two monitors is great and I still use two. However, I have a focused monitor and a second monitor for when I need to connect to something else. At some point I will get a larger wider monitor and drop the second one all together. Having less allows your brain to grab more attention on one or two tasks. Someone like myself, I have more than one task going at any moment. That’s ok with my brain. Let’s use our Select-object command in real life and remove the distractions from our desks.

    Additional Readings