Legg til full struktur og maler

This commit is contained in:
Ole Andre Werdal 2026-06-18 11:16:46 +02:00
parent c89e9ca909
commit e066bbee66
40 changed files with 519 additions and 0 deletions

21
.editorconfig Normal file
View file

@ -0,0 +1,21 @@
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 4
[*.{ps1,psm1,psd1}]
indent_size = 4
[*.sh]
indent_size = 2
[*.py]
indent_size = 4
[*.{yml,yaml,json,md}]
indent_size = 2

30
.gitignore vendored Normal file
View file

@ -0,0 +1,30 @@
# Hemmeligheter - skal ALDRI committes
*.secret
*.key
*.pem
*.pfx
.env
.env.*
secrets.*
credentials.*
# Logger og midlertidige filer
*.log
*.tmp
tmp/
out/
# PowerShell
*.psd1.bak
# Python
__pycache__/
*.pyc
.venv/
venv/
# OS / editor
.DS_Store
Thumbs.db
.vscode/
.idea/

8
CHANGELOG.md Normal file
View file

@ -0,0 +1,8 @@
# Endringslogg
Alle vesentlige endringer i scriptbiblioteket noteres her (nyeste øverst).
Format: `ÅÅÅÅ-MM-DD [plattform] kort beskrivelse (initialer)`
## Ikke utgitt
- 2026-06-18 [struktur] Opprettet biblioteket med mappestruktur, maler og eksempel (W-tek)

61
CONTRIBUTING.md Normal file
View file

@ -0,0 +1,61 @@
# Bidragsguide W-tek Scriptbibliotek
Følg disse konvensjonene så biblioteket holder seg ryddig, trygt og enkelt å bruke.
## 1. Navnekonvensjoner
| Språk | Konvensjon | Eksempel |
|--------------|------------------------------------|-----------------------------------|
| PowerShell | `Verb-Noun.ps1` (godkjent verb, PascalCase) | `Get-DiskSpaceReport.ps1` |
| Bash/Shell | `kebab-case.sh` | `rotate-log-files.sh` |
| Python | `snake_case.py` | `export_user_report.py` |
| Batch/CMD | `kebab-case.cmd` | `map-network-drives.cmd` |
- Bruk **godkjente PowerShell-verb** (`Get-Verb`): Get, Set, New, Remove, Invoke, Update, Enable, Disable osv.
- Navnet skal beskrive hva scriptet gjør, ikke hvilket system (systemet framgår av mappen).
## 2. Mappeplassering
Plattform på toppnivå, funksjon som undermappe (se `README.md`).
- Enkelt script = én fil i riktig mappe.
- Sammensatt script (flere filer, moduler, ressurser) = egen undermappe med `README.md` basert på `templates/SCRIPT_README_TEMPLATE.md`.
## 3. Obligatorisk header
Hvert script **skal** ha en utfylt header (bruk malen for språket). Minimumsfelt:
- Kort beskrivelse (synopsis) og en lengre beskrivelse
- Alle parametere/argumenter dokumentert
- Minst ett kjøre-eksempel
- **Forfatter**, **opprettet-dato**, **versjon**
- **Plattform/krav** (f.eks. PowerShell 5.1/7, moduler, rettigheter)
- **Endringslogg** (dato, versjon, hva og hvem)
- **Tags** for søk (f.eks. `m365, entra, rapportering`)
## 4. Sikkerhet (viktig)
- **Ingen hemmeligheter i koden eller historikken.** Aldri passord, API-nøkler, tokens, sertifikater eller kundedata.
- Hent hemmeligheter via parametere, miljøvariabler eller en hemmelighetsløsning (f.eks. Windows Credential Manager, Azure Key Vault).
- Spesielt for **NinjaRMM / SentinelOne / Cove / Graph**: API-nøkler skal aldri committes. Bruk plassholdere som `$env:S1_API_TOKEN`.
- Skulle en hemmelighet ved et uhell bli committet: rull nøkkelen umiddelbart og gi beskjed historikken må renses.
## 5. Kvalitet og kjøring
- Skriv **idempotente** script der det er mulig.
- Endringsscript skal støtte tørrkjøring: PowerShell `-WhatIf`/`-Confirm`, Bash/Python en `--dry-run`-flagg.
- Håndter feil eksplisitt (`try/catch`, `set -euo pipefail`, `try/except`) og gi tydelige exit-koder.
- Logg det som er relevant, men aldri hemmeligheter.
## 6. Git-arbeidsflyt
1. Lag en branch: `feature/<kort-beskrivelse>` eller `fix/<kort-beskrivelse>`.
2. Commit-melding: kort og beskrivende, gjerne `[plattform] handling` f.eks. `[m365] legg til lisensrapport`.
3. Åpne en **pull request**. Minst én kollega gjennomgår før merge (firekontroll relevant for ISO 9001/27001).
4. Oppdater `CHANGELOG.md` ved større tillegg/endringer.
## 7. Testkrav
Før merge skal scriptet være testet. Beskriv i PR-en (eller scriptets README):
- Hva som er testet
- Hvilken plattform/versjon det er testet på
- Eventuelle forutsetninger/begrensninger

