Utilisation de l'exécution de scripts PowerShell avec le fournisseur de pont WMI

Cet article explique comment utiliser des scripts d’applet de commande PowerShell pour configurer les paramètres de stratégie par utilisateur et par appareil, et comment appeler des méthodes via le fournisseur de pont WMI.

Configuration des paramètres de stratégie par appareil

Cette section fournit un exemple de script d’applet de commande PowerShell pour configurer les paramètres par appareil via le fournisseur de pont WMI. Si une classe prend en charge les paramètres d’appareil, il doit y avoir un qualificateur de niveau de classe défini pour InPartition(« local-system »).

Pour tous les paramètres d’appareil, le client WMI Bridge doit être exécuté sous l’utilisateur système local. Pour ce faire, téléchargez l’outil psexec à partir de https://technet.microsoft.com/sysinternals/bb897553.aspx et exécutez psexec.exe -i -s cmd.exe à partir d’une invite de commandes d’administration avec élévation de privilèges.

L’exemple de script de cette section utilise la classe MDM_Policy_Config01_WiFi02 :

[dynamic, provider("DMWmiBridgeProv"), InPartition("local-system")]
class MDM_Policy_Config01_WiFi02
{
  string InstanceID;
  string ParentID;
  sint32 AllowInternetSharing;
  sint32 AllowAutoConnectToWiFiSenseHotspots;
  sint32 WLANScanMode;
};

Le script suivant décrit comment créer, énumérer, interroger, modifier et supprimer des instances.

$namespaceName = "root\cimv2\mdm\dmmap"
$className = "MDM_Policy_Config01_WiFi02"

# Create a new instance for MDM_Policy_Config01_WiFi02
New-CimInstance -Namespace $namespaceName -ClassName $className -Property @{ParentID="./Vendor/MSFT/Policy/Config";InstanceID="WiFi";AllowInternetSharing=1;AllowAutoConnectToWiFiSenseHotspots=0;WLANScanMode=100}

# Enumerate all instances available for MDM_Policy_Config01_WiFi02
Get-CimInstance -Namespace $namespaceName -ClassName $className

# Query instances with matching properties
Get-CimInstance -Namespace $namespaceName -ClassName $className -Filter "ParentID='./Vendor/MSFT/Policy/Config' and InstanceID='WiFi'"

# Modify existing instance
$obj = Get-CimInstance -Namespace $namespaceName -ClassName $className -Filter "ParentID='./Vendor/MSFT/Policy/Config' and InstanceID='WiFi'"
$obj.WLANScanMode=500
Set-CimInstance -CimInstance $obj

# Delete existing instance
try
{
    $obj = Get-CimInstance -Namespace $namespaceName -ClassName $className -Filter "ParentID='./Vendor/MSFT/Policy/Config' and InstanceID='WiFi'"
    Remove-CimInstance -CimInstance $obj
}
catch [Exception]
{
    write-host $_ | out-string
}

Configuration des paramètres par utilisateur

Cette section fournit un exemple de script d’applet de commande PowerShell pour configurer les paramètres par utilisateur via le pont WMI. Si une classe prend en charge les paramètres utilisateur, il doit y avoir un qualificateur de niveau de classe défini pour InPartition(« local-user »).

L’exemple de script de cette section utilise la classe MDM_Policy_User_Config01_Authentication02 :

[dynamic, provider("DMWmiBridgeProv"), InPartition("local-user")]
class MDM_Policy_User_Config01_Authentication02
{
  string InstanceID;
  string ParentID;
  sint32 AllowEAPCertSSO;
};

Remarque

Si l’utilisateur actuellement connecté tente d’accéder ou de modifier les paramètres utilisateur pour lui-même, il est beaucoup plus facile d’utiliser le script de paramètres par appareil de la section précédente. Toutes les applets de commande PowerShell doivent être exécutées sous une invite de commandes d’administration avec élévation de privilèges.

Si vous accédez ou modifiez des paramètres pour un autre utilisateur, le script PowerShell est plus compliqué, car le pont WMI s’attend à ce que le SID utilisateur soit défini dans le contexte personnalisé MI, ce qui n’est pas pris en charge dans les applets de commande PowerShell natives.

Remarque

Toutes les commandes doivent être exécutées sous le système local.

La commande wmic useraccount get name, sid Windows peut être utilisée pour obtenir le SID utilisateur. L’exemple de script suivant suppose que le SID de l’utilisateur est S-1-5-21-4017247134-4237859428-3008104844-1001 .

$namespaceName = "root\cimv2\mdm\dmmap"
$className = "MDM_Policy_User_Config01_Authentication02"

# Configure CIM operation options with target user info
$options = New-Object Microsoft.Management.Infrastructure.Options.CimOperationOptions
$options.SetCustomOption("PolicyPlatformContext_PrincipalContext_Type", "PolicyPlatform_UserContext", $false)
$options.SetCustomOption("PolicyPlatformContext_PrincipalContext_Id", "S-1-5-21-4017247134-4237859428-3008104844-1001", $false)

# Construct session used for all operations
$session = New-CimSession

