> 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/pam/da/knowledge-base/knowledge-base-articles/custom-pam-provider-action-scripts-in-devolutions-server.md).

# Handlingsscripts til brugerdefineret PAM-udbyder i Devolutions Server

Skriv PowerShell-handlingsscripts til brugerdefinerede PAM-udbydere i Devolutions Server, herunder kontoopdagelse, heartbeat og rotation af adgangskoder.

Brug af brugerdefinerede PAM-udbydere kræver oprettelse af handlingsscripts, som placeres i sektionen ***Script*** for hver handling under skabelonopbygningen.

Handlingsscripts er PowerShell-scripts, der udføres af Devolutions PAM, og de samme bedste praksisser, der gælder for ethvert PowerShell-script, bør følges. Der er dog særlige nuancer, der skal overvejes, når der skrives handlingsscripts.

{% hint style="success" %}
Færdigheder i PowerShell-scripting er afgørende for at oprette brugerdefinerede PAM-udbydere. Det anbefales, at personer har mindst et mellemniveau af scriptingfærdigheder, før de forsøger at oprette handlingsscripts.
{% endhint %}

### Scriptparametre for identitetsudbyderslutpunkt

Hvert handlingsscript skal indeholde et sæt parametre, som den brugerdefinerede PAM-udbyder sender værdier igennem. Selvom detaljerne kan variere, skal handlingsscripts dele et fælles sæt parametre for at oprette forbindelse til identitetsudbyderens slutpunkt. Nedenfor er et eksempel på, hvordan disse defineres:

```powershell
[Parameter(Mandatory)]
[string]$IdentityProviderEndpoint,
[Parameter(Mandatory)]
[string]$IdentityProviderEndpointUserName,
[Parameter(Mandatory)]
[securestring]$IdentityProviderEndpointPassword
```

{% hint style="success" %}
Selvom der er fleksibilitet i navngivningen af parametrene i handlingsscripts (forudsat at de stemmer overens med det, der er angivet under skabelonopbygningen i brugerdefinerede PAM-udbydere), er det tilrådeligt at bruge et standardsæt af parametre for at bevare ensartethed og klarhed i navngivningskonventioner.
{% endhint %}

I dette eksempel er hver parameter markeret som obligatorisk, hvilket tvinger udbyderen til at bruge dem. Sørg for at bruge typen `securestring` til parameteren `IdentityEndpointPassword`, da brugerdefinerede PAM-udbydere kræver det for at forhindre overførsel og behandling af adgangskoder i klartekst.

Når skabelonen til den brugerdefinerede PAM-udbyder opbygges, svarer disse parametre for identitetsudbyderens slutpunkt til dem, der er defineret under skabelonoprettelsen.

### Håndtering af valgfrie standardtilladelser

Når De har brug for at give mulighed for at sende en værdi til en scriptparameter uden at kræve den, betragtes parameteren som valgfri og bruges kun, når der sendes en værdi til den.

Under oprettelsen af en skabelon til en brugerdefineret PAM-udbyder er det muligt at definere udbyder- og kontoegenskaber og angive, om de er obligatoriske eller valgfrie.

Parametrene i handlingsscriptet for den ovennævnte udbyder kan struktureres som følger, hvor hver af dem matcher skabelonens egenskaber for den brugerdefinerede PAM-udbyder, og standardværdier tildeles de valgfrie parametre.

