Table of contents
TOC
De inhoudsopgave samenvouwen
De inhoudsopgave uitvouwen

PowerShell-cmdlets ontwikkelen voor Nano Server

Jaime Ondrusek|Laatst bijgewerkt: 3-11-2016
|
1 Inzender

Van toepassing op: Windows Server 2016

Overzicht

In Nano Server is standaard PowerShell Core opgenomen in alle Nano Server-installaties. PowerShell Core is een editie van PowerShell met een verminderde footprint die is gebaseerd op .NET Core en wordt uitgevoerd op edities van Windows met een verminderde footprint, zoals Nano Server en Windows IoT Core. PowerShell Core werkt op dezelfde manier als andere edities van PowerShell, zoals Windows PowerShell dat wordt uitgevoerd op Windows Server 2016. De verminderde footprint van Nano Server betekent echter niet dat alle PowerShell-functies van Windows Server 2016 beschikbaar zijn in PowerShell Core in Nano Server.

Als u bestaande PowerShell-cmdlets wilt uitvoeren in Nano Server of nieuwe cmdlets ontwikkelt voor hetzelfde doeleinde, vindt u in dit onderwerp tips en suggesties die dit voor u eenvoudiger maken.

PowerShell-edities

Vanaf versie 5.1 is PowerShell beschikbaar in verschillende edities die staan voor verschillende functies en platformcompatibiliteit.

  • Desktop-editie: deze editie is gebaseerd op .NET Framework en biedt compatibiliteit met scripts en modules die zijn gericht op versies van PowerShell die worden uitgevoerd op edities van Windows met een volledige footprint zoals Server Core en Windows Desktop.
  • Core-editie: deze editie is gebaseerd op .NET Framework en biedt compatibiliteit met scripts en modules die zijn gericht op versies van PowerShell die worden uitgevoerd op edities van Windows met een verminderde footprint zoals Nano Server en Windows IoT.

De actieve editie van PowerShell wordt weergegeven in de eigenschap PSEdition van $PSVersionTable.

$PSVersionTable  

Name                           Value  
----                           -----  
PSVersion                      5.1.14300.1000  
PSEdition                      Desktop  
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}  
CLRVersion                     4.0.30319.42000  
BuildVersion                   10.0.14300.1000  
WSManStackVersion              3.0  
PSRemotingProtocolVersion      2.3  
SerializationVersion           1.1.0.1  

Auteurs van modules kunnen hun modules zo opstellen dat deze compatibel zijn met een of meer PowerShell-edities door de sleutel voor het modulemanifestbestand CompatiblePSEditions te gebruiken. Deze sleutel wordt alleen ondersteund in PowerShell 5.1 of hoger.

New-ModuleManifest -Path .\TestModuleWithEdition.psd1 -CompatiblePSEditions Desktop,Core -PowerShellVersion 5.1  
$moduleInfo = Test-ModuleManifest -Path \TestModuleWithEdition.psd1  
$moduleInfo.CompatiblePSEditions  
Desktop  
Core  

$moduleInfo | Get-Member CompatiblePSEditions  

   TypeName: System.Management.Automation.PSModuleInfo  

Name                 MemberType Definition  
----                 ---------- ----------  
CompatiblePSEditions Property   System.Collections.Generic.IEnumerable[string] CompatiblePSEditions {get;}  

Bij het ophalen van een lijst met beschikbare modules kunt u de lijst filteren op PowerShell-editie.

Get-Module -ListAvailable | ? CompatiblePSEditions -Contains "Desktop"  

    Directory: C:\Program Files\WindowsPowerShell\Modules  


ModuleType Version    Name                                ExportedCommands  
---------- -------    ----                                ----------------  
Manifest   1.0        ModuleWithPSEditions  

Get-Module -ListAvailable | ? CompatiblePSEditions -Contains "Core" | % CompatiblePSEditions  
Desktop  
Core  

Auteurs van scripts kunnen met de parameter PSEdition in een #requires-instructie verhinderen dat een script wordt uitgevoerd, tenzij het wordt uitgevoerd op een compatibele versie van PowerShell.

Set-Content C:\script.ps1 -Value "#requires -PSEdition Core  
Get-Process -Name PowerShell"  
Get-Content C:\script.ps1  
#requires -PSEdition Core  
Get-Process -Name PowerShell  

