共用方式為


如何在 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 屬性,但如果提供者沒有原始來源位置的存取權,則可以覆寫它。

建立驅動程式套件並新增驅動程式內容

  1. 設定與 SMS 提供者的連線。 如需詳細資訊,請 參閱 SMS 提供者基本概念

  2. 建立 SMS_DriverPackage 物件。

  3. PkgSourceFlag將 物件的 SMS_DriverPackage 屬性設定為 2 (儲存體直接存取) 。

  4. SMS_DriverPackage認可 物件。

  5. SMS_DriverPackage取得 物件。

  6. 在 參數的 AddDriverContent 方法 ContentIDs 中,將您想要新增至套件的驅動程式清單。

  7. 將驅動程式內容來源路徑清單放在 方法的 AddDriverContentContentSourcePath 參數中。

  8. AddDriverContent呼叫 方法。

  9. 類別SMS_DriverPackage中呼叫 RefreshPkgSource 方法 以完成作業。

  10. 將驅動程式套件指派給發佈點。 如需詳細資訊,請參閱 如何將封裝指派給發佈點

範例

下列範例方法會為提供的驅動程式識別碼建立套件,以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 方法