Friday, 18 April 2025

Managed software updates on Apple devices with Intune

We've been able to configure software update policies on iOS and macOS devices for a while, right. However this is new and different, released in March 2025 (Service release 2503). "Managed software updates" means something very specific. We can now configure devices to automatically update to the latest OS version using Apple Declarative device management.

Declarative device management (DDM) is an update to the existing protocol for device management that can be used in combination with the existing MDM protocol capabilities. It allows the device to asynchronously apply settings and report status back to the MDM solution without constant polling. This is ideal for performance and scalability.

To configure Managed software updates, navigate to Devices > Manage devices > Configuration > Create > New policy > choose iOS/iPadOS or macOS for platform > select Settings catalog for profile type.

Add the setting Declarative device management > Software Update Enforce Latest. 

You'll also see the "Software Update" and "Software Updates Settings" setting, more on them shortly.

We have three items to configure

  • Enforce Latest Software Update Version: If true, devices will upgrade to the latest OS version that is available for that device model. This uses the Software Update Enforcement configuration and will force devices to restart and install the update after the deadline passes.
  • Delay In Days: Specifies the number of days that should pass before a deadline is enforced. This delay is based on either the posting date of the new update when released by Apple, or when the policy is configured.
  • Install Time (optional): Specifies the local device time for when updates are enforced. This setting uses the 24-hour clock format where midnight is 00:00 and 11:59pm is 23:59. Ensure that you include the leading 0 on single digit hours. For example, 01:00, 02:00, 03:00.

The configuration in the screenshot will force an update of the device 1 day after Apple release an update, at no particular time. The device will always remain at the latest OS version. This is called an "automatic managed software updates policy".

If you select the Software Update setting in the settings picker, your options are different.

  • Details URL (optional): Enter a web page URL that has more information on the update. Typically, this URL is a web page hosted by your organization that users can select if they need organization-specific help with the update.
  • Target Build Version (optional): Enter the target build version to update the device to, like 20A242. The build version can include a supplemental version identifier, like 20A242a. If the build version you enter isn't consistent with the Target OS Version value you enter, then the Target OS Version value takes precedence.
  • Target Date Time: Select or manually enter the date and the time that specifies when to force the installation of the software update.
  • Target OS Version: Select or manually enter the target OS version to update the device to. This value is the OS version number, like 16.1. You can also include a supplemental version identifier, like 16.1.1.

This is called a "manual managed software updates policy" as you need to create a new one for every OS version you need to update to. You would use this policy if you are unsure about updating to the latest and greatest as soon as possible.

Remember Software Updates Setting in the Setting picker, what is that one about?.

This give us a single place to configure managed software updates. You may want to manage aspects of the software update process leading up to the enforcement of an update. Using this configuration, you can:

  • Require that an admin or standard user can perform updates on the device
  • Control how users can manually interact with software update settings like automatic download and install or the behavior of Rapid Security Responses
  • Hide updates from users for a specified time period
  • Suppress update notifications up to one hour before the enforcement deadline
  • Control whether users are allowed to update to the latest major update, latest minor update, or are offered both.

Precedence

Now that we have several places to configure updates for iOS and macOS devices, what happens when there is a conflict? Managed software updates (both automatic and manual) have precedence over other policies that configure software updates. If you configure managed software updates and also have other software update policies assigned, then it's possible the other update policies have no effect.

iOS/iPadOS precedence order:

  1. Managed software updates (Settings catalog > Declarative Device Management > Software Update)
  2. Update policies (Devices > Update policies for iOS/iPadOS)

macOS precedence order:

  1. Managed software updates (Settings catalog > Declarative Device Management > Software Update)
  2. Update policies (Devices > Update policies for macOS)
  3. Software updates (Settings catalog > System Updates > Software Update)

We have seen that you can create software update policies or managed software update policies for Apple devices in Intune. Both policy types can manage the install of software updates on devices. However, there are some differences between the two policy types. Microsoft have provided a table to help you decide which policy type to use.

I hope this helps you to understand the new "managed" policy type and how it differs from what we already had. Until next time.....

Saturday, 12 April 2025

On-premises printing with cloud native devices

In the past year my colleagues and I have helped many customers to prepare their environments for cloud native devices. 

What is a cloud native device? It's a device where all management is provided by the cloud. In the Microsoft world this means a device which is Entra joined and enrolled in Intune. The key here is the authentication. The device must authenticate with Entra. Entra hybrid devices authenticate with Active Directory so they do not qualify as cloud native devices.