C:\script.ps1  
C:\script.ps1 : The script 'script.ps1' cannot be run because it contained a "#requires" statement for PowerShell editions 'Core'. The edition of PowerShell that is required by the script does not match the currently running PowerShell Desktop edition.  
At line:1 char:1  
+ C:\script.ps1  
+ ~~~~~~~~~~~~~  
    + CategoryInfo          : NotSpecified: (script.ps1:String) [], RuntimeException  
    + FullyQualifiedErrorId : ScriptRequiresUnmatchedPSEdition  

Nano Server installeren

In Nano Server installeren, het overkoepelende onderwerp voor dit onderwerp, vindt u een korte handleiding met gedetailleerde stappen voor het installeren van Nano Server op virtuele of fysieke machines.

Opmerking

Als u in Nano Server wilt ontwikkelen, kunt u het beste Nano Server installeren met de parameter -Development van New-NanoServerImage. Op die manier kunt u niet-ondertekende stuurprogramma's installeren, binaire bestanden voor het foutopsporingsprogramma kopiëren, een poort voor foutopsporing openen, het ondertekenen van testen inschakelen en de AppX-pakketten zonder een ontwikkelaarslicentie installeren. Bijvoorbeeld:

New-NanoServerImage -DeploymentType Guest -Edition Standard -MediaPath \\Path\To\Media\en_us -BasePath .\Base -TargetPath .\NanoServer.wim -Development

Het type cmdlet-implementatie bepalen

PowerShell ondersteunt een aantal implementatietypen voor cmdlets, en met het gebruikte implementatietype worden het proces en de hulpprogramma's bepaald voor het maken van de cmdlets en het overzetten hiervan naar Nano Server. Ondersteunde implementatietypen zijn:

  • CIM: bestaat uit CDXML-bestanden gelaagd via CIM-providers (WMIv2)
  • .NET: bestaat uit .NET-assembly's waarmee beheerde cmdlet-interfaces worden geïmplementeerd, meestal gecodeerd in C#
  • PowerShell Script: bestaat uit scriptmodules (.psm1) of scripts (.ps1) die in de PowerShell-taal zijn geschreven

Als u niet zeker weet welke implementatie u hebt gebruikt voor bestaande cmdlets die u wilt overzetten, installeert u het product of de functie en zoekt u vervolgens de map van de PowerShell-module op een van de volgende locaties:

  • %windir%\system32\WindowsPowerShell\v1.0\Modules
  • %ProgramFiles%\WindowsPowerShell\Modules
  • %UserProfile%\Documents\WindowsPowerShell\Modules
  • <de locatie van de productinstallatie>

    Controleer op deze locaties de volgende gegevens:

    • CIM-cmdlets hebben .cdxml bestandsextensies.
    • .NET-cmdlets hebben .dll-bestandsextensies of hiervoor zijn assembly's geïnstalleerd in de GAC die wordt vermeld in het .psd1-bestand onder de velden RootModule, ModuleToProcess of NestedModules.
  • PowerShell-script-cmdlets hebben .psm1- of .ps1-bestandsextensies.

CIM-cmdlets overzetten

Deze cmdlets moeten over het algemeen in Nano Server kunnen worden gebruikt zonder dat daarvoor een conversie hoeft te worden uitgevoerd. U moet echter de onderliggende WMI v2-provider overzetten zodat deze in Nano Server kan worden uitgevoerd, als dat nog niet is gebeurd.

In C++ coderen voor Nano Server

Als u in Nano Server DLL's voor C++ wilt gebruiken, compileert u deze voor Nano Server in plaats van deze voor een specifieke editie te compileren.

Zie Developing Native Apps on Nano Server (Systeemeigen toepassingen ontwikkelen in Nano Server) voor de vereisten voor en een overzicht van het ontwikkelen in C++ in Nano Server.

.NET-cmdlets overzetten

De meeste C#-code wordt ondersteund in Nano Server. U kunt met ApiPort scannen op niet-compatibele API's.

PowerShell Core SDK

De module Microsoft.PowerShell.NanoServer.SDK is beschikbaar in de PowerShell-galerie en biedt u de mogelijkheid om .NET-cmdlets te ontwikkelen met Visual Studio 2015 Update 2 die zijn gericht op de versies van CoreCLR en PowerShell Core die beschikbaar zijn in Nano Server. U kunt de module met PowerShellGet installeren door de volgende opdracht uit te voeren:

Find-Module Microsoft.PowerShell.NanoServer.SDK -Repository PSGallery | Install-Module -Scope <scope>