10
_shared/README.md Normal file
View file

@ -0,0 +1,10 @@
# Delte ressurser
Gjenbrukbar kode og ressurser på tvers av plattformene.
**Undermapper**
- `modules/` PowerShell-moduler (.psm1) til import i flere script
- `functions/` frittstående hjelpefunksjoner/snutter
- `assets/` maler, ikoner, konfig-eksempler (uten hemmeligheter)
Legg felles logikk her i stedet for å duplisere den i hvert script.

1
_shared/assets/.gitkeep Normal file
View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

1
_shared/modules/.gitkeep Normal file
View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

10
cove/README.md Normal file
View file

@ -0,0 +1,10 @@
# Cove (Cove Data Protection)
Script for overvåking og rapportering av Cove-backup (N-able).
**Undermapper**
- `backup-jobs/` jobbstyring og konfigurasjon
- `monitoring/` status, feilede jobber, varsling
- `reporting/` backup- og gjenopprettingsrapporter
SIKKERHET: API-/innloggingslegitimasjon leveres som miljøvariabler/parametere aldri i koden.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

1
cove/monitoring/.gitkeep Normal file
View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

1
cove/reporting/.gitkeep Normal file
View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

4
docs/README.md Normal file
View file

@ -0,0 +1,4 @@
# Dokumentasjon
Overordnet dokumentasjon for scriptbiblioteket: konvensjoner, beslutninger og
eventuelle driftsnotater. Se også `../README.md` og `../CONTRIBUTING.md`.

14
microsoft-365/README.md Normal file
View file

@ -0,0 +1,14 @@
# Microsoft 365
Script mot M365-tjenester via PowerShell-moduler (Microsoft.Graph, ExchangeOnlineManagement,
MicrosoftTeams, PnP.PowerShell) eller Graph API.
**Undermapper**
- `entra-id/` brukere, grupper, lisenser, betinget tilgang
- `exchange-online/` postbokser, regler, distribusjonslister
- `teams/` team, policyer, kanaler
- `sharepoint-onedrive/` nettsteder, deling, lagring
- `security-compliance/` Defender, revisjon, DLP, samsvar
- `reporting/` lisens-, bruks- og sikkerhetsrapporter
SIKKERHET: App-registreringer/secrets og tokens skal aldri committes bruk parametere/miljøvariabler.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

12
ninjarmm/README.md Normal file
View file

@ -0,0 +1,12 @@
# NinjaRMM
Script som distribueres og kjøres via NinjaRMM på endepunkter/servere.
**Undermapper**
- `automations/` planlagte/utløste automasjoner
- `monitoring/` tilstandssjekker som rapporterer tilbake til Ninja
- `software-deployment/` installasjon/oppdatering av programvare
- `reporting/` uttrekk og statusrapporter
Merk: Ninja kjører ofte script som SYSTEM. Test rettigheter og exit-koder nøye.
API-nøkler/legitimasjon hentes via Ninja sine egne variabler eller miljøvariabler aldri hardkodet.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

