Note: For this question, when I refer to \"Windows drivers\" I mean .inf and associated files which can otherwise be installed by right-clicking the .inf and clicking \"Inst
There is a PowerShell module named DeviceManagement, installable from the PowerShell Gallery via Install-Module
, which contains the Install-DeviceDriver
cmdlet. Example:
Install-Module -Name DeviceManagement -Force
Install-DeviceDriver -InfFilePath C:\Drivers\LAN\acmelan.inf
Get-Device | Where-Object Name -like 'ACME Network Adapter*' | Select-Object Name,DriverProvider,DriverVersion,DriverDescription,HasProblem
Not only are there not PowerShell cmdlets for this, it seems there isn't even managed code to do it within the .Net framework (what follows is basically a translation of that answer into PowerShell).
Luckily, the .Net framework can call windows APIs through platform invoke (p/invoke), and PowerShell can do so too.
The linked answer shows how to do it in C#. To do it powershell we'll use the same signature that was generated in that answer, and use it with the Add-Type cmdlet (see example 5) to make it available to your script.
$signature = @"
[DllImport("Setupapi.dll", EntryPoint="InstallHinfSection", CallingConvention=CallingConvention.StdCall)]
public static extern void InstallHinfSection(
[In] IntPtr hwnd,
[In] IntPtr ModuleHandle,
[In, MarshalAs(UnmanagedType.LPWStr)] string CmdLineBuffer,
int nCmdShow);
"@
$Win32Functions = Add-Type -MemberDefinition $signature -UsingNamespace System.Runtime.InteropServices -Name Win32SInstallHinfSection -Namespace Win32Functions -PassThru
$Win32Functions::InstallHinfSection([IntPtr]::Zero, [IntPtr]::Zero, "<section> <mode> <path>", 0)
See the MSDN documentation for InstallHinfSection for details on the parameters (particularly the string format).
I have to add you can call the pnputil.exe command:
pnputil /add-driver "path\to\driver\*inf" /install