Поделиться через


Создание пакета драйверов для драйвера Windows в Configuration Manager

Пакет для драйвера развертывания операционной системы можно создать в Configuration Manager путем создания объекта класса WMI сервера SMS_DriverPackage. Чтобы добавить драйвер в пакет, вызовите метод AddDriverContent в классе SMS_DriverPackage.

Пакеты драйверов используются для хранения содержимого, связанного с драйверами. При создании пакета драйвера исходное расположение изначально должно быть пустой общей папкой, к которому поставщик SMS имеет доступ на чтение и запись. Когда драйвер добавляется в пакет драйвера с помощью AddDriverContent, поставщик SMS копирует содержимое из исходного расположения драйвера в подкаталог в общей папке пакета драйверов.

Необходимо добавить содержимое, связанное с драйвером, в пакет драйвера и назначить его точке распространения, прежде чем клиент сможет использовать его. Содержимое драйвера получается из объекта класса WMI сервера SMS_CIToContent, где CI_ID свойство соответствует идентификатору драйвера.

Примечание.

Несколько драйверов могут совместно использовать одно и то же содержимое. Обычно это происходит при наличии нескольких INF-файлов в одном каталоге.

AddDriverContent можно использовать для одновременного добавления нескольких драйверов в пакет. Для этого добавьте несколько идентификаторов содержимого. Если bRefreshDPs будет выполнен другой вызов, параметру должно быть присвоено false значение . Это гарантирует, что пакет обновляется в точке распространения только один раз.

При вызове AddDriverContentукажите набор исходных расположений пакета. Обычно это свойство объекта ContentSourcePathкласса WMI сервера SMS_Driver, но его можно переопределить, если у поставщика нет доступа к исходному исходному расположению.

Создание пакета драйверов и добавление содержимого драйвера

  1. Настройте подключение к поставщику SMS. Дополнительные сведения см. в статье Основы поставщика SMS.

  2. Создайте объект SMS_DriverPackage .

  3. Задайте для PkgSourceFlag свойства SMS_DriverPackage объекта значение 2 (Storage Direct).

  4. Зафиксируйте SMS_DriverPackage объект .

  5. SMS_DriverPackage Получите объект .

  6. Поместите список драйверов, которые нужно добавить в пакет, в метод ContentIDsAddDriverContent в параметре .

  7. Поместите список путей к источнику содержимого драйвера в метод ContentSourcePath в AddDriverContent параметре .

  8. AddDriverContent Вызовите метод .

  9. Вызовите метод RefreshPkgSource в классе SMS_DriverPackage , чтобы завершить операцию.

  10. Назначьте пакет драйвера точке распространения. Дополнительные сведения см. в статье Назначение пакета точке распространения.

Пример

В следующем примере метода создается пакет для предоставленного идентификатора драйвера, представленного свойством CI_IDобъекта класса WMI SMS_Driver Server . Метод также принимает новое имя пакета, описание и путь к источнику пакета в качестве параметров.

Примечание.

Параметр packageSourcePath должен быть указан в виде сетевого пути универсального соглашения об именовании (UNC), например \\localhost\Drivers\ATIVideo\.

Сведения о вызове примера кода см. в разделе Вызов фрагментов кода Configuration Manager.

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;
    }
}

Метод примера имеет следующие параметры:

Параметр Тип Описание
connection -Управляемых: WqlConnectionManager
— VBScript: SWbemServices
Допустимое подключение к поставщику SMS.
driverId -Управляемых: Integer
— VBScript: Integer
Идентификатор драйвера (SMS_Driver.CI_ID).
newPackageName -Управляемых: String
— VBScript: String
Имя пакета.
newPackageDescription -Управляемых: String
— VBScript: String
Описание нового пакета.
newPackageSourcePath -Управляемых: String
— VBScript: String
Допустимый сетевой путь UNC к драйверу.

Компиляция программы

Для этого примера на C# требуется следующее:

Пространства имен

System;

System.Collections.Generic;

System.Text

System.IO

Microsoft.ConfigurationManagement.ManagementProvider

Microsoft.ConfigurationManagement.ManagementProvider.WqlQueryEngine

Assembly

microsoft.configurationmanagement.managementprovider

adminui.wqlqueryengine

Надежное программирование

Дополнительные сведения об обработке ошибок см. в разделе Сведения об ошибках Configuration Manager.

Безопасность .NET Framework

Дополнительные сведения о защите приложений Configuration Manager см. в статье Configuration Manager администрирование на основе ролей.

См. также

Метод AddDriverContentкласса WMI сервера SMS_Driver в классе SMS_DriverPackage