Dela via


DSC-skriptresurs

Gäller för: Windows PowerShell 4.0, Windows PowerShell 5.x

Den Script resursen i Windows PowerShell Desired State Configuration (DSC) tillhandahåller en mekanism för att köra Windows PowerShell-skriptblock på målnoder. Den Script resursen använder GetScriptSetScriptoch TestScript egenskaper som innehåller skriptblock som du definierar för att utföra motsvarande DSC-tillståndsåtgärder.

Dricks

Där det är möjligt är det bästa praxis att använda en definierad DSC-resurs i stället för den här. Den Script resursen har nackdelar som gör det svårare att testa, underhålla och förutsäga.

Till skillnad från andra DSC-resurser är varje egenskap för en Script resurs en nyckelegenskap och metoden Get för den här resursen kan bara returnera en enda sträng för det aktuella tillståndet. Det finns inga garantier för att den här resursen implementeras idempotently eller att den fungerar som förväntat på alla system eftersom den använder anpassad kod. Det kan inte testas utan att anropas i ett målsystem.

Innan du använder den Script resursen bör du överväga om du kan skapa en resurs i stället. Om du använder väldefinierade DSC-resurser blir dina konfigurationer mer läsbara och underhållsbara.

Not

Den här dokumentationen för den här DSC-resursen omfattar den version som ingår i PowerShell före version 7.2. Modulen PSDscResources innehåller nya och uppdaterade DSC-resurser som stöds officiellt av Microsoft. Modulen PSDscResources är tillgänglig från PowerShell-galleriet.

Mer information och uppdaterad dokumentation finns i referensdokumentationen PSDscResources.

Syntax

Script [string] #ResourceName
{
    GetScript = [string]
    SetScript = [string]
    TestScript = [string]
    [ Credential = [PSCredential] ]
    [ DependsOn = [string[]] ]
    [ PsDscRunAsCredential = [PSCredential] ]
}

Not

GetScript TestScript, och SetScript block lagras som strängar.

Egenskaper

Egenskap Beskrivning
GetScript Ett skriptblock som returnerar nodens aktuella tillstånd.
SetScript Ett skriptblock som DSC använder för att framtvinga efterlevnad när noden inte är i önskat tillstånd.
TestScript Ett skriptblock som avgör om noden är i önskat tillstånd.
Referens Anger de autentiseringsuppgifter som ska användas för att köra det här skriptet, om autentiseringsuppgifter krävs.

Vanliga egenskaper

Egenskap Beskrivning
DependsOn Anger att konfigurationen av en annan resurs måste köras innan den här resursen har konfigurerats.
PsDscRunAsCredential Anger autentiseringsuppgifterna för att köra hela resursen som.

Not

PsDscRunAsCredential gemensamma egenskapen lades till i WMF 5.0 för att tillåta körning av DSC-resurser i kontexten för andra autentiseringsuppgifter. Mer information finns i Använda autentiseringsuppgifter med DSC-resurser.

Ytterligare information

GetScript

DSC använder inte utdata från GetScript Cmdleten Get-DscConfigur ation kör GetScript för att hämta en nods aktuella tillstånd. Ett returvärde krävs inte från GetScript Om du anger ett returvärde måste det vara en hashtabell som innehåller en Resultat nyckel vars värde är en Sträng.

TestScript

DSC kör TestScript för att avgöra om SetScript ska köras. Om TestScript returnerar $falsekör DSC SetScript för att återställa noden till önskat tillstånd. Det måste returnera ett booleskt värde. Ett resultat av $true anger att noden är kompatibel och SetScript inte ska köras.

Cmdleten Test-DscConfiguration kör TestScript för att hämta nodernas kompatibilitet med Script resurser. Men i det här fallet körs inte SetScript, oavsett vilken TestScript block returnerar.

Not

Alla utdata från din TestScript är en del av dess returvärde. PowerShell tolkar oövertryckta utdata som icke-noll, vilket innebär att din TestScript returnerar $true oavsett nodens tillstånd. Detta resulterar i oförutsägbara resultat, falska positiva identifieringar och orsakar problem under felsökningen.

SetScript

SetScript ändrar noden för att framtvinga önskat tillstånd. DSC anropar SetScript om TestScript-skriptblocket returnerar $false. SetScript ska inte ha något returvärde.

Exempel

Exempel 1: Skriva exempeltext med hjälp av en skriptresurs