##########################################################################
# Create a new instance for MDM_Policy_User_Config01_Authentication02
##########################################################################
$newInstance = New-Object Microsoft.Management.Infrastructure.CimInstance $className, $namespaceName
$property = [Microsoft.Management.Infrastructure.CimProperty]::Create("ParentID", './Vendor/MSFT/Policy/Config', "string", "Key")
$newInstance.CimInstanceProperties.Add($property)
$property = [Microsoft.Management.Infrastructure.CimProperty]::Create("InstanceID", 'Authentication', "String", "Key")
$newInstance.CimInstanceProperties.Add($property)
$property = [Microsoft.Management.Infrastructure.CimProperty]::Create("AllowEAPCertSSO", 1, "Sint32", "Property")
$newInstance.CimInstanceProperties.Add($property)
try
{
    $session.CreateInstance($namespaceName, $newInstance, $options)
}
catch [Exception]
{
    write-host $_ | out-string
}

##########################################################################
# Enumerate all instances for MDM_Policy_User_Config01_Authentication02
##########################################################################
$session.EnumerateInstances($namespaceName, $className, $options)

##########################################################################
# Query instance for MDM_Policy_User_Config01_Authentication02
# with matching properties
##########################################################################
$getInstance = New-Object Microsoft.Management.Infrastructure.CimInstance $className, $namespaceName
$property = [Microsoft.Management.Infrastructure.CimProperty]::Create("ParentID", './Vendor/MSFT/Policy/Config', "string", "Key")
$getInstance.CimInstanceProperties.Add($property)
$property = [Microsoft.Management.Infrastructure.CimProperty]::Create("InstanceID", 'Authentication', "String", "Key")
$getInstance.CimInstanceProperties.Add($property)
try
{
    $session.GetInstance($namespaceName, $getInstance, $options)
}
catch [Exception]
{
    write-host $_ | out-string
}

##########################################################################
# Modify existing instance for MDM_Policy_User_Config01_Authentication02
##########################################################################
$getInstance = New-Object Microsoft.Management.Infrastructure.CimInstance $className, $namespaceName
$property = [Microsoft.Management.Infrastructure.CimProperty]::Create("ParentID", './Vendor/MSFT/Policy/Config', "string", "Key")
$getInstance.CimInstanceProperties.Add($property)
$property = [Microsoft.Management.Infrastructure.CimProperty]::Create("InstanceID", 'Authentication', "String", "Key")
$getInstance.CimInstanceProperties.Add($property)
try
{
    $updateInstance = $session.GetInstance($namespaceName, $getInstance, $options)[0]
    $updateInstance.AllowEAPCertSSO = 0
    $session.ModifyInstance($namespaceName, $updateInstance, $options)
}
catch [Exception]
{
    write-host $_ | out-string
}

##########################################################################
# Delete existing instance for MDM_Policy_User_Config01_Authentication02
##########################################################################
$getInstance = New-Object Microsoft.Management.Infrastructure.CimInstance $className, $namespaceName
$property = [Microsoft.Management.Infrastructure.CimProperty]::Create("ParentID", './Vendor/MSFT/Policy/Config', "string", "Key")
$getInstance.CimInstanceProperties.Add($property)
$property = [Microsoft.Management.Infrastructure.CimProperty]::Create("InstanceID", 'Authentication', "String", "Key")
$getInstance.CimInstanceProperties.Add($property)
try
{
    $deleteInstance = $session.GetInstance($namespaceName, $getInstance, $options)[0]
    $session.DeleteInstance($namespaceName, $deleteInstance, $options)
}
catch [Exception]
{
    write-host $_ | out-string
}

Appel de méthodes

Cette section fournit un exemple de script d’applet de commande PowerShell pour appeler une méthode d’objet WMI Bridge. Le script suivant doit être exécuté sous l’utilisateur système local. Pour ce faire, téléchargez l’outil psexec à partir de https://technet.microsoft.com/sysinternals/bb897553.aspx et exécutez psexec.exe -i -s cmd.exe à partir d’une invite de commandes d’administration avec élévation de privilèges.

L’exemple de script de cette section utilise la méthode UpgradeEditionWithProductKeyMethod de la classe MDM_WindowsLicensing .

$namespaceName = "root\cimv2\mdm\dmmap"
$className = "MDM_WindowsLicensing"
$methodName = "UpgradeEditionWithProductKeyMethod"
$fakeProductKey = "7f1a3659-3fa7-4c70-93ce-0d354e8e158e"

$session = New-CimSession

$params = New-Object Microsoft.Management.Infrastructure.CimMethodParametersCollection
$param = [Microsoft.Management.Infrastructure.CimMethodParameter]::Create("param", $fakeProductKey, "String", "In")
$params.Add($param)

try
{
    $instance = Get-CimInstance -Namespace $namespaceName -ClassName $className -Filter "ParentID='./Vendor/MSFT' and InstanceID='WindowsLicensing'"
    $session.InvokeMethod($namespaceName, $instance, $methodName, $params)
}
catch [Exception]
{
    write-host $_ | out-string
}

Fournisseur de pont WMI