Sdílet prostřednictvím


Definování importu obsahu

Pokud chcete definovat import obsahu technologie nasazení aplikace, použijte instanci Microsoft.ConfigurationManagement.ApplicationManagement.ContentImporter třídy . Nová instance třídy definuje import obsahu používaný instalačním programem.

Třída ContentImporter poskytuje návrh na úrovni rozhraní, kde vlastní technologie mohou vytvořit instanci a naplnit DeploymentType objekty pro konkrétní technologii. Koncept této třídy spočívá v tom, že daný importér technologie je schopen přečíst konkrétní soubor obsahu a vytvořit odpovídající objekt DeploymentType (s instalačním programem) pomocí informací získaných z obsahu. Například technologie Instalační služby systému Windows čte *.msi soubory a je schopna naplnit vlastnosti Název a Popis objektu DeploymentType a vytvořit akce Zjistit, Nainstalovat a Odinstalovat pro instalační program.

V ukázkovém projektu protokolu RDP (Remote Desktop Protocol) je pro soubory protokolu RDP (Remote Desktop Protocol) vyžadován nový import obsahu. Podpora importu obsahu pro soubory RDP není integrovaná do Configuration Manager, takže se vyžaduje vlastní import obsahu.

Základní přehled definování vlastního importu

  1. Vytvořte vlastní instanci třídy ContentImporter.

  2. Přepište vlastnost FileTypes a vraťte typy a přípony souborů specifické pro danou technologii.

  3. Přepište metodu CreateDeploymentType a vytvořte vlastní typ nasazení importem požadovaných vlastností ze souboru obsahu.

  4. Přepište metodu UpdateDeploymentType a aktualizujte vlastní typ instalačního programu nastavením ze souboru obsahu.

  5. Pomocné funkce: Zahrnutí pro úplnost a čitelnost kódu jsou dvě pomocné funkce. ProcessFileLine je pomocná funkce volaná z metody UpdateDeploymentType ke zpracování každého řádku souboru obsahu a načtení hodnot do vlastního typu instalačního programu. ParseType je pomocná funkce volaná z pomocné funkce ProcessFileLine. Pomocná funkce ParseType analyzuje označení typu souboru .rdp a převede ho na typ .NET.

