> For the complete documentation index, see [llms.txt](https://docs.devolutions.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devolutions.net/powershell-universal/da/platform/variables.md).

# Variabler

Opret globale variabler og hemmelighedsvariabler i PowerShell Universal, administrer hemmelighedsbokse, og henvis til indbyggede variabler, der er tilgængelige i scripts, API'er og apps.

Variabler kan bruges i API'er, scripts og dashboards. Når standardmiljøerne bruges, importeres alle variabler automatisk. Det gøres ved at angive parameteren `-Variable` for `New-PSUEnvironment` med et jokertegn (\*). Hvis De bruger Deres egne miljøer, skal De konfigurere, hvilke variabler De vil medtage. De kan referere til en variabel på samme måde som til enhver anden PowerShell-variabel. Variablen indeholder den værdi, De har angivet. Hvis De bruger en hemmelighed, indeholder den hemmelighedens værdi.

{% hint style="info" %}
Variabler gemmes i konfigurationsfilen `variables.ps1`.
{% endhint %}

## Oprettelse af en variabel

For at oprette en variabel skal De gå til siden Manage > Variables & Secrets > Variables. Klik på Create Variable for at definere en ny variabel.

Variabler føjes til Deres scripts, før de køres.

## Oprettelse af en hemmelighedsvariabel

Hemmelighedsvariabler gemmes i den valgte boks. Værdien af disse variabler gemmes aldrig i Universal. For at definere en ny hemmelighedsvariabel skal De klikke på Create Secret Variable på siden med variabler og vælge fanen Secret.

Fra denne dialogboks kan De definere strenge og PSCredentials i den angivne boks.

### Format for legitimationsoplysninger

I nogle miljøer kan det være nødvendigt at angive domænenavnet i brugernavnsfeltet. De kan angive det i formatet `domain\user` eller `user@domain`. Hvis De ikke gør det, får De fejl, når De forsøger at starte processer, f.eks. scripts eller dashboards, som den brugerkonto.

### Gruppehåndterede tjenestekonti

Når De bruger Group Managed Service Accounts (GMSA), skal De sikre, at computeren og kontoen har adgang til GSMA-kontoen. De kan følge [Microsofts vejledning her](https://techcommunity.microsoft.com/blog/itopstalkblog/step-by-step-how-to-work-with-group-managed-service-accounts-gmsa/329864). Når konfigurationen er fuldført, skal De oprette en ny legitimationsoplysning i hemmelighedsadministrationen i PowerShell Universal og vælge indstillingen Password Not Required. Angiv GSMA-kontoen (f.eks. domain\user$). Så længe den hostende konto har de rette privilegier, kan De køre jobs som GMSA-kontoen.

### Validering af legitimationsoplysninger

På Windows kan De validere legitimationsoplysninger, før De gemmer deres værdi. Angiv brugernavnet og adgangskoden, og klik derefter på knappen Validate i adgangskodefeltet for at forsøge at logge brugeren på lokalt på PowerShell Universal-serveren. Denne knap vises ikke på systemer, der ikke er Windows.

Brugernavnet kan angives i formatet `DOMAIN\user` eller `user@domain`.

Valideringen udfører et batchlogon. For at valideringen kan lykkes, kræver kontoen brugerrettigheden Log på som et batchjob (`SeBatchLogonRight`) på PowerShell Universal-serveren og må ikke stå under Afvis logon som et batchjob.

Resultatet vises som enten Successful eller Failed. Der angives ingen fejlkode eller årsag, når valideringen mislykkes. En fejl kan skyldes en forkert adgangskode, en låst konto eller en manglende rettighed til Log på som et batchjob.

### Roller

{% hint style="warning" %}
Hvis roller anvendes på en hemmelighed, forhindres hemmeligheden i at være tilgængelig i planlagte jobs, fordi der ikke anvendes roller i planlæggeren.
{% endhint %}

Hemmelighedsvariabler kan omfatte rollebaseret adgang. Roller begrænser, hvem der kan bruge hemmeligheden i sine scripts og som legitimationsoplysninger til kør som.

Når en hemmelighed har en defineret rolle, er den ikke tilgængelig i ressourcer, der ikke kan levere den rolle. Dette kan omfatte følgende:

* Planlagte jobs
* Ikke-godkendte API'er eller apps
* Terminaler

## Bokse

### Database

Databaseboksen gemmer hemmeligheder i PowerShell Universal-databasen. Disse hemmeligheder er krypteret ved hjælp af AES-kryptering med en nøgle, der kan tilpasses. De kan tilpasse nøglen ved at angive Secrets \ Database \ EncryptionKey.

#### appsettings.json

De kan konfigurere denne indstilling i appsettings.json.

{% code collapsedlinecount="10" %}

```json
"Secrets": {
  "Database": {
    "EncryptionKey": "=b0ywQA@VOSdr&R7an5g&XK6NVO%s4Tf"
  }
}
```

{% endcode %}

#### Miljøvariabel

De kan konfigurere denne indstilling med en miljøvariabel.

{% code collapsedlinecount="10" %}

```powershell
$Env:Secrets__Database__EncryptionKey = "=b0ywQA@VOSdr&R7an5g&XK6NVO%s4Tf"
```

{% endcode %}

### BuiltInLocalVault

{% hint style="warning" %}
Hvis PowerShell Universal køres som en gruppeadministreret tjenestekonto, kan det ikke bruge `BuiltInLocalVault`.
{% endhint %}

Værdier for hemmeligheder med `BuiltInLocalVault` gemmes i den instans af Windows Credential Manager, der tilhører den sikkerhedsprincipal, som kører PSU. For eksempel tjenestekontoen for den bruger, der kører Universal-tjenesten. Hvis De skifter bruger (f.eks. kører som en tjenestekonto), har kontoen ikke adgang til den tidligere brugers hemmeligheder, og De skal tilføje disse hemmeligheder igen.

### PSUSecretStore

{% hint style="warning" %}
Hvis PowerShell Universal køres som en gruppeadministreret tjenestekonto, kan det ikke bruge `PSUSecretStore`.
{% endhint %}

Boksen `PSUSecretStore` er integreret med Microsoft-modulet `SecretStore` for at gemme hemmeligheder i en fil på tværs af platforme. Denne fil er knyttet til den aktuelle brugerkonto, der kører PowerShell Universal. Adgangskoden til boksen gemmes i `appsettings.json`.

### Az.KeyVault

{% hint style="info" %}
Brug registreringen af Azure Key Vault-boksen til at konfigurere Azure Key Vault til PowerShell Universal.
{% endhint %}

Som standard medtager vi ikke Azure Key Vault-udvidelsen direkte i PowerShell Universal. Der findes en objektbeholder med de påkrævede moduler Az.Accounts og Az.KeyVault, så De kan bruge KeyVault direkte. Den findes på [Docker Hub](https://hub.docker.com/r/devolutions/powershell-universal).

Nedenfor kan De se, hvordan De konfigurerer den. Dette eksempel bruger en Azure-hostet web-app-version af PowerShell Universal.

I Azure skal vi konfigurere en administreret identitet til vores webapp. Dette trin er ikke nødvendigvis påkrævet, hvis De kører uden for Azure. De kan aktivere den administrerede identitet under siden Identity for Deres webapp.

Til sidst skal vi registrere boksen og oprette forbindelse til Azure, når webappen starter. Det kan gøres ved hjælp af modulerne Az.Account og Az.KeyVault.

Når De har udrullet Deres web-app, skal De først installere modulerne Az.Account og Az.KeyVault. De kan gøre det på modulsiden. Modulerne installeres i det lokale lager i webappen.

Opret derefter et script i PowerShell Universal for at oprette forbindelse til Azure og registrere boksen. Kør scriptet for at kontrollere, at det fungerer korrekt.

{% code collapsedlinecount="10" %}

```powershell
$sub = 'affdf0d4-eed5-48a6-889c-599d482xxxxx'
Connect-AzAccount -Id -Scope CurrentUser -SubscriptionId $sub

Register-SecretVault -ModuleName Az.KeyVault -Name AzureKeyVault -VaultParameters @{ 
    AZKVaultName = 'psu-demo'
    SubscriptionId = $sub
} -AllowClobber
```

{% endcode %}

Når De opretter hemmeligheder, kan De nu se, at AzureKeyVault er tilgængelig.

For at sikre, at programmet har forbindelse til Azure, og at boksen er registreret, skal De køre scriptet i `vaults.ps1`. Vi anbefaler at køre scriptet i en ekstern PowerShell-proces for at undgå assemblykonflikter med PowerShell Universal-DLL'er.

{% code collapsedlinecount="10" %}

```powershell
$pwsh = (Get-Command pwsh).Path
& $pwsh -File "$PSScriptRoot\registerVault.ps1"
```

{% endcode %}

Dette script køres, før variabler registreres, og før bokse findes. De kan oprette denne fil direkte i kataloget Repository.universal. Det køres under systemstarten, før andre konfigurationsscripts køres.

### vaults.ps1

Filen `vaults.ps1` indeholder kommandoer til registrering af bokse. Selvom eksemplet ovenfor definerer en registrering af en hemmelighedsboks i Azure KeyVault, kan De medtage enhver registrering af en boks, som De har brug for, i denne fil.

De kan redigere bokse ved at klikke på Manage > Variables & Secrets > Vaults og derefter gå til fanen vaults.ps1.

## Import af hemmelighedsvariabler

De kan også importere eksisterende hemmeligheder som variabler i Universal. Variabelværdierne importeres ikke, men slås op under kørsel. Klik på knappen Import Secret for at importere hemmeligheder.

## Brug af variabler

Variabler kan bruges i API'er, scripts og dashboards. Når standardmiljøerne bruges, importeres alle variabler automatisk. Det gøres ved at angive parameteren `-Variable` for `New-PSUEnvironment` med et jokertegn (\*). Hvis De bruger Deres egne miljøer, skal De konfigurere [hvilke variabler De vil medtage](https://docs.powershelluniversal.com/config/environments#variables). De kan referere til en variabel på samme måde som til enhver anden PowerShell-variabel. Variablen indeholder den værdi, De har angivet. Hvis De bruger en hemmelighed, indeholder den hemmelighedens værdi.

{% code collapsedlinecount="10" %}

```
$MyVariable
```

{% endcode %}

De kan tilpasse, hvilke variabler der er tilladt i et miljø, ved at tilpasse miljøets parameter `-Variable`.

Se Miljøer for at få flere oplysninger.

## Secret-omfang

For at få adgang til hemmeligheder, som De har tilføjet i PowerShell Universal, kan De bruge omfanget `$Secret`. Hvis De for eksempel har defineret en hemmelighed med navnet `Credential`, kan De få adgang til den hemmelighed overalt med secret-omfanget. De kan ikke angive hemmeligheder ved hjælp af secret-omfanget.

{% code collapsedlinecount="10" %}

```powershell
Invoke-Command -Credential $Secret:Credential { Write-Host "Hello" }
```

{% endcode %}

### Adgang til variabler efter navn

De kan få adgang til variabler efter navn ved hjælp af præfikset `$Secret:`.

{% code collapsedlinecount="10" %}

```powershell
# PSCredential
$Secret:MyNewSecret.UserName
$Secret:MyNewSecret.Password

# String
$Secret:DashboardSecret
```

{% endcode %}

### Adgang til værdier dynamisk

De kan få adgang til secret-omfanget dynamisk ved hjælp af `Get-Item`. Secret-omfanget er implementeret som en provider. Det er nyttigt, hvis De ikke har statiske variabelnavne.

{% code collapsedlinecount="10" %}

```powershell
# PSCredential
(Get-ChildItem "Secret:MyNewSecret").UserName
(Get-ChildItem "Secret:MyNewSecret").Password

# String
(Get-ChildItem "Secret:DashboardSecret")
```

{% endcode %}

### ForEach-Object -Parallel

For at bruge hemmeligheder, når De bruger `ForEach-Object` med parameteren `-Parallel`, skal De udnytte nøgleordet `$using`.

{% code collapsedlinecount="10" %}

```powershell
1..5 | ForEach-Object -Parallel {
  $using:Secret:MySecret
}
```

{% endcode %}

## Konfiguration af adgangskoden til `PSUSecretStore`

Som standard gemmes adgangskoden til boksen `PSUSecretStore` i `appsettings.json` i Secrets \ SecretStore \ Password.

## Indbyggede variabler

Følgende variabler er tilgængelige i alle miljøer i PowerShell Universal.

Denne reference viser de variabler i PowerShell Universal, der er beregnet til brug i Deres kode. `Get-Variable` returnerer også standard automatiske variabler i PowerShell og interne implementeringsvariabler, så outputtet ikke svarer nøjagtigt til disse tabeller.

| Navn            | Type   | Beskrivelse                                                   |
| --------------- | ------ | ------------------------------------------------------------- |
| $PSUEnvironment | string | Navnet på det miljø, som scriptet kører i (f.eks. Integrated) |
| $Repository     | string | Den absolutte sti til lagermappen.                            |

### API

Der findes et sæt foruddefinerede variabler, som er tilgængelige i API-slutpunkter. De kan bruge disse variabler i Deres scripts.

| Variabel         | Beskrivelse                                                                                                                                                                                               | Type           |
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- |
| $Url             | Den URL, som klienten brugte til at kalde slutpunktet                                                                                                                                                     | String         |
| $Method          | Den HTTP-metode, der blev brugt til at kalde slutpunktet                                                                                                                                                  | String         |
| $Headers         | Headere, som klienten angav for at kalde slutpunktet                                                                                                                                                      | Hashtable      |
| $Body            | Den UTF8-kodede streng med indholdet af anmodningen                                                                                                                                                       | String         |
| $Data            | Binært byte-array for indholdet af anmodningen                                                                                                                                                            | Byte\[]        |
| $RemoteIpAddress | Fjern-IP-adressen for den klient, der foretager anmodningen                                                                                                                                               | String         |
| $LocalIpAddress  | Fjern-IP-adressen for den tjeneste, der behandler anmodningen                                                                                                                                             | String         |
| $RemotePort      | Den fjernport, der blev kaldt for at foretage anmodningen                                                                                                                                                 | Integer        |
| $LocalPort       | Den lokale port, der blev brugt til at behandle anmodningen                                                                                                                                               | Integer        |
| $Identity        | Identitetsnavnet på den principal, der tilgår API'en.                                                                                                                                                     | String         |
| $UrlDefinition   | Definitionen af URL'en.                                                                                                                                                                                   | String         |
| $ConnectionId    | [HTTP Context-forbindelses-id'et](https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.connectioninfo.id?view=aspnetcore-6.0#Microsoft.AspNetCore.Http.ConnectionInfo.Id).               | String         |
| $SessionId       | [HTTP Context-sessions-id.](https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.isession.id?view=aspnetcore-6.0#Microsoft.AspNetCore.Http.ISession.Id)                                  | String         |
| $RequestId       | [HTTP Context-anmodnings-id](https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.httpcontext.traceidentifier?view=aspnetcore-6.0#Microsoft.AspNetCore.Http.HttpContext.TraceIdentifier) | String         |
| $ClaimsPrincipal | Claims-principalen for den aktuelle bruger. Dette er det samme objekt, der leveres til rollebaserede adgangspolitikker.                                                                                   | ClaimPrincipal |

### Apps

Nedenfor er de variabler, der er tilgængelige i apps, ud over de globale variabler.

| Navn             | Beskrivelse                                                                                                             | Type           |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------- | -------------- |
| $User            | Brugernavnet på den bruger, der er logget på. $Null, hvis godkendelse er deaktiveret.                                   | String         |
| $Roles           | Rollerne, som brugeren har fået tildelt. $Null, hvis godkendelse er deaktiveret.                                        | String\[]      |
| $RemoteIpAddress | Fjern-IP-adressen for den tilsluttede bruger.                                                                           | String         |
| $RemotePort      | Fjernporten for den tilsluttede bruger.                                                                                 | Int            |
| $ClaimsPrincipal | Claims-principalen for den aktuelle bruger. Dette er det samme objekt, der leveres til rollebaserede adgangspolitikker. | ClaimPrincipal |
| $Headers         | Headerne, som browseren har angivet.                                                                                    | hashtable      |
| $Cookies         | Anmodningens cookies, som browseren har angivet.                                                                        | hashtable      |
| $PSUAppToken     | App-tokenet for den aktuelle bruger. Kun tilgængeligt, når -GrantAppToken er aktiveret.                                 | string         |
| $PSUURL          | URL'en til PSU-serveren. Kun tilgængelig, når -GrantAppToken er aktiveret.                                              | string         |
| $DashboardName   | Navnet på den aktuelle app                                                                                              | string         |
| $Query           | Parameterne i forespørgselsstrengen fra appens URL                                                                      | Hashtable      |
| $RefreshToken    | Opdateringstokenet ved brug af OpenID Connect                                                                           | string         |
| $AccessToken     | App-tokenet ved brug af OpenID Connect                                                                                  | string         |
| $UDPage          | Navnet på den aktuelle side                                                                                             | string         |

### Scripts

Der findes flere indbyggede variabler, som defineres, når et job køres. De kan bruge disse variabler i Deres scripts til at hente oplysninger om det aktuelle job.

| Navn          | Beskrivelse                                                                                                                         |
| ------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| $UAJob        | Det aktuelle job, der kører. Det omfatter egenskaber som scriptet, den bruger, der startede jobbet, og hvornår jobbet blev startet. |
| $UAJobId      | Id'et for det kørende job.                                                                                                          |
| $UAScript     | Det script, der kører. Det omfatter egenskaber som navnet på scriptet og stien til scriptet.                                        |
| $UAScriptId   | Id'et for det kørende script.                                                                                                       |
| $UASchedule   | Den tidsplan, der blev brugt til at starte scriptet.                                                                                |
| $UAScheduleId | Id'et for den tidsplan, der startede scriptet.                                                                                      |
| $AccessToken  | Når De bruger OIDC-godkendelse, kan De hente den aktuelle brugers adgangstoken for at tilgå ressourcer på dennes vegne.             |
| $Roles        | Rollerne for kalderen af scriptet.                                                                                                  |

#### Objektstruktur for $UAJob

Bemærk, at egenskaber kan være null. `DateTime`-objekter returneres i tidszonen UTC.

{% code collapsedlinecount="10" %}

```csharp
class Job {
    public long Id { get; set; }
    public DateTime CreatedTime { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
    public JobStatus Status { get; set; }
    public string Output { get; set; }
    public string ScriptFullPath { get; set; }
    public Identity Identity { get; set; }
    public Job ParentJob { get; set; }
    public int ParentLineNumber { get; set; }
    public string ComputerName { get; set; }
    public int ProcessId { get; set; }
    public long MemoryBytes { get; set; }
    public int RunspaceId { get; set; }
    public string Activity { get; set; }
    public string CurrentOperation { get; set; }
    public int PercentComplete { get; set; }
    public int SecondsRemaining { get; set; }
    public string StatusDescription { get; set; }
    public string Environment { get; set; }
    public Computer Computer { get; set; }
    public ActionPreference ErrorAction { get; set; }
    public IEnumerable<Job> Children { get; set; }
    public IEnumerable<JobParameter> Parameters { get; set; }
    public string Credential { get; set; }
    public long ScheduleId { get; set; }
    public bool Triggered { get; set; }
    public string Trigger { get; set; }
    public int RetryCount { get; set; }
    public string Tags { get; set; }
    public string Schedule { get; set; }
    public bool Archived { get; set; }
    public bool Batch { get; set; }
    public Guid? RunId { get; set; }
    public string Roles { get; set; }
}

public enum JobStatus
{
    Queued,
    Running,
    Completed,
    Failed,
    WaitingOnFeedback,
    Canceled,
    Canceling,
    Historical,
    Active,
    TimedOut,
    Warning,
    Error
}
```

{% endcode %}

#### Hentning af den bruger, der startede et script

De kan hente navnet på den bruger, der startede et script, ved hjælp af variablen `UAJob`

{% code collapsedlinecount="10" %}

```
$UAJob.Identity.Name
```

{% endcode %}

#### Kontrol af, om et job blev kørt manuelt

De kan kontrollere, om et job blev kørt manuelt, ved hjælp af egenskaberne Schedule og Trigger.

{% code collapsedlinecount="10" %}

```powershell
$Manual = $UAJob.Schedule -eq $null -and $UAJob.Trigger -eq $null
```

{% endcode %}

## Præferencevariabler

Præferencevariabler kan konfigureres på et script, under kørsel af et job og på globalt niveau. Disse omfatter:

* DebugPreference
* ErrorActionPreference
* InformationPreference
* ProgressPreference
* VerbosePreference
* WarningPreference

Præferencevariablerne har forrang. Følgende liste er ordnet efter forrang. Hvis et script for eksempel angiver variablen `$DebugPreference` manuelt, tilsidesætter den den værdi, der er angivet i scriptets egenskabsdialogboks.

* Script
* Dialogboks til kørsel eller Invoke-PSUScript
* Scriptegenskaber
* Globale indstillinger

## API

* New-PSUVariable
* Get-PSUVariable
* Remove-PSUVariable
* Set-PSUVariable

### Se også

* [Devolutions Academy – Tilføjelse af funktionen til oplåsning af bruger](https://academy.devolutions.net/student/activity/3546024-part-4-adding-user-unlock-feature)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.devolutions.net/powershell-universal/da/platform/variables.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