11
sentinelone/README.md Normal file
View file

@ -0,0 +1,11 @@
# SentinelOne
Script for utrulling, respons og rapportering mot SentinelOne, inkl. API-bruk.
**Undermapper**
- `deployment/` agent-installasjon/avinstallasjon
- `response-actions/` isolering, opprydding, respons
- `reporting/` trussel-/agent-rapporter
- `api/` gjenbrukbare API-kall (Mgmt API)
SIKKERHET: `S1_API_TOKEN` og console-URL leveres som miljøvariabler/parametere aldri i koden.

1
sentinelone/api/.gitkeep Normal file
View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1,37 @@
# <Scriptnavn>
Kort beskrivelse av hva scriptet/mappen løser.
## Formål
Hva scriptet gjør og når du bruker det.
## Forutsetninger
- Plattform/versjon: <f.eks. PowerShell 7, Microsoft.Graph-modul>
- Rettigheter: <f.eks. Global Reader, lokal admin>
- Hemmeligheter: <hvilke, og hvordan de leveres f.eks. $env:API_TOKEN>
## Bruk
```
<eksempelkommando>
```
## Parametere
| Parameter | Påkrevd | Beskrivelse |
|-----------|---------|-------------|
| `...` | Ja/Nei | ... |
## Eksempler
```
<eksempel 1>
<eksempel 2>
```
## Testet
- Dato: ÅÅÅÅ-MM-DD
- Testet på: <miljø/versjon>
- Forfatter: <initialer>
## Endringslogg
| Dato | Versjon | Endring | Av |
|------|---------|---------|----|
| ÅÅÅÅ-MM-DD | 1.0.0 | Første versjon | <init> |

69
templates/template.ps1 Normal file
View file

@ -0,0 +1,69 @@
<#
.SYNOPSIS
Kort, én-setnings beskrivelse av hva scriptet gjør.
.DESCRIPTION
Lengre beskrivelse: hva scriptet løser, hvordan det fungerer, og eventuelle
forutsetninger eller bivirkninger man bør være klar over.
.PARAMETER Eksempelparameter
Beskriv hva parameteren styrer, og gyldige verdier.
.PARAMETER WhatIf
Tørrkjør uten å gjøre endringer (støttes via SupportsShouldProcess).
.EXAMPLE
.\Verb-Noun.ps1 -Eksempelparameter "verdi"
Beskriv hva eksempelet gjør.
.EXAMPLE
.\Verb-Noun.ps1 -Eksempelparameter "verdi" -WhatIf
Viser hva som ville blitt gjort, uten å endre noe.
.NOTES
Forfatter : Fornavn Etternavn (initialer)
Opprettet : ÅÅÅÅ-MM-DD
Versjon : 1.0.0
Plattform : Windows Server 2019/2022 | M365 | NinjaRMM | SentinelOne | Cove
Krav : PowerShell 5.1+ (eller 7+), moduler: <f.eks. Microsoft.Graph>
Rettigheter : <f.eks. lokal admin / Global Reader>
Tags : tag1, tag2, tag3
Endringslogg:
ÅÅÅÅ-MM-DD 1.0.0 Første versjon (initialer)
SIKKERHET: Aldri hemmeligheter i koden. Bruk parametere eller miljøvariabler,
f.eks. $env:API_TOKEN.
#>
#Requires -Version 5.1
# #Requires -Modules Microsoft.Graph # avkommenter ved behov
[CmdletBinding(SupportsShouldProcess = $true)]
param(
[Parameter(Mandatory = $true)]
[string] $Eksempelparameter
)
begin {
$ErrorActionPreference = 'Stop'
Set-StrictMode -Version Latest
Write-Verbose "Starter $($MyInvocation.MyCommand.Name)"
}
process {
try {
if ($PSCmdlet.ShouldProcess($Eksempelparameter, "Beskriv handlingen")) {
# --- Hovedlogikk her ---
Write-Output "Kjører mot: $Eksempelparameter"
}
}
catch {
Write-Error "Feilet: $($_.Exception.Message)"
exit 1
}
}
end {
Write-Verbose "Ferdig."
}