Definování vlastního importu obsahu

  1. Vytvořte instanci Microsoft.ConfigurationManagement.ApplicationManagement.ContentImporter třídy pomocí konstruktoru Microsoft.ConfigurationManagement.ApplicationManagement.ContentImporter .

    Následující příklad z ukázkového projektu RDP ukazuje, jak definovat import obsahu.

    //   Content importer for .rdp files used by the RDP installer.   
    public class RdpContentImporter : ContentImporter  
    
  2. Microsoft.ConfigurationManagement.ApplicationManagement.ContentImporter.FileTypes Přepište vlastnost a definujte typy souborů podporované importem obsahu.

    Následující příklad z ukázkového projektu RDP ukazuje, jak přepsat FileTypes vlastnost.

    // File types supported by the content importer.   
    public override IList<FileType> FileTypes  
    {  
        get  
        {  
             return Common.RdpFileTypes;   
        }  
    }  
    

    V ukázkovém projektu RDP je hodnota FileTypes definována ve třídě Common projektu.

    //   This defines the file extensions supported by this content importer.   
    internal static readonly FileType[] RdpFileTypes = new[] { new FileType { Name = "RDP", Description = "Remote Desktop Configuration profile", Extensions = new[] { "rdp" } } };  
    
  3. Přepište metodu Microsoft.ConfigurationManagement.ApplicationManagement.ContentImporter.CreateDeploymentType pro správu vytváření vlastního typu nasazení importem požadovaných vlastností ze souboru obsahu.

    Následující příklad z ukázkového projektu RDP ukazuje, jak přepsat Metodu CreateDeploymentType.

    // Creates a new deployment type from a content file.   
    public override DeploymentType CreateDeploymentType(string contentFile, object context)   
    {  
        Validator.CheckForNull(contentFile, "contentFile");  
        DeploymentType deploymentType = new DeploymentType(Common.TechnologyId) { Title = Path.GetFileNameWithoutExtension(contentFile) };  
        UpdateDeploymentType(deploymentType, contentFile);   
        return deploymentType;   
    }  
    

    V ukázkovém projektu RDP je parametr řetězce pro DeploymentType definován ve třídě Common místního projektu.

    // Internal ID of the technology.   
    public const string TechnologyId = "Rdp";  
    
  4. Přepište metodu Microsoft.ConfigurationManagement.ApplicationManagement.ContentImporter.UpdateDeploymentType pro aktualizaci typu nasazení nastavením ze souboru obsahu.

    Následující příklad z ukázkového projektu RDP ukazuje, jak přepsat Metodu UpdateDeploymentType.

    // Updates an existing deployment type installer with settings from content file.   
    public override void UpdateDeploymentType(DeploymentType dt, string contentFile, object context)   
    {  
        Validator.CheckForNull(dt, "dt");  
        Validator.CheckForNull(contentFile, "contentFile");  
                    RdpInstaller installer = dt.Installer as RdpInstaller;   
        if (null == installer)   
        {  
            throw new ArgumentOutOfRangeException("dt", dt.Installer, @"Installer type is not supported by this content importer.");   
        }  
        if (false == File.Exists(contentFile))   
        {  
            throw new FileNotFoundException("Content file was not found: " + contentFile, contentFile);   
        }  
        string[] fileText = File.ReadAllLines(contentFile);   
        fileText.ForEach(l => ProcessFileLine(l, installer));   
        installer.Filename = Path.GetFileName(contentFile);   
        installer.Contents.Clear();  
        installer.Contents.Add(new Content());  
        installer.Contents[0].Files.Add(new ContentFile());  
        installer.Contents[0].Location = Path.GetDirectoryName(contentFile);   
        installer.Contents[0].Files[0].Name = Path.GetFileName(contentFile);   
        return;   
    }  
    
  5. ProcessFileLine je pomocná funkce volaná z metody UpdateDeploymentType ke zpracování každého řádku souboru obsahu a načtení hodnot do vlastního typu instalačního programu.

    //   Processes a line in an .rdp file to set corresponding RdpInstaller properties.  
    private static void ProcessFileLine(string line, RdpInstaller installer)   
    {      
    if (string.IsNullOrEmpty(line))   
        {  
            Trace.TraceInformation("Skipping line, it is empty.");   
            return;   
        }  
        string[] elements = line.Split(':');   
        if (elements.Length < 2)   
        {  
            Trace.TraceError("Unexpected elements length: {0}. Skipping.", elements.Length);   
            return;   
        }  
        string elementName = elements[0];   
        Type elementType = ParseType(elements[1]);   
        string elementValueAsString = (elements.Length == 3) ? elements[2] : string.Empty;   
        object elementValue = (false == string.IsNullOrEmpty(elementValueAsString)) ? Convert.ChangeType(elementValueAsString, elementType) : null;   
        Trace.TraceInformation("Name: {0} Type: {1} Value: {2} ({3})", elementName, elementType, elementValue, elementValueAsString);   
        if (string.IsNullOrEmpty(elementValueAsString) || null == elementValue)   
        {  
            Trace.TraceWarning("Could not parse element value. Skipping.");   
            return;   
        }  
        switch (elementName.ToLowerInvariant())  
        {  
            case "username":  
                installer.Username = elementValueAsString;   
                break;   
            case "redirectprinters":  
                installer.RedirectPrinters = (1 == (int)elementValue);   
                break;   
            case "redirectsmartcards":  
                installer.RedirectSmartCards = (1 == (int)elementValue);   
                break;   
            case "alternate shell":  
                installer.RemoteApplication = elementValueAsString;   
                break;   
            case "keyboardhook":  
                installer.KeyboardMode = (RdpKeyboardMode)(int)elementValue;   
                break;   
            case "audiomode":  
                installer.AudioMode = (RdpAudioMode)(int)elementValue;   
                break;   
            case "desktopheight":  
                installer.DesktopHeight = (int)elementValue;   
                break;   
            case "desktopwidth":  
                installer.DesktopWidth = (int)elementValue;   
                break;   
            case "full address":  
                installer.FullAddress = elementValueAsString;   
                string[] tokens = elementValueAsString.Split(':');   
                ushort port = 0;   
                if (tokens.Length > 1)   
                {  
                    bool canParse = ushort.TryParse(tokens[1], out port);   
                    if (false == canParse)   
                    {  
                        Trace.TraceError("Improperly formatted port. Skipping.");   
                    }  
                    installer.RemoteServerPort = port;   
                }  
                installer.RemoteServerName = tokens[0];   
                break;   
            case "screen mode id":  
                int screenMode = (int)elementValue;   
                if (screenMode == 1 || screenMode == 2)   
                {  
                    installer.FullScreen = (1 == screenMode) ? false : true;   
                }  
                else  
                {  
                    Trace.TraceError("Invalid screen mode: {0}. Skipping.", screenMode);   
                }  
                break;   
            default:   
                Trace.TraceWarning("Unrecognized property: {0}. Skipping", elementName);   
                break;   
        }  
    }  
    

    ParseType je pomocná funkce volaná z pomocné funkce ProcessFileLine. Pomocná funkce ParseType analyzuje označení typu souboru .rdp a převede ho na typ .NET.

    //   Helper Function: Parses a .rdp file type designation and converts into a .NET Type.   
    private static Type ParseType(string type)   
    {      
    switch (type.ToLowerInvariant())  
        {  
            case "s":  
                return typeof(string);   
            case "i":  
                return typeof(int);   
            case "b":  
                return typeof(string);   
            default:   
                Trace.TraceInformation("Unrecognized type: {0}.", type);   
                return typeof(string);   
        }  
    }  
    

Obory názvů

Microsoft. ConfigurationManagement.ApplicationManagement

Microsoft. ConfigurationManagement.ApplicationManagement.Serialization

Sestavení

Microsoft.ConfigurationManagement.ApplicationManagement.dll

Viz taky

referenční informace k Configuration Manager