````
```powershell
[CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [string]$IdentityProviderEndpoint,

    [Parameter(Mandatory)]
    [string]$IdentityProviderEndpointUserName,

    [Parameter(Mandatory)]
    [securestring]$IdentityProviderEndpointPassword,

    [Parameter()]
    [string]$Instance = '.',

    [Parameter()]
    [int]$Port = 1433
)
Write-Host "Using the instance of [$Instance] and the port of [$Port] here in the code somewhere."
````

Hvis dette PowerShell-script udføres uden for den brugerdefinerede PAM-udbyder, uden at de valgfrie parametre er angivet, fungerer det som forventet og bruger standardværdierne.

```powershell
.\actionscript.ps1 -IdentityProviderEndpoint 'hostname' -IdentityProviderEndpointUserName 'admin' -IdentityProviderEndpointPassword (ConvertTo-SecureString -String 'P@$$word' -AsPlainText -Force)
```

Når skabelonen til den brugerdefinerede PAM-udbyder opbygges, og der kun angives de obligatoriske parametre med tillid til scriptets interne standardværdier, tilsidesætter brugerdefinerede PAM-udbydere disse standarder.

Når brugerdefinerede PAM-udbydere udfører et handlingsscript, sender de altid værdier til alle parametre. I tilfælde hvor der ikke er defineret en værdi, sender brugerdefinerede PAM-udbydere en `null`-værdi, eller hvis parameteren er af heltalstypen, en `0`-værdi.

For at omgå dette bør standardværdier ikke angives i scriptparametrene. I stedet bør betingelser i scriptet bestemme standardværdierne.

```powershell
[CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [string]$IdentityProviderEndpoint,

    [Parameter(Mandatory)]
    [string]$IdentityProviderEndpointUserName,

    [Parameter(Mandatory)]
    [securestring]$IdentityProviderEndpointPassword,

    [Parameter()]
    [string]$Instance,

    [Parameter()]
    [int]$Port
)
if (!$Instance) { $Instance = '.' }
if (!$Port) { $Port = 1433 }
Write-Output "Using the instance of [$Instance] and the port of [$Port] here in the code somewhere."
```

Selvom det generelt ikke anbefales af PowerShell-bedste praksis, er angivelse af standardparameterværdier på denne måde et krav for brugerdefinerede PAM-udbydere.

### Håndtering af output

Handlingsscripts udføres i sidste ende i miljøet for brugerdefinerede PAM-udbydere. Det output, de genererer, fortolkes, gemmes og/eller vises i webgrænsefladen i Devolutions Server.

For at sikre at handlingsscripts producerer det forventede output, anbefales det, at de returnerer output på kun fire måder:

* Brug nøgleordet `throw` til at generere en afsluttende fejl via fejlstrømmen.
* Brug cmdlet'en `Write-Error` til at generere en ikke-afsluttende fejl via fejlstrømmen.
* Brug cmdlet'en `Write-Output` til at returnere oplysninger til outputstrømmen.
* Send oplysninger direkte til outputstrømmen.

Nedenfor er eksempler på handlingsscripts og de tilsvarende resultater i funktionen ***Test script*** i området ***Resultater*** for brugerdefinerede PAM-udbydere.

```powershell
Write-Verbose -Message 'This is a verbose message.'
Write-Information -MessageData 'information action'
Write-Output 'output stream here'
Write-Host 'write-host output here'
Write-Error 'error'
```

```powershell
Write-Verbose -Message 'This is a verbose message.'
Write-Information -MessageData 'information action'
Write-Output 'output stream here'
'output stream here directly'
Write-Host 'write-host output here'
```

{% hint style="success" %}
For at sikre at et handlingsscript returnerer oplysninger til den brugerdefinerede PAM-udbyder, anbefales det **ikke** at bruge `Write-Verbose`, `Write-Information` eller `Write-Host`.
{% endhint %}

### Kontoopdagelse

{% embed url="<https://youtu.be/IIx5xQ2iohE?t=142>" %}

Den første handling, som en brugerdefineret PAM-udbyder udfører, er handlingen til kontoopdagelse, som opregner kontiene på en identitetsudbyder og udfylder databasen i Devolutions Server til efterfølgende administration.

* **Påkrævede inputparametre**

  Handlingsscriptet til kontoopdagelse er relativt ligetil, da det primært kræver almindelige slutpunktsscriptparametre. Der er ikke brug for yderligere parametre, medmindre den specifikke identitetsudbyder kræver det.
* **Påkrævet output**

  Hvert handlingsscript til kontoopdagelse skal returnere et eller flere objekter af typen `PSCustomObject`, hvor hvert objekt repræsenterer en enkelt konto og indeholder tre egenskaber: `id`, `username` og `secret`.

  * Egenskaben `id` skal fungere som en entydig identifikator for hver konto. Selvom denne identifikator typisk er et brugernavn, kan den være en hvilken som helst entydig identifikator for kontoen.
  * Egenskaben `username` bør fungere som en etiket for hver konto. Denne etiket er generelt et brugernavn, men kan være en hvilken som helst identifikator, der repræsenterer kontoen.
  * Egenskaben `secret` er adgangskodeidentifikatoren. Den kan have form af en krypteret streng eller en adgangskode i klartekst, som derefter bruges til at sammenligne med andre hemmeligheder via heartbeat-handlingen.

  Hvis identitetsudbyderens kode ikke returnerer dette objekt med de angivne egenskaber, er det nødvendigt at konvertere det ved at oprette et `PSCustomObject`. Nedenfor er et eksempel på, hvordan det gøres.

  ```powershell
  ## Some code that returns an object for each account.
  $accounts = Get-AccountFromIdentityProvider

  ## Create custom fields for Select-Object to return the id and username properties instead of name, and name
  $selectProps = @(
      @{'n'='id';e={$_.name}} ## "convert" the name property from the account to id
      @{'n'='username';e={$_.name}} ## "convert" the name property from the account to username
      @{'n'='secret';e={$_.password_hash}} ## "convert" the password_hash property from the account to secret
  )

  ## Pass each account to Select-Object to return the property names.
  $accounts | Select-Object -Property $selectProps
  ```

  Når der oprettes en skabelon til en brugerdefineret PAM-udbyder, og den testes (instruktioner nedenfor) med en [konfiguration til kontoopdagelse](/pam/da/pam-with-devolutions-server/account-discovery-configurations.md), udfyldes felterne ***Brugernavn*** og ***Entydig identifikator*** med egenskabsværdierne for egenskaberne `username` og `id` fra handlingsscriptet.

### Heartbeat

{% embed url="<https://youtu.be/IIx5xQ2iohE?t=374>" %}

Efter at handlingen til kontoopdagelse har hentet alle konti fra identitetsudbyderen, startes en heartbeat-handling. Den læser den aktuelle adgangskodeværdi for en konto og sammenligner den med den værdi, der er gemt af PAM. Hvis de to værdier afviger, registreres en ændring.

* **Påkrævede inputparametre**

  Ud over de almindelige slutpunktsparametre skal et handlingsscript til heartbeat indeholde mindst to parametre: `username` og `secret`, som henholdsvis er en `string` og en `securestring`.
* **Påkrævet output**

  Et handlingsscript til heartbeat returnerer et enkelt boolesk objekt (`$true` eller `$false`) for at angive, om den aktuelle adgangskodeværdi for en konto stemmer overens med den værdi, som PAM-modulerne kender.

Nedenfor er et eksempel på et handlingsscript til heartbeat.

```powershell
[CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [string]$IdentityProviderEndpoint,

    [Parameter(Mandatory)]
    [string]$IdentityProviderEndpointUserName,

    [Parameter(Mandatory)]
    [securestring]$IdentityProviderEndpointPassword,

    [Parameter(Mandatory)]
    [string]$UserName,

    [Parameter(Mandatory)]
    [securestring]$Secret
)