Printing is usually one of the challenges organizations face. Often Group Policy Objects have traditionally been used to control access to printers. By default non-administrators are not allowed to install drivers on domain joined devices. This can be managed by allowing users to install driver packages for the classes below, all configured by GPO:

  • {4658ee7e-f050-11d1-b6bd-00c04fa372a7}
  • {4d36e979-e325-11ce-bfc1-08002be10318}
All the users need to do is browse to the print server and double click the printer to add the queue without any elevation.

GPOs are not applied to Entra devices so we need to find another way to deal with printers using Intune. I know, I know we should be using Universal Printing. However many customers have heavy investments in on-premises printing and we need to help them rather than tell them that they are wrong.

There is an equivalent Intune configuration policy where we can allow users to install drivers for the same classes above. However I don't want users to install drivers at all. I want to pre-install all the necessary print drivers to make the device as secure as possible. It's pretty straightforward and involves a couple of scripts. 

Disclaimer: I'm not a master scripter. The scripts don't contain any error checking. However they are functional and they work well. No complaints please 😏😏😏

I've picked an example printer that I worked with recently.


The Canon Image Runner Advanced C256i is a big old expensive printer and was one of the models used by a recent customer. The customer provided the print driver.


Tip: you do not need all the files that are downloaded in a bundle from the vendor website. In this case it contained 47.4MB of data.


You just need the drivers. Typically this is a folder containing .inf and .cab files. This one had 17MB of data. You'll notice a few extra files here. We'll come to them shortly.

First we need to check that these files will add the print driver that I need. Open the .inf file to see what is inside. It's called cnnv4_cb3_fgeneric.inf in this example but the name will be different in each case.


I can see that this .inf file is aware of two print drivers

  • Canon Generic LIPSLX V4
  • Canon Generic UFR II V4
Which one do I need? I had a look in the properties of the queue on the print server and could see that I needed "Canon Generic LIPSLX V4". Now I could get started.

The install.cmd file is a simple script that performs the following actions:
  1. Creates a local folder C:\PrinterDrivers\Canon
  2. Copies all the required files to this folder
  3. Adds the print driver using prndrvr.vbs
What is prndrvr.vbs? It's a Visual Basic script native to the operating system which adds, deletes and lists printer drivers. You can read about it here. 

The script uses the following parameters:
  • a: adds a printer
  • m: specifies (by name) the driver you want to install
  • i: specifies the complete path and file name for the driver you want to install
install.cmd script (you'll need to replace the vendor name, the driver name and the inf filename).

@echo off

mkdir C:\PrinterDrivers\Canon
xcopy *.* /h /c /k /e /r /y C:\PrinterDrivers\Canon

cscript "C:\Windows\System32\Printing_Admin_Scripts\en-US\prndrvr.vbs" -a -m "Canon Generic LIPSLX V4" -i "C:\PrinterDrivers\Canon\cnnv4_cb3_fgeneric.inf"

I'm going to deploy the solution as a Win32 app. Therefore I also need a detection method. I'm using a custom script for that. The script performs the following:
  1. Executes Get-PrinterDriver
  2. Looks for "Canon Generic LIPSLX V4"
  3. Returns an exit code, 0 = success
Detection_Script.ps1

$driverExists = Get-Printerdriver | Where-Object {$_.Name -like "Canon Generic LIPSLX V4"}

if($driverExists) {
  Write-Host "Success"
  Exit 0
} else {
  Exit 1
}

Next job is to create and deploy a Win32 app using Install.cmd as the installation and Detection_Script.ps1 as the custom detection.


This is the result. The correct print driver is pre-installed. You can see a few others there as well as the Canon.

What happens next? Well, now you can just browse to the print server and double click to add the print queue. The driver already exists so you will not be prompted for elevation.

Alternatively you could create an available Win32 app which could be self-installed via Company Portal. Replace with the name of your print server and queue

Add-Printer -ConnectionName \\printserver.domain.local\Canon_Colour

This will work as the installation script.

$printerExists = Get-CimInstance -Class Win32_Printer | Where-Object {$_.Name -like "\\printserver.domain.local\Canon_Colour}

if($printerExists) {
  Write-Host "Success"
  Exit 0
} else {
  Exit 1
}

This will work as the detection script.

Thanks to my colleague Rahul Jindal for reminding me about prndrvr

I hope this helps. Until next time.....