如何在 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
属性,但如果提供程序无权访问原始源位置,则可以重写它。
创建驱动程序包并添加驱动程序内容
设置与 SMS 提供程序的连接。 有关详细信息,请参阅 SMS 提供程序基础知识。
创建 SMS_DriverPackage 对象。
将
PkgSourceFlag
对象的 属性SMS_DriverPackage
设置为2
(存储直通) 。SMS_DriverPackage
提交 对象。获取 对象
SMS_DriverPackage
。将要添加到包的驱动程序列表放在 参数中的 AddDriverContent 方法
ContentIDs
中。将驱动程序内容源路径列表放在 参数中的
AddDriverContent
方法ContentSourcePath
中。AddDriverContent
调用 方法。调用 类SMS_DriverPackage中的 RefreshPkgSource 方法 以完成操作。
将驱动程序包分配到分发点。 有关详细信息,请参阅 如何将包分配给分发点。
示例
以下示例方法为提供的驱动程序标识符创建一个包,由 CI_ID
SMS_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 方法