De PowerShell Core SDK-module bevat cmdlets voor het instellen van de juiste CoreCLR- en PowerShell Core-verwijzingsassembly's, het maken van een C#-project in Visual Studio 2015 dat gericht is op deze verwijzingsassembly's en het instellen van de externe foutopsporing op een Nano Server-computer zodat ontwikkelaars vanaf een externe locatie fouten in hun .NET-cmdlets in Nano Server kunnen opsporen in Visual Studio 2015.

Voor de PowerShell Core SDK-module is Visual Studio 2015 Update 2 vereist. Als u Visual Studio 2015 niet hebt geïnstalleerd, kunt u Visual Studio Community 2015 installeren.

Voor de SDK-module moet ook de volgende functie in Visual Studio 2015 worden geïnstalleerd:

  • Windows en webontwikkeling -> Ontwikkelprogramma's voor universele Windows-apps -> Tools (1.3.1) en Windows 10 SDK

Controleer de installatie van Visual Studio voordat u de SDK-module gebruikt zodat aan deze vereisten is voldaan. Zorg ervoor dat u de optie selecteert voor het installeren van bovenstaande functie tijdens de installatie van Visual Studio, of wijzig de bestaande installatie van Visual Studio 2015 om het te installeren.

De PowerShell Core SDK-module bevat de volgende cmdlets:

  • New-NanoCSharpProject: hiermee maakt u een nieuw C#-project in Visual Studio die gericht is op CoreCLR en PowerShell Core die zijn opgenomen in de Windows Server 2016-versie van Nano Server.
  • Show-SdkSetupReadMe: hiermee opent u de SDK-hoofdmap in Bestandenverkenner en opent u het bestand Leesmij.txt voor de handmatige installatie.
  • Install-RemoteDebugger: hiermee wordt de externe foutopsporing van Visual Studio op een Nano Server-computer geïnstalleerd en geconfigureerd.
  • Start-RemoteDebugger: hiermee start u de externe foutopsporing op een externe computer met Nano Server.
  • Stop-RemoteDebugger: hiermee stopt u de externe foutopsporing op een externe computer met Nano Server.

Als u gedetailleerde informatie wilt over het gebruik van deze cmdlets, voert u als volgt voor elke cmdlet Get-Help uit na de installatie en het importeren van de module:

Get-Command -Module Microsoft.PowerShell.NanoServer.SDK | Get-Help -Full

Zoeken naar compatibele API's

U kunt in de API-catalogus zoeken naar .NET Core of Core CLR- verwijzingsassembly's ontleden. Zie Platform Portability (Platformoverdraagbaarheid) voor meer informatie over platformoverdraagbaarheid van .NET-API's

PInvoke

In de CLR Core die Nano Server gebruikt zijn sommige elementaire DLL's zoals kernel32.dll en advapi32.dll opgesplitst in talrijke API-sets. U moet er dus voor zorgen dat de PInvoke's naar de juiste API verwijzen. Eventuele incompatibiliteit resulteert in een runtime-fout.

Zie Nano Server-API's voor een lijst van systeemeigen API's die worden ondersteund in Nano Server.

In C# coderen voor Nano Server

Wanneer een C#-project in Visual Studio 2015 wordt gemaakt met New-NanoCSharpProject, kunt u dit gewoon coderen in Visual Studio door op het menu Build (Coderen) te klikken en Build Project (Project coderen) of Build Solution (Oplossing coderen) te selecteren. De gegenereerde assembly's zijn gericht op de juiste CoreCLR en PowerShell Core die zijn geleverd met Nano Server en u kunt eenvoudig de assembly's kopiëren naar een computer met Nano Server en deze gebruiken.

In beheerde C++ (CPP/CLI) coderen voor Nano Server

Beheerde C++ wordt niet ondersteund voor CoreCLR. Wanneer u de code overzet naar CoreCLR, herschrijft u de beheerde C++-code in C# en maakt u alle systeemeigen aanroepen via PInvoke.

Cmdlets voor PowerShell-scripts overzetten

PowerShell Core biedt volledige PowerShell-taalpariteit met andere edities van PowerShell, zoals de editie die wordt uitgevoerd in Windows Server 2016 en Windows 10. Wanneer u cmdlets voor PowerShell-scripts overzet naar Nano Server, moet u echter rekening houden met de volgende factoren:

  • Zijn er afhankelijkheden met andere cmdlets? Als dit het geval is, zijn die cmdlets dan beschikbaar in Nano Server? Zie PowerShell on Nano Server (PowerShell in Nano Server) voor informatie over welke cmdlets niet beschikbaar zijn.
  • Als er afhankelijkheden bestaan voor assembly's die tijdens runtime worden geladen, werken deze dan nog steeds?
  • Hoe kan externe foutopsporing voor het script worden uitgevoerd?
  • Hoe kan een migratie van WMI .net naar MI .net worden uitgevoerd?

