如何在 Configuration Manager 中创建 Windows 驱动程序的驱动程序包

在 Configuration Manager 中,通过创建SMS_DriverPackage服务器 WMI 类对象,为操作系统部署驱动程序创建包。 若要将驱动程序添加到包,请在 类SMS_DriverPackage中调用 AddDriverContent 方法

驱动程序包用于存储与驱动程序关联的内容。 创建驱动程序包时,源位置最初应为 SMS 提供程序具有读取和写入访问权限的空共享。 使用 AddDriverContent将驱动程序添加到驱动程序包时,SMS 提供程序会将内容从驱动程序源位置复制到驱动程序包共享中的子目录。

有必要将与驱动程序关联的内容添加到驱动程序包,并将其分配给分发点,然后客户端才能使用它。 从 SMS_CIToContent 服务器 WMI 类 对象获取驱动程序内容,其中 属性 CI_ID 与驱动程序标识符匹配。

注意

多个驱动程序可以共享同一内容。 当同一目录中有多个 .inf 文件时,通常会发生这种情况。

AddDriverContent 可用于同时向包添加多个驱动程序。 为此,请添加多个内容 ID。 bRefreshDPs如果要进行另一个调用,则参数应设置为 false 。 这可确保包仅在分发点上更新一次。

调用 AddDriverContent时,指定一组包源位置。 通常,这是 SMS_Driver服务器 WMI 类 对象 ContentSourcePath 属性,但如果提供程序无权访问原始源位置,则可以重写它。

创建驱动程序包并添加驱动程序内容

  1. 设置与 SMS 提供程序的连接。 有关详细信息,请参阅 SMS 提供程序基础知识

  2. 创建 SMS_DriverPackage 对象。

  3. PkgSourceFlag 对象的 属性 SMS_DriverPackage 设置为 2 (存储直通) 。

  4. SMS_DriverPackage提交 对象。

  5. 获取 对象 SMS_DriverPackage

  6. 将要添加到包的驱动程序列表放在 参数中的 AddDriverContent 方法 ContentIDs 中。

  7. 将驱动程序内容源路径列表放在 参数中的 AddDriverContent 方法 ContentSourcePath 中。

  8. AddDriverContent调用 方法。

  9. 调用 类SMS_DriverPackage中的 RefreshPkgSource 方法 以完成操作。

  10. 将驱动程序包分配到分发点。 有关详细信息,请参阅 如何将包分配给分发点

示例

以下示例方法为提供的驱动程序标识符创建一个包,由 CI_IDSMS_Driver Server WMI 类 对象的 属性表示。 方法还采用新的包名称、说明和包源路径作为参数。

注意

参数 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基于角色的管理

另请参阅

SMS_Driver服务器 WMI 类
类SMS_DriverPackage中的 AddDriverContent 方法