58
templates/template.py Normal file
View file

@ -0,0 +1,58 @@
#!/usr/bin/env python3
"""Kort, én-setnings beskrivelse av hva scriptet gjør.
Lengre beskrivelse av formål, virkemåte og forutsetninger.
Bruk:
python snake_case.py --eksempel "verdi" [--dry-run]
Eksempel:
python snake_case.py --eksempel "verdi" --dry-run
Metadata:
Forfatter : Fornavn Etternavn (initialer)
Opprettet : ÅÅÅÅ-MM-DD
Versjon : 1.0.0
Plattform : <tjeneste / API>
Krav : Python 3.9+, pakker: <f.eks. requests, msal>
Tags : tag1, tag2
Endringslogg:
ÅÅÅÅ-MM-DD 1.0.0 Første versjon (initialer)
SIKKERHET: Aldri hemmeligheter i koden. Les dem fra miljøvariabler,
f.eks. os.environ["API_TOKEN"].
"""
from __future__ import annotations
import argparse
import logging
import sys
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
log = logging.getLogger(__name__)
def parse_args() -> argparse.Namespace:
p = argparse.ArgumentParser(description=__doc__.splitlines()[0])
p.add_argument("--eksempel", required=True, help="Beskriv parameteren.")
p.add_argument("--dry-run", action="store_true", help="Tørrkjør uten endringer.")
return p.parse_args()
def main() -> int:
args = parse_args()
try:
if args.dry_run:
log.info("[dry-run] Ville kjørt mot: %s", args.eksempel)
return 0
# --- Hovedlogikk her ---
log.info("Kjører mot: %s", args.eksempel)
return 0
except Exception as exc: # noqa: BLE001
log.error("Feilet: %s", exc)
return 1
if __name__ == "__main__":
sys.exit(main())

51
templates/template.sh Normal file
View file

@ -0,0 +1,51 @@
#!/usr/bin/env bash
# =============================================================================
# Navn : kebab-case.sh
# Synopsis : Kort, én-setnings beskrivelse av hva scriptet gjør.
# Beskrivelse: Lengre beskrivelse av formål og virkemåte.
#
# Bruk : ./kebab-case.sh [--dry-run] <argument>
# Eksempel : ./kebab-case.sh --dry-run /sti/til/noe
#
# Forfatter : Fornavn Etternavn (initialer)
# Opprettet : ÅÅÅÅ-MM-DD
# Versjon : 1.0.0
# Plattform : Linux/macOS | <tjeneste>
# Krav : bash 4+, <evt. verktøy: jq, curl>
# Tags : tag1, tag2
#
# Endringslogg:
# ÅÅÅÅ-MM-DD 1.0.0 Første versjon (initialer)
#
# SIKKERHET: Aldri hemmeligheter i koden. Bruk miljøvariabler, f.eks. $API_TOKEN.
# =============================================================================
set -euo pipefail
DRY_RUN=0
usage() {
grep '^# ' "$0" | sed 's/^# \{0,1\}//'
exit "${1:-0}"
}
# --- Argumenthåndtering ---
while [ $# -gt 0 ]; do
case "$1" in
--dry-run) DRY_RUN=1; shift ;;
-h|--help) usage 0 ;;
*) ARG="$1"; shift ;;
esac
done
: "${ARG:?Mangler argument. Se --help}"
main() {
if [ "$DRY_RUN" -eq 1 ]; then
echo "[dry-run] Ville kjørt mot: $ARG"
return 0
fi
# --- Hovedlogikk her ---
echo "Kjører mot: $ARG"
}
main "$@"