## Code to query for a single user account here. Let's say it is $account.

## Convert the password to a secure string.
$secPw = $account.password | ConvertTo-SecureString -AsPlainText -Force

## Compare the results.
$secPw -eq $Secret
```

### Rotation af adgangskoder

{% embed url="<https://youtu.be/IIx5xQ2iohE?t=488>" %}

Når brugerdefinerede PAM-udbydere udfører heartbeat-handlingen, og handlingsscriptet returnerer værdien `$false`, hvilket angiver, at den nye adgangskode afviger fra adgangskoden på identitetsudbyderen, udløses handlingen til rotation af adgangskoder.

Denne handling er ansvarlig for at synkronisere adgangskoder, der er genereret af PAM-modulet, med identitetsudbyderen.

* **Påkrævede inputparametre**

  Ud over de almindelige slutpunktsparametre skal et handlingsscript til rotation af adgangskoder indeholde én parameter: `NewPassword`. Det er en `securestring`-parameter, som lader brugerdefinerede PAM-udbydere sende den nye adgangskodeværdi til handlingsscriptet.
* **Påkrævet output**

  Scriptet til rotation af adgangskoder bør kun returnere den booleske værdi `$true`, hvis ændringen af adgangskoden lykkes.

Nedenfor er et grundlæggende eksempel på et handlingsscript til rotation af adgangskoder.

```powershell
[CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [string]$IdentityProviderEndpoint,

    [Parameter(Mandatory)]
    [string]$IdentityProviderEndpointUserName,

    [Parameter(Mandatory)]
    [securestring]$IdentityProviderEndpointPassword,

    [Parameter(Mandatory)]
    [securestring]$NewPassword
)

## $result = Dowhatevertochangethepasword
if ($Result) {
    $True
} else {
    Write-Error "Failed to update secret."
}
```


---

# 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/pam/da/knowledge-base/knowledge-base-articles/custom-pam-provider-action-scripts-in-devolutions-server.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.
