如何在 Configuration Manager 中建立 Windows 驅動程式的驅動程式套件
您可以在 Configuration Manager 中建立作業系統部署驅動程式的套件,方法是建立SMS_DriverPackage Server WMI Class物件。 若要將驅動程式新增至套件,您可以 在類別SMS_DriverPackage中呼叫 AddDriverContent 方法。
驅動程式套件可用來儲存與驅動程式相關聯的內容。 建立驅動程式套件時,來源位置一開始應該是 SMS 提供者具有讀取和寫入存取權的空白共用。 使用 AddDriverContent
將驅動程式新增至驅動程式套件時,SMS 提供者會將內容從驅動程式來源位置複製到驅動程式套件共用中的子目錄。
您必須將與驅動程式相關聯的內容新增至驅動程式套件,並將它指派給發佈點,用戶端才能使用它。 您可以從屬性符合驅動程式識別碼 的 SMS_CIToContent Server WMI Class 物件 CI_ID
取得驅動程式內容。
注意事項
多個驅動程式可以共用相同的內容。 這通常會在相同目錄中有多個 .inf 檔案時發生。
AddDriverContent
可用來同時將多個驅動程式新增至套件。 若要這樣做,請新增多個內容識別碼。
bRefreshDPs
如果將進行另一個呼叫,參數應該設定為 false
。 這可確保套件只會在發佈點上更新一次。
當您呼叫 AddDriverContent
時,您可以指定一組套件來源位置。 這通常是 SMS_Driver Server WMI Class 物件 ContentSourcePath
屬性,但如果提供者沒有原始來源位置的存取權,則可以覆寫它。
建立驅動程式套件並新增驅動程式內容
設定與 SMS 提供者的連線。 如需詳細資訊,請 參閱 SMS 提供者基本概念。
建立 SMS_DriverPackage 物件。
PkgSourceFlag
將 物件的SMS_DriverPackage
屬性設定為2
(儲存體直接存取) 。SMS_DriverPackage
認可 物件。SMS_DriverPackage
取得 物件。在 參數的 AddDriverContent 方法
ContentIDs
中,將您想要新增至套件的驅動程式清單。將驅動程式內容來源路徑清單放在 方法的
AddDriverContent
ContentSourcePath
參數中。AddDriverContent
呼叫 方法。將驅動程式套件指派給發佈點。 如需詳細資訊,請參閱 如何將封裝指派給發佈點。
範例
下列範例方法會為提供的驅動程式識別碼建立套件,以SMS_Driver Server WMI Class物件的 屬性工作表示 CI_ID
。 方法也會採用新的套件名稱、描述和套件來源路徑作為參數。
注意事項
參數 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;
}
}
範例方法具有下列參數:
參數 | Type | 描述 |
---|---|---|
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.Collections.Generic
System.Text
System.IO
Microsoft。ConfigurationManagement.ManagementProvider
Microsoft。ConfigurationManagement.ManagementProvider.WqlQueryEngine
組件
microsoft.configurationmanagement.managementprovider
adminui.wqlqueryengine
健全的程式設計
如需錯誤處理的詳細資訊,請參閱關於Configuration Manager錯誤。
.NET Framework 安全性
如需保護Configuration Manager應用程式的詳細資訊,請參閱Configuration Manager角色型系統管理。
另請參閱
SMS_Driver伺服器 WMI 類別
類別SMS_DriverPackage中的 AddDriverContent 方法