12
windows-server/README.md Normal file
View file

@ -0,0 +1,12 @@
# Windows Server
Script for drift, vedlikehold og herding av Windows Server (2016/2019/2022).
**Undermapper**
- `maintenance/` opprydding, diskvedlikehold, oppdateringer, omstart-rutiner
- `monitoring/` helsesjekker, tjenestestatus, ytelse
- `security-hardening/` baseline/herding, GPO, lokal sikkerhetspolicy
- `deployment/` rolle-/funksjonsinstallasjon, konfigurasjon
- `reporting/` inventar- og statusrapporter
Hovedspråk: PowerShell. Se `../templates/template.ps1`.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1,87 @@
<#
.SYNOPSIS
Lager en rapport over diskbruk en eller flere Windows-servere.
.DESCRIPTION
Henter ledig og total kapasitet for alle faste disker via CIM, og markerer
volumer som har mindre ledig plass enn en gitt terskel. Resultatet kan vises
i konsollet eller eksporteres til CSV. Skriveoperasjonen (CSV) støtter -WhatIf.
.PARAMETER ComputerName
En eller flere maskiner å sjekke. Standard er den lokale maskinen.
.PARAMETER ThresholdPercent
Terskel for ledig plass i prosent. Volumer under terskelen flagges. Standard 15.
.PARAMETER CsvPath
Valgfri sti for CSV-eksport. Utelates for kun konsoll-utskrift.
.EXAMPLE
.\Get-DiskSpaceReport.ps1
Viser diskbruk for den lokale serveren med standardterskel (15 %).
.EXAMPLE
.\Get-DiskSpaceReport.ps1 -ComputerName SRV01,SRV02 -ThresholdPercent 10 -CsvPath C:\Temp\disk.csv
Sjekker to servere med 10 % terskel og eksporterer til CSV.
.NOTES
Forfatter : W-tek Drift (WT)
Opprettet : 2026-06-18
Versjon : 1.0.0
Plattform : Windows Server 2016/2019/2022
Krav : PowerShell 5.1+, WinRM for fjernkjøring
Rettigheter : Lokal admin målmaskinene
Tags : windows-server, disk, vedlikehold, rapportering
Endringslogg:
2026-06-18 1.0.0 Første versjon (WT)
#>
#Requires -Version 5.1
[CmdletBinding(SupportsShouldProcess = $true)]
param(
[string[]] $ComputerName = $env:COMPUTERNAME,
[ValidateRange(1, 99)]
[int] $ThresholdPercent = 15,
[string] $CsvPath
)
begin {
$ErrorActionPreference = 'Stop'
Set-StrictMode -Version Latest
$results = [System.Collections.Generic.List[object]]::new()
}
process {
foreach ($computer in $ComputerName) {
try {
$disks = Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3" -ComputerName $computer
foreach ($disk in $disks) {
$freePct = [math]::Round(($disk.FreeSpace / $disk.Size) * 100, 1)
$results.Add([pscustomobject]@{
Server = $computer
Drive = $disk.DeviceID
FreeGB = [math]::Round($disk.FreeSpace / 1GB, 1)
TotalGB = [math]::Round($disk.Size / 1GB, 1)
FreePercent = $freePct
BelowThreshold = $freePct -lt $ThresholdPercent
})
}
}
catch {
Write-Warning "Kunne ikke hente data fra ${computer}: $($_.Exception.Message)"
}
}
}
end {
$results | Sort-Object FreePercent | Format-Table -AutoSize
if ($CsvPath) {
if ($PSCmdlet.ShouldProcess($CsvPath, "Skriv CSV-rapport")) {
$results | Export-Csv -Path $CsvPath -NoTypeInformation -Encoding UTF8
Write-Output "Rapport skrevet til $CsvPath"
}
}
}

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.

View file

@ -0,0 +1 @@
# Behold mappen i git. Slett denne fila naar mappen faar innhold.