Erstellen eines Treiberpakets für einen Windows-Treiber in Configuration Manager
Sie erstellen ein Paket für einen Betriebssystembereitstellungstreiber in Configuration Manager, indem Sie ein SMS_DriverPackage Server WMI Class-Objekt erstellen. Um dem Paket einen Treiber hinzuzufügen, rufen Sie die AddDriverContent-Methode in Class SMS_DriverPackage auf.
Treiberpakete werden verwendet, um den Inhalt zu speichern, der Treibern zugeordnet ist. Beim Erstellen eines Treiberpakets sollte der Quellspeicherort zunächst eine leere Freigabe sein, auf die der SMS-Anbieter Lese- und Schreibzugriff hat. Wenn ein Treiber mit einem Treiberpaket hinzugefügt wird, AddDriverContent
kopiert der SMS-Anbieter den Inhalt aus dem Quellspeicherort des Treibers in ein Unterverzeichnis in der Treiberpaketfreigabe.
Es ist erforderlich, den Inhalt, der einem Treiber zugeordnet ist, einem Treiberpaket hinzuzufügen und einem Verteilungspunkt zuzuweisen, bevor der Client ihn verwenden kann. Sie rufen den Treiberinhalt aus dem SMS_CIToContent Server WMI Class-Objekt ab, bei dem die CI_ID
Eigenschaft mit dem Treiberbezeichner übereinstimmt.
Hinweis
Es ist möglich, dass mehrere Treiber denselben Inhalt gemeinsam nutzen. Dies geschieht in der Regel, wenn mehrere INF-Dateien im selben Verzeichnis vorhanden sind.
AddDriverContent
kann verwendet werden, um einem Paket mehrere Treiber gleichzeitig hinzuzufügen. Fügen Sie dazu mehrere Inhalts-IDs hinzu. Der bRefreshDPs
Parameter sollte auf false
festgelegt werden, wenn ein weiterer Aufruf erfolgt. Dadurch wird sichergestellt, dass das Paket nur einmal auf dem Verteilungspunkt aktualisiert wird.
Wenn Sie aufrufen AddDriverContent
, geben Sie eine Reihe von Paketquellspeicherorten an. In der Regel ist dies die objekteigenschaft SMS_Driver Server WMI ClassContentSourcePath
, sie kann jedoch überschrieben werden, wenn der Anbieter keinen Zugriff auf den ursprünglichen Quellspeicherort hat.
So erstellen Sie ein Treiberpaket und fügen Treiberinhalte hinzu
Richten Sie eine Verbindung mit dem SMS-Anbieter ein. Weitere Informationen finden Sie unter Grundlagen des SMS-Anbieters.
Erstellen Sie ein SMS_DriverPackage-Objekt .
Legen Sie die
PkgSourceFlag
-Eigenschaft desSMS_DriverPackage
-Objekts auf2
(Storage Direct) fest.Committen Sie das
SMS_DriverPackage
Objekt.Rufen Sie das -Objekt ab
SMS_DriverPackage
.Fügen Sie die Liste der Treiber, die Sie dem Paket hinzufügen möchten, in der AddDriverContent-Methode
ContentIDs
im Parameter ein.Fügen Sie die Liste der Quellpfade des Treiberinhalts in die
AddDriverContent
-MethodeContentSourcePath
im -Parameter ein.Rufen Sie die -Methode auf
AddDriverContent
.Rufen Sie die RefreshPkgSource-Methode in Class SMS_DriverPackage auf, um den Vorgang abzuschließen.
Weisen Sie das Treiberpaket einem Verteilungspunkt zu. Weitere Informationen finden Sie unter Zuweisen eines Pakets zu einem Verteilungspunkt.
Beispiel
Die folgende Beispielmethode erstellt ein Paket für einen angegebenen Treiberbezeichner, dargestellt durch die CI_ID
-Eigenschaft des SMS_Driver Server WMI Class-Objekts . Die -Methode verwendet auch einen neuen Paketnamen, eine neue Beschreibung und einen neuen Paketquellpfad als Parameter.
Hinweis
Der packageSourcePath
Parameter muss als UNC-Netzwerkpfad (Universal Naming Convention) angegeben werden, z. B. \\localhost\Drivers\ATIVideo\.
Informationen zum Aufrufen des Beispielcodes finden Sie unter Aufrufen von Configuration Manager Codeausschnitten.
Sub CreateDriverPackage(connection, driverId, newPackageName, newPackageDescription, newPackageSourcePath)
Dim newPackage
Dim driver
Dim packageSources
Dim refreshDPs
Dim content
Dim path
Dim contentIds
Dim index
Dim item
' Create the new driver package object.
Set newPackage = connection.Get("SMS_DriverPackage").SpawnInstance_
' Populate the new package properties.
newPackage.Name = newPackageName
newPackage.Description = newPackageDescription
newPackage.PkgSourceFlag = 2 ' Storage direct
newPackage.PkgSourcePath = newPackageSourcePath
' Save the package.
path=newPackage.Put_
' Get the newly created package (Do this to call AddDriverContent).
Set newPackage=connection.Get(path)
' Get the driver
Set driver = connection.Get("SMS_Driver.CI_ID=" & driverId )
' Get the driver content.
Set content = connection.ExecQuery("Select * from SMS_CIToContent where CI_ID=" & driverId)
If content.Count = 0 Then
Wscript.Echo "No content found"
Exit Sub
End If
' Create Array to hold driver content identifiers.
contentIds = Array()
ReDim contentIds(content.Count-1)
index = 0
For Each item In content
contentIds(index) = item.ContentID
index = index+1
Next
' Create sources path Array.
packageSources = Array(driver.ContentSourcePath)
refreshDPs = False
' Add the driver content.
Call newPackage.AddDriverContent(contentIds,packageSources,refreshDPs)
wscript.echo "Done"
End Sub
public void CreateDriverPackage(
WqlConnectionManager connection,
int driverId,
string newPackageName,
string newPackageDescription,
string newPackageSourcePath)
{
try
{
if (Directory.Exists(newPackageSourcePath) == false)
{
throw new DirectoryNotFoundException("Package source path does not exist");
}
// Create new package object.
IResultObject newPackage = connection.CreateInstance("SMS_DriverPackage");
IResultObject driver = connection.GetInstance("SMS_Driver.CI_ID=" + driverId);
newPackage["Name"].StringValue = newPackageName;
newPackage["Description"].StringValue = newPackageDescription;
newPackage["PkgSourceFlag"].IntegerValue = (int)PackageSourceFlag.StorageDirect;
newPackage["PkgSourcePath"].StringValue = newPackageSourcePath;
// Save new package and new package properties.
newPackage.Put();
newPackage.Get();
// Get the content identifier.
List<int> contentIDs = new List<int>();
IResultObject content = connection.QueryProcessor.ExecuteQuery("Select * from SMS_CIToContent where CI_ID=" + driverId);
foreach (IResultObject ro in content)
{
contentIDs.Add(ro["ContentID"].IntegerValue);
}
// Get the package source.
List<string> packageSources = new List<string>();
packageSources.Add(driver["ContentSourcePath"].StringValue);
Dictionary<string, Object> inParams = new Dictionary<string, object>();
inParams.Add("bRefreshDPs", true);
inParams.Add("ContentIDs", contentIDs.ToArray());
inParams.Add("ContentSourcePath", packageSources.ToArray());
newPackage.ExecuteMethod("AddDriverContent", inParams);
}
catch (SmsException ex)
{
Console.WriteLine("Failed to create package. Error: " + ex.Message);
throw;
}
}
Die Beispielmethode verfügt über die folgenden Parameter:
Parameter | Typ | Beschreibung |
---|---|---|
connection |
-Verwalteten: WqlConnectionManager – VBScript: SWbemServices |
Eine gültige Verbindung mit dem SMS-Anbieter. |
driverId |
-Verwalteten: Integer -Vbscript: Integer |
Der Treiberbezeichner (SMS_Driver.CI_ID ). |
newPackageName |
-Verwalteten: String -Vbscript: String |
Der Name für das Paket. |
newPackageDescription |
-Verwalteten: String -Vbscript: String |
Eine Beschreibung für das neue Paket. |
newPackageSourcePath |
-Verwalteten: String -Vbscript: String |
Ein gültiger UNC-Netzwerkpfad zum Treiber. |
Kompilieren des Codes
Für dieses C#-Beispiel ist Folgendes erforderlich:
Namespaces
System
System.Collections.Generic
System.Text
System.io
Microsoft. ConfigurationManagement.ManagementProvider
Microsoft. ConfigurationManagement.ManagementProvider.WqlQueryEngine
Assembly
microsoft.configurationmanagement.managementprovider
adminui.wqlqueryengine
Robuste Programmierung
Weitere Informationen zur Fehlerbehandlung finden Sie unter Informationen zu Configuration Manager Fehlern.
.NET Framework-Sicherheit
Weitere Informationen zum Schützen Configuration Manager Anwendungen finden Sie unter Configuration Manager rollenbasierte Verwaltung.
Siehe auch
WMI-Klasse des SMS_Driver-Servers
AddDriverContent-Methode in class SMS_DriverPackage