Afhankelijkheid van ingebouwde cmdlets

Niet alle cmdlets in Windows Server 2016 zijn beschikbaar in Nano Server (Zie PowerShell in Nano Server). U kunt het beste een virtuele machine met Nano Server instellen en detecteren of de gewenste cmdlets beschikbaar zijn. U kunt dit doen door Enter-PSSession uit te voeren om verbinding te maken met de doel-Nano Server en vervolgens Get-Command -CommandType Cmdlet, Function uit te voeren om de lijst met beschikbare cmdlets op te halen.

U kunt hiervoor PowerShell-klassen gebruiken

Add-Type wordt ondersteund in Nano Server voor het compileren van inline C#-ode. Als u nieuwe code schrijft of bestaande code overzet, kunt u ook overwegen om PowerShell-klassen te gebruiken om aangepaste typen te definiëren. U kunt PowerShell-klassen gebruiken voor scenario's met eigenschappenverzamelingen evenals voor enum-waarden. Als u een PInvoke wilt uitvoeren, doet u dit via C# met behulp van Add-Type of in een vooraf gecompileerde assembly.
Hier volgt een voorbeeld van het gebruik van Add-Type:

Add-Type -ReferencedAssemblies ([Microsoft.Management.Infrastructure.Ciminstance].Assembly.Location) -TypeDefinition @'  
public class TestNetConnectionResult  
{  
   // The compute name  
   public string ComputerName = null;  
   // The Remote IP address used for connectivity  
   public System.Net.IPAddress RemoteAddress = null;  
}  
'@  
# Create object and set properties  
$result = New-Object TestNetConnectionResult  
$result.ComputerName = "Foo"  
$result.RemoteAddress = 1.1.1.1  

In dit voorbeeld wordt het gebruik van PowerShell-klassen in Nano Server getoond:

class TestNetConnectionResult    
{    
   # The compute name  
  [string] $ComputerName    

  #The Remote IP address used for connectivity    
  [System.Net.IPAddress] $RemoteAddress  
}  
# Create object and set properties  
$result = [TestNetConnectionResult]::new()  
$result.ComputerName = "Foo"  
$result.RemoteAddress = 1.1.1.1  

Externe foutopsporing voor scripts

Als u externe foutopsporing voor een script wilt uitvoeren, maakt u verbinding met de externe computer via Enter-PSsession vanaf de PowerShell ISE. Wanneer u zich eenmaal in de sessie bevindt, kunt u psedit <file_path> uitvoeren en wordt er een kopie van het bestand geopend in uw lokale PowerShell ISE. Vervolgens kunt u fouten voor het script opsporen alsof het lokaal wordt uitgevoerd door onderbrekingspunten in te stellen. Ook worden de wijzigingen die u aanbrengt in dit bestand opgeslagen in de externe versie.

Migreren van WMI .NET naar MI .NET

WMI .NET wordt niet ondersteund, zodat alle cmdlets die gebruikmaken van de oude API moeten worden gemigreerd naar de ondersteunde WMI API: MI. NET. U hebt rechtstreeks toegang tot MI .NET via C# of via de cmdlets in de module CimCmdlets.

De module CimCmdlets

De WMI v1-cmdlets (zoals Get-WmiObject) worden niet ondersteund in Nano Server. De CIM-cmdlets (zoals Get-CimInstance) worden echter ondersteund in de module CimCmdlets. De CIM-cmdlets worden op gelijksoortige wijze als de WMI v1-cmdlets toegewezen. Get-WmiObject komt overeen met Get-CimInstance en maakt gebruik van zeer gelijksoortige parameters. De syntaxis van de methodeaanroepen is iets anders, maar wordt goed gedocumenteerd via Invoke-CimMethod. Wees voorzichtig met het gebruik van parametertypen. MI .NET heeft strengere vereisten met betrekking tot de typen methodeparameters.

C# API

De WMIv1-interface wordt met WMI .NET verpakt, terwijl de WMIv2- interface (CIM) met MI .NET wordt verpakt. De beschikbare klassen kunnen afwijken, maar de onderliggende bewerkingen hebben grote overeenkomsten. U inventariseert objecten of haalt exemplaren van de objecten op en roept bewerkingen aan om taken uit te voeren.

© 2017 Microsoft