-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoffboarding.ps1
More file actions
207 lines (168 loc) · 7.93 KB
/
offboarding.ps1
File metadata and controls
207 lines (168 loc) · 7.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
# Importer nødvendige moduler
Import-Module ActiveDirectory
Import-Module Az.Accounts
Import-Module Az.Storage
# Last inn nødvendige assemblies for GUI
[void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
[void][System.Reflection.Assembly]::LoadWithPartialName('System.Drawing')
# Funksjon for å generere potensielle brukernavn basert på navnet
function Generate-PossibleUsernames {
param (
[string]$firstName,
[string]$lastName
)
# Fjern spesialtegn og gjør om til små bokstaver
$firstNameClean = $firstName.Replace("ø", "o").Replace("æ", "ae").Replace("å", "a").Replace(" ", "").ToLower()
$lastNameClean = $lastName.Replace("ø", "o").Replace("æ", "ae").Replace("å", "a").Replace(" ", "").ToLower()
$usernameList = @()
# Forsøk 1: Første 2 bokstaver av fornavn + første 2 bokstaver av etternavn
if ($firstNameClean.Length -ge 2 -and $lastNameClean.Length -ge 2) {
$username1 = $firstNameClean.Substring(0,2) + $lastNameClean.Substring(0,2)
$usernameList += $username1
}
# Forsøk 2: Første 2 bokstaver av fornavn + første 3 bokstaver av etternavn
if ($firstNameClean.Length -ge 2 -and $lastNameClean.Length -ge 3) {
$username2 = $firstNameClean.Substring(0,2) + $lastNameClean.Substring(0,3)
$usernameList += $username2
}
return $usernameList
}
# Opprett form
$form = New-Object System.Windows.Forms.Form
$form.Text = "Offboard Bruker - Lukas Stiftelsen"
$form.Size = New-Object System.Drawing.Size(300,150)
$form.StartPosition = "CenterScreen"
# Opprett label for navn
$nameLabel = New-Object System.Windows.Forms.Label
$nameLabel.Location = New-Object System.Drawing.Size(10,20)
$nameLabel.Size = New-Object System.Drawing.Size(80,20)
$nameLabel.Text = "Navn:"
$form.Controls.Add($nameLabel)
# Opprett tekstboks for navn
$nameTextBox = New-Object System.Windows.Forms.TextBox
$nameTextBox.Location = New-Object System.Drawing.Size(100,20)
$nameTextBox.Size = New-Object System.Drawing.Size(180,20)
$form.Controls.Add($nameTextBox)
# Opprett knapp for offboarding
$offboardButton = New-Object System.Windows.Forms.Button
$offboardButton.Location = New-Object System.Drawing.Size(100,60)
$offboardButton.Size = New-Object System.Drawing.Size(100,30)
$offboardButton.Text = "Offboard"
$form.Controls.Add($offboardButton)
# Legg til klikk-hendelse for knappen
$offboardButton.Add_Click({
# Hent navn fra formen
$name = $nameTextBox.Text.Trim()
# Sjekk om navn er fylt ut
if ([string]::IsNullOrWhiteSpace($name)) {
[System.Windows.Forms.MessageBox]::Show("Vennligst fyll ut navnet.")
return
}
# Splitt navn til array av navn
$names = $name -split " "
# Tildel fornavn (første ord)
$firstName = $names[0]
# Sjekk om minst fornavn og etternavn er oppgitt
if ($names.Length -ge 2) {
$lastName = $names[$names.Length - 1]
} else {
# Hvis kun ett navn er oppgitt
[System.Windows.Forms.MessageBox]::Show("Vennligst oppgi både fornavn og etternavn.")
return
}
# Generer mulige brukernavn basert på samme logikk som opprettingsscriptet
$possibleUsernames = Generate-PossibleUsernames -firstName $firstName -lastName $lastName
# Finn brukeren i AD basert på mulige brukernavn
$user = $null
foreach ($username in $possibleUsernames) {
$user = Get-ADUser -Filter { SamAccountName -eq $username } -Properties *
if ($user) {
break
}
}
if (-not $user) {
[System.Windows.Forms.MessageBox]::Show("Kan ikke finne brukeren $name i Active Directory. Vennligst sjekk at navnet er korrekt eller kontakt administrator.")
return
}
# Fortsett med offboarding-prosessen
try {
# Deaktiver brukerkontoen
Disable-ADAccount -Identity $user -ErrorAction Stop
# Output user's distinguished name for verification
Write-Host "Brukerens DN: $($user.DistinguishedName)"
# Fjern brukeren fra alle grupper unntatt "Domain Users"
$groups = Get-ADPrincipalGroupMembership -Identity $user -ErrorAction Stop
foreach ($group in $groups) {
if ($group.Name -ne "Domain Users") {
Remove-ADGroupMember -Identity $group -Members $user -Confirm:$false -ErrorAction Stop
}
}
# Finn "Deaktiverte brukere" OU dynamisk
$disabledUsersOU = Get-ADOrganizationalUnit -Filter { Name -eq "Deaktiverte brukere" }
if ($disabledUsersOU) {
# Flytt brukeren til "Deaktiverte brukere" OU
Move-ADObject -Identity $user.DistinguishedName -TargetPath $disabledUsersOU.DistinguishedName -ErrorAction Stop
} else {
throw "Mål-OU 'Deaktiverte brukere' ble ikke funnet i domenet."
}
# Azure Storage informasjon
$storageAccountName = "lukstoracc" # Sett til ditt storage account navn
$resourceGroupName = "Lukas-Norway-RG" # Sett til ditt resource group navn
$shareName = "fslogix" # Sett til ditt fileshare navn
# Koble til Azure
Connect-AzAccount
# Test access to the storage account
$storageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName -ErrorAction Stop
if (-not $storageAccount) {
throw "Kan ikke få tilgang til lagringskontoen $storageAccountName."
}
# Hent Storage Account nøkkel
$storageKey = (Get-AzStorageAccountKey -ResourceGroupName $resourceGroupName -Name $storageAccountName)[0].Value
# Opprett en lagringskontekst
$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageKey
# Monter fileshare som PSDrive
# $psDriveName = "FSLogixShare"
New-PSDrive -Name "FSLogixShare" -PSProvider FileSystem -Root "\\$($storageAccountName).file.core.windows.net\$shareName" -Credential (New-Object PSCredential -ArgumentList "Azure\$storageAccountName", (ConvertTo-SecureString -String $storageKey -AsPlainText -Force))
# Finn .vhd-filer for brukeren
$vhdFiles = Get-ChildItem -Path "FSLogixShare:\" -Recurse -Filter "*.vhd*" | Where-Object { $_.Name -like "*$user*" }
if ($vhdFiles.Count -gt 0) {
foreach ($vhdFile in $vhdFiles) {
# Close any open handles to the file
# Note: Closing open file handles can be risky; ensure it's safe to do so.
$openFiles = Get-SmbOpenFile | Where-Object { $_.Path -like "*$($vhdFile.FullName)*" }
foreach ($openFile in $openFiles) {
Close-SmbOpenFile -FileId $openFile.FileId -Force
}
# Implement a retry mechanism
$maxRetries = 1
$retryDelay = 10 # seconds
$attempt = 0
$deleted = $false
while (-not $deleted -and $attempt -lt $maxRetries) {
try {
Remove-Item -Path $vhdFile.FullName -Force -ErrorAction Stop
$deleted = $true
} catch {
$attempt++
Start-Sleep -Seconds $retryDelay
}
}
if (-not $deleted) {
throw "Could not delete file $($vhdFile.FullName) after $maxRetries attempts."
}
}
[System.Windows.Forms.MessageBox]::Show("Brukeren ${name} er offboardet, og tilhørende .vhd-filer er slettet.")
} else {
[System.Windows.Forms.MessageBox]::Show("Brukeren ${name} er offboardet, men ingen .vhd-filer ble funnet.")
}
# Fjern PSDrive
Remove-PSDrive -Name "FSLogixShare"
# Lukk formen
$form.Close()
}
catch {
[System.Windows.Forms.MessageBox]::Show("Feil ved offboarding av brukeren ${name}: $($_.Exception.Message)")
}
})
# Vis formen
$form.ShowDialog()