I det här exemplet testas förekomsten av C:\TempFolder\TestFile.txt på varje nod. Om den inte finns skapas den med hjälp av SetScript. GetScript returnerar innehållet i filen och dess returvärde används inte.

Configuration ScriptTest
{
    Import-DscResource -ModuleName 'PSDesiredStateConfiguration'

    Node localhost
    {
        Script ScriptExample
        {
            SetScript = {
                $sw = New-Object System.IO.StreamWriter("C:\TempFolder\TestFile.txt")
                $sw.WriteLine("Some sample string")
                $sw.Close()
            }
            TestScript = { Test-Path "C:\TempFolder\TestFile.txt" }
            GetScript = { @{ Result = (Get-Content C:\TempFolder\TestFile.txt) } }
        }
    }
}

Exempel 2: Jämför versionsinformation med hjälp av en skriptresurs

Det här exemplet hämtar kompatibel versionsinformation från en textfil på redigeringsdatorn och lagrar den i variabeln $version. När du genererar nodens MOF-fil ersätter DSC de $using:version variablerna i varje skriptblock med värdet för variabeln $version. Under körningen lagras kompatibel version i en textfil på varje nod och jämförs och uppdateras vid efterföljande körningar.

$version = Get-Content 'version.txt'

Configuration ScriptTest
{
    Import-DscResource -ModuleName 'PSDesiredStateConfiguration'

    Node localhost
    {
        Script UpdateConfigurationVersion
        {
            GetScript = {
                $currentVersion = Get-Content (Join-Path -Path $env:SYSTEMDRIVE -ChildPath 'version.txt')
                return @{ 'Result' = "$currentVersion" }
            }
            TestScript = {
                # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript.
                $state = [scriptblock]::Create($GetScript).Invoke()

                if( $state.Result -eq $using:version )
                {
                    Write-Verbose -Message ('{0} -eq {1}' -f $state.Result,$using:version)
                    return $true
                }
                Write-Verbose -Message ('Version up-to-date: {0}' -f $using:version)
                return $false
            }
            SetScript = {
                $using:version | Set-Content -Path (Join-Path -Path $env:SYSTEMDRIVE -ChildPath 'version.txt')
            }
        }
    }
}

Exempel 3: Använda parametrar i en skriptresurs

Det här exemplet kommer åt parametrar inifrån skriptresursen genom att använda using omfång. ConfigurationData kan nås på ett liknande sätt. Precis som i exempel 2 förväntar sig implementeringen att en version lagras i en lokal fil på målnoden. Både den lokala sökvägen och versionen kan konfigureras, vilket avkodar kod från konfigurationsdata.

Configuration ScriptTest
{
    param
    (
        [Version]
        $Version,

        [string]
        $FilePath
    )

    Import-DscResource -ModuleName 'PSDesiredStateConfiguration'

    Node localhost
    {
        Script UpdateConfigurationVersion
        {
            GetScript = {
                $currentVersion = Get-Content -Path $using:FilePath
                return @{ 'Result' = "$currentVersion" }
            }
            TestScript = {
                # Create and invoke a scriptblock using the $GetScript automatic variable,
                # which contains a string representation of the GetScript.
                $state = [scriptblock]::Create($GetScript).Invoke()

                if( $state['Result'] -eq $using:Version )
                {
                    Write-Verbose -Message ('{0} -eq {1}' -f $state['Result'],$using:version)
                    return $true
                }

                Write-Verbose -Message ('Version up-to-date: {0}' -f $using:version)
                return $false
            }
            SetScript = {
                Set-Content -Path $using:FilePath -Value $using:Version
            }
        }
    }
}

Den resulterande MOF-filen innehåller variablerna och deras värden som nås via using omfång. De matas in i varje scriptblock, som använder variablerna. Test- och set-skript tas bort för korthet:

instance of MSFT_ScriptResource as $MSFT_ScriptResource1ref
{
 GetScript = "$FilePath ='C:\\Config.ini'\n\n $currentVersion = Get-Content -Path $FilePath\n return @{ 'Result' = \"$currentVersion\" }\n";
 TestScript = ...;
 SetScript = ...;
};

Kända begränsningar

  • Autentiseringsuppgifter som skickas i en skriptresurs är inte alltid tillförlitliga när du använder en pull- eller push-servermodell. Använd en fullständig resurs i stället för att använda en skriptresurs i det här fallet.