From dbf3e118fd4c6a25bbe052c49bce42830b15006d Mon Sep 17 00:00:00 2001 From: Gramzon Date: Mon, 27 Jan 2025 15:50:09 +0100 Subject: [PATCH] new push --- OU/CreateGroups.ps1 | 14 ++-- OU/createOU.ps1 | 38 ++++----- OU/localgroups.ps1 | 194 +++++++++++++++++++++++++++++++++++++++++++ OU/setup.ps1 | 197 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 417 insertions(+), 26 deletions(-) create mode 100644 OU/localgroups.ps1 create mode 100644 OU/setup.ps1 diff --git a/OU/CreateGroups.ps1 b/OU/CreateGroups.ps1 index ceb24e7..cf2f4d9 100644 --- a/OU/CreateGroups.ps1 +++ b/OU/CreateGroups.ps1 @@ -10,7 +10,7 @@ New-ADGroup -Name "IT Support" ` -GroupScope Global ` -GroupCategory Security ` - -Path "OU=Groups,DC=InfraIT,DC=sec" + -Path "OU=Groups,DC=RohanIT,DC=sec" ### Deleting a Group @@ -28,19 +28,19 @@ Remove-ADGroup -Identity "IT Support" -Confirm:$false $groups = @( @{ Name = "IT Support" - Path = "OU=IT,OU=Groups,DC=InfraIT,DC=sec" + Path = "OU=IT,OU=Groups,DC=RohanIT,DC=sec" Scope = "Global" Category = "Security" }, @{ Name = "HR Team" - Path = "OU=HR,OU=Groups,DC=InfraIT,DC=sec" + Path = "OU=HR,OU=Groups,DC=RohanIT,DC=sec" Scope = "Global" Category = "Security" }, @{ Name = "Finance Users" - Path = "OU=Finance,OU=Groups,DC=InfraIT,DC=sec" + Path = "OU=Finance,OU=Groups,DC=RohanIT,DC=sec" Scope = "Global" Category = "Security" } @@ -202,14 +202,14 @@ function Remove-CustomADGroupMember { $groups = @( @{ Name = "IT Support" - Path = "OU=IT,OU=Groups,DC=InfraIT,DC=sec" + Path = "OU=IT,OU=Groups,DC=RohanIT,DC=sec" Scope = "Global" Category = "Security" Members = @("John.Doe", "Jane.Smith", "Help Desk") }, @{ Name = "HR Team" - Path = "OU=HR,OU=Groups,DC=InfraIT,DC=sec" + Path = "OU=HR,OU=Groups,DC=RohanIT,DC=sec" Scope = "Global" Category = "Security" Members = @("Sarah.Johnson", "HR Managers") @@ -240,4 +240,4 @@ Add-CustomADGroupMember -GroupName "HR Team" -Members @("New.Employee") #5. Handling errors at each step #6. Providing clear feedback for all operations -#Remember to replace "DC=InfraIT,DC=sec" and the OU paths with your actual domain structure. Also ensure that the users and groups you're referencing actually exist in your Active Directory environment. \ No newline at end of file +#Remember to replace "DC=RohanIT,DC=sec" and the OU paths with your actual domain structure. Also ensure that the users and groups you're referencing actually exist in your Active Directory environment. \ No newline at end of file diff --git a/OU/createOU.ps1 b/OU/createOU.ps1 index 9370ae4..f02e65f 100644 --- a/OU/createOU.ps1 +++ b/OU/createOU.ps1 @@ -7,7 +7,7 @@ ### Creating a Basic OU #powershell -New-ADOrganizationalUnit -Name "TestOU" -Path "DC=infrait,DC=sec" +New-ADOrganizationalUnit -Name "Riddermark" -Path "DC=RohanIT,DC=sec" ### Deleting the OU #There are two approaches to delete an OU: @@ -15,20 +15,20 @@ New-ADOrganizationalUnit -Name "TestOU" -Path "DC=infrait,DC=sec" #### Option 1: Disable Protection and Delete #powershell # First, disable the protection -Set-ADOrganizationalUnit -Identity "OU=TestOU,DC=infrait,DC=sec" -ProtectedFromAccidentalDeletion $false +Set-ADOrganizationalUnit -Identity "OU=TestOU,DC=RohanIT,DC=sec" -ProtectedFromAccidentalDeletion $false # Then delete the OU -Remove-ADOrganizationalUnit -Identity "OU=TestOU,DC=infrait,DC=sec" -Confirm:$false +Remove-ADOrganizationalUnit -Identity "OU=TestOU,DC=RohanIT,DC=sec" -Confirm:$false #### Option 2: Create OU Without Protection #When creating new OUs, you can disable the protection from the start: #powershell # Create OU with protection disabled -New-ADOrganizationalUnit -Name "TestOU" -Path "DC=infrait,DC=sec" -ProtectedFromAccidentalDeletion $false +New-ADOrganizationalUnit -Name "Groups" -Path "DC=RohanIT,DC=sec" -ProtectedFromAccidentalDeletion $false # Now you can delete it without first disabling protection -Remove-ADOrganizationalUnit -Identity "OU=TestOU,DC=infrait,DC=sec" -Confirm:$false +Remove-ADOrganizationalUnit -Identity "OU=Groups,DC=RohanIT,DC=sec" -Confirm:$false ## Checking OU Existence Before Creation @@ -38,16 +38,16 @@ Remove-ADOrganizationalUnit -Identity "OU=TestOU,DC=infrait,DC=sec" -Confirm:$fa ### Checking and Creating an OU #powershell # First command: Check if OU exists -if (-not(Get-ADOrganizationalUnit -Filter "Name -eq 'TestOU'" -SearchBase "DC=infrait,DC=sec")) { - New-ADOrganizationalUnit -Name "TestOU" -Path "DC=infrait,DC=sec" +if (-not(Get-ADOrganizationalUnit -Filter "Name -eq 'TestOU'" -SearchBase "DC=RohanIT,DC=sec")) { + New-ADOrganizationalUnit -Name "TestOU" -Path "DC=RohanIT,DC=sec" } ### Deleting with Verification #powershell # Second command: Check if OU exists before deleting -if (Get-ADOrganizationalUnit -Filter "Name -eq 'TestOU'" -SearchBase "DC=infrait,DC=sec") { - Remove-ADOrganizationalUnit -Identity "OU=TestOU,DC=infrait,DC=sec" -Recursive -Confirm:$false +if (Get-ADOrganizationalUnit -Filter "Name -eq 'TestOU'" -SearchBase "DC=RohanIT,DC=sec") { + Remove-ADOrganizationalUnit -Identity "OU=TestOU,DC=RohanIT,DC=sec" -Recursive -Confirm:$false } @@ -57,8 +57,8 @@ if (Get-ADOrganizationalUnit -Filter "Name -eq 'TestOU'" -SearchBase "DC=infrait #powershell # Define the OU details -$ouName = "TestOU" -$domainPath = "DC=infrait,DC=sec" +$ouName = "Riddermark" +$domainPath = "DC=RohanIT,DC=sec" $ouPath = "OU=$ouName,$domainPath" # Try to create the OU with error handling @@ -84,25 +84,25 @@ try { #To find the path of an existing OU: #powershell # Get the Distinguished Name of an existing OU -Get-ADOrganizationalUnit -Filter "Name -eq 'ParentOU'" -SearchBase "DC=infrait,DC=sec" | +Get-ADOrganizationalUnit -Filter "Name -eq 'ParentOU'" -SearchBase "DC=RohanIT,DC=sec" | Select-Object -ExpandProperty DistinguishedName ### Creating an OU Inside Another OU #powershell # First, create the parent OU -New-ADOrganizationalUnit -Name "ParentOU" -Path "DC=infrait,DC=sec" +New-ADOrganizationalUnit -Name "ParentOU" -Path "DC=RohanIT,DC=sec" # Then create a child OU inside the parent OU -New-ADOrganizationalUnit -Name "ChildOU" -Path "OU=ParentOU,DC=infrait,DC=sec" +New-ADOrganizationalUnit -Name "Riders" -Path "OU=Riddermark,DC=RohanIT,DC=sec" ### Complete Example with Nested OUs and Error Handling #powershell # Define the OU structure -$parentOUName = "ParentOU" -$childOUName = "ChildOU" -$domainPath = "DC=infrait,DC=sec" +$parentOUName = "Riddermark" +$childOUName = "Riders" +$domainPath = "DC=RohanIT,DC=sec" # Function to create an OU with error handling function Create-ADOU { @@ -167,7 +167,7 @@ $ouStructure = @{ ) } -$domainPath = "DC=InfraIT,DC=sec" +$domainPath = "DC=RohanIT,DC=sec" # Function to create an OU with error handling function New-CustomADOU { @@ -296,4 +296,4 @@ function Remove-OUStructure { #6. Safe removal process (children before parents) #7. Status checking before each operation -#Remember to replace "DC=InfraIT,DC=Sec" with your actual domain path in all examples. +#Remember to replace "DC=RohanIT,DC=Sec" with your actual domain path in all examples. diff --git a/OU/localgroups.ps1 b/OU/localgroups.ps1 new file mode 100644 index 0000000..1823723 --- /dev/null +++ b/OU/localgroups.ps1 @@ -0,0 +1,194 @@ +# =============================== +# 1) CREATE DFS FOLDERS (LINKS) +# =============================== +Invoke-Command -ComputerName srv1 -ScriptBlock { + # Create DFS folders for each department + $departments = @('Finance','Sales','IT','Consultants','HR') + foreach ($dept in $departments) { + # This will create a DFS link under the existing DFS root \\RohanIT.sec\files + New-DfsnFolder -Path "\\RohanIT.sec\files\$dept" ` + -TargetPath "\\srv1\$dept" ` + -EnableTargetFailback $true + } +} + +# =============================== +# 2) VERIFY DFS NAMESPACE CONFIG +# =============================== +Invoke-Command -ComputerName srv1 -ScriptBlock { + Write-Host "Verifying DFS root..." + Get-DfsnRoot -Path "\\RohanIT.sec\files" + + Write-Host "`nVerifying DFS folders..." + Get-DfsnFolder -Path "\\RohanIT.sec\files\*" | + Format-Table Path,TargetPath,State -AutoSize +} + +# =============================== +# 3) CREATE REQUIRED AD GROUPS +# =============================== +# Import the AD module locally (ensure RSAT AD tools are installed) +Import-Module ActiveDirectory + +# Define the OU path (adjust to your AD) +$OUPath = "OU=Groups,DC=RohanIT,DC=sec" + +# List of local groups to create +$localGroups = @( + "l_fullAccess-hr-share", + "l_fullAccess-it-share", + "l_fullAccess-sales-share", + "l_fullAccess-finance-share", + "l_fullAccess-consultants-share" +) + +foreach ($lg in $localGroups) { + # Check if group already exists + $groupExists = Get-ADGroup -Filter "Name -eq '$lg'" -ErrorAction SilentlyContinue + if (-not $groupExists) { + Write-Host "Creating AD local group: $lg" + New-ADGroup -Name $lg ` + -Path $OUPath ` + -GroupScope DomainLocal ` + -GroupCategory Security ` + -SamAccountName $lg ` + -Description "Full access local group for $lg" + } + else { + Write-Host "Group '$lg' already exists. Skipping creation." + } +} + +# ============================================ +# 4) ADD GLOBAL GROUPS AS MEMBERS TO LOCAL +# ============================================ +# Mapping: local group -> matching global group +# (Assumes your global groups follow the pattern g_all_) +$groupMapping = @{ + 'l_fullAccess-hr-share' = 'g_all_hr' + 'l_fullAccess-it-share' = 'g_all_it' + 'l_fullAccess-sales-share' = 'g_all_sales' + 'l_fullAccess-finance-share' = 'g_all_finance' + 'l_fullAccess-consultants-share' = 'g_all_consultants' +} + +foreach ($localGroup in $groupMapping.Keys) { + $globalGroup = $groupMapping[$localGroup] + + # Verify both groups exist + $lgObject = Get-ADGroup -Filter "Name -eq '$localGroup'" -ErrorAction SilentlyContinue + $ggObject = Get-ADGroup -Filter "Name -eq '$globalGroup'" -ErrorAction SilentlyContinue + + if ($lgObject -and $ggObject) { + Write-Host "`nAdding $globalGroup to $localGroup..." + try { + Add-ADGroupMember -Identity $localGroup -Members $globalGroup -ErrorAction Stop + Write-Host "Successfully added $globalGroup to $localGroup." + } + catch { + Write-Warning "Could not add $globalGroup to $localGroup. `nError: $_" + } + } + else { + Write-Warning "Either $localGroup or $globalGroup does not exist in AD. Check naming and OU paths." + } +} + +# ====================================== +# 5) CONFIGURE NTFS PERMISSIONS +# ====================================== +Invoke-Command -ComputerName srv1 -ScriptBlock { + # Map each folder to its domain local group + $folderPermissions = @{ + 'HR' = 'l_fullAccess-hr-share' + 'IT' = 'l_fullAccess-it-share' + 'Sales' = 'l_fullAccess-sales-share' + 'Finance' = 'l_fullAccess-finance-share' + 'Consultants' = 'l_fullAccess-consultants-share' + } + + foreach ($folder in $folderPermissions.Keys) { + $path = "C:\shares\$folder" + $group = $folderPermissions[$folder] + + Write-Host "`nConfiguring NTFS permissions on $path..." + + # Create a new, "clean" ACL (removing inheritance) + $acl = New-Object System.Security.AccessControl.DirectorySecurity + $acl.SetAccessRuleProtection($true, $false) # Disable inheritance, remove inherited perms + + # Build and add required rules + $adminRule = New-Object System.Security.AccessControl.FileSystemAccessRule( + "BUILTIN\Administrators", + "FullControl", + "ContainerInherit,ObjectInherit", + "None", + "Allow" + ) + $systemRule = New-Object System.Security.AccessControl.FileSystemAccessRule( + "NT AUTHORITY\SYSTEM", + "FullControl", + "ContainerInherit,ObjectInherit", + "None", + "Allow" + ) + $groupRule = New-Object System.Security.AccessControl.FileSystemAccessRule( + $group, + "FullControl", + "ContainerInherit,ObjectInherit", + "None", + "Allow" + ) + + [void]$acl.AddAccessRule($adminRule) + [void]$acl.AddAccessRule($systemRule) + [void]$acl.AddAccessRule($groupRule) + + # Apply new ACL to the folder + Set-Acl -Path $path -AclObject $acl + Write-Host "NTFS Permissions set for $folder" + } + + # Also configure the DFS root folder (C:\dfsroots\files) + Write-Host "`nConfiguring NTFS permissions on DFS root (C:\dfsroots\files)..." + $dfsPath = "C:\dfsroots\files" + $dfsAcl = New-Object System.Security.AccessControl.DirectorySecurity + $dfsAcl.SetAccessRuleProtection($true, $false) + + # Re-use the base rules + $dfsAcl.AddAccessRule($adminRule) + $dfsAcl.AddAccessRule($systemRule) + + # Grant full control to all dept local groups + foreach ($deptGroup in $folderPermissions.Values) { + $deptRule = New-Object System.Security.AccessControl.FileSystemAccessRule( + $deptGroup, + "FullControl", + "ContainerInherit,ObjectInherit", + "None", + "Allow" + ) + [void]$dfsAcl.AddAccessRule($deptRule) + } + + Set-Acl -Path $dfsPath -AclObject $dfsAcl + Write-Host "NTFS Permissions set for DFS root." +} + +# ==================================== +# 6) VERIFY NTFS PERMISSIONS +# ==================================== +Invoke-Command -ComputerName srv1 -ScriptBlock { + $folders = @('HR', 'IT', 'Sales', 'Finance', 'Consultants') + foreach ($folder in $folders) { + Write-Host "`nPermissions for $folder folder:" -ForegroundColor Yellow + (Get-Acl -Path "C:\shares\$folder").Access | + Select-Object IdentityReference, FileSystemRights + } + + Write-Host "`nPermissions for DFS root (C:\dfsroots\files):" -ForegroundColor Yellow + (Get-Acl -Path "C:\dfsroots\files").Access | + Select-Object IdentityReference, FileSystemRights +} + +Write-Host "`nAll steps completed. DFS links, AD groups, membership, and NTFS permissions have been configured." diff --git a/OU/setup.ps1 b/OU/setup.ps1 new file mode 100644 index 0000000..b9edf01 --- /dev/null +++ b/OU/setup.ps1 @@ -0,0 +1,197 @@ +Import-Module ActiveDirectory + +# 1. Set your domain DN +$DomainDN = "DC=RohanIT,DC=sec" + +# 2. Function to create OU if it doesn't exist +function New-MyOU { + param( + [string]$Name, + [string]$ParentDN + ) + $checkOU = Get-ADOrganizationalUnit -Filter "Name -eq '$Name'" -SearchBase $ParentDN -ErrorAction SilentlyContinue + if (-not $checkOU) { + try { + New-ADOrganizationalUnit -Name $Name -Path $ParentDN -ErrorAction Stop | Out-Null + Write-Host "Created OU: $Name in $ParentDN" + } + catch { + Write-Warning "Failed to create OU: $Name. $_" + } + } + else { + Write-Host "OU '$Name' already exists under $ParentDN. Skipping." + } +} + +# 3. Function to create random password +function New-RandomPassword { + param([int]$length = 12) + $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()' + -join ((1..$length) | ForEach-Object { $chars[(Get-Random -Maximum $chars.Length)] }) +} + +# --- CREATE THE OU STRUCTURE --- + +# 4. Create top-level OUs +New-MyOU -Name "RohanIT_Users" -ParentDN $DomainDN +New-MyOU -Name "RohanIT_Computers" -ParentDN $DomainDN +New-MyOU -Name "RohanIT_Groups" -ParentDN $DomainDN + +# Sub-OUs: RohanIT_Users +$usersOU = "OU=RohanIT_Users,$DomainDN" +New-MyOU -Name "Finance" -ParentDN $usersOU +New-MyOU -Name "Sales" -ParentDN $usersOU +New-MyOU -Name "IT" -ParentDN $usersOU +New-MyOU -Name "Consultants" -ParentDN $usersOU +New-MyOU -Name "HR" -ParentDN $usersOU + +# Sub-OUs: RohanIT_Computers +$computersOU = "OU=RohanIT_Computers,$DomainDN" +New-MyOU -Name "Workstations" -ParentDN $computersOU +New-MyOU -Name "Servers" -ParentDN $computersOU + +$workstationsOU = "OU=Workstations,$computersOU" +New-MyOU -Name "Finance" -ParentDN $workstationsOU +New-MyOU -Name "Sales" -ParentDN $workstationsOU +New-MyOU -Name "IT" -ParentDN $workstationsOU +New-MyOU -Name "Consultants" -ParentDN $workstationsOU +New-MyOU -Name "HR" -ParentDN $workstationsOU + +# Sub-OUs: RohanIT_Groups +$groupsOU = "OU=RohanIT_Groups,$DomainDN" +New-MyOU -Name "Global" -ParentDN $groupsOU +New-MyOU -Name "Local" -ParentDN $groupsOU + +# --- CREATE GLOBAL GROUPS FOR DEPARTMENTS --- +$globalOU = "OU=Global,$groupsOU" +$departments = @("Finance","Sales","IT","Consultants","HR") + +foreach ($dept in $departments) { + $groupName = "GG_$dept" + $exists = Get-ADGroup -Filter "Name -eq '$groupName'" -SearchBase $globalOU -ErrorAction SilentlyContinue + if (-not $exists) { + try { + New-ADGroup -Name $groupName -GroupScope Global -Path $globalOU -SamAccountName $groupName + Write-Host "Created Global Group: $groupName" + } + catch { + Write-Warning "Failed to create group $groupName. $_" + } + } + else { + Write-Host "Group '$groupName' already exists. Skipping." + } +} + +# --- CREATE USERS & ADD TO GROUPS --- + +# Example distribution: +# Finance: 2 users, HR: 1 user, Sales: 2 users, IT: 2 users, Consultants: 9 users +$usersToCreate = @( + # Finance (1) + @{ Department="Finance"; FirstName="Bob"; LastName="Olsen" }, + + + # HR (1) + @{ Department="HR"; FirstName="Harry"; LastName="Hope" }, + + # Sales (2) + @{ Department="Sales"; FirstName="Sally"; LastName="Amberlamps" }, + @{ Department="Sales"; FirstName="Sam"; LastName="Brannmann" }, + + # IT (2) + @{ Department="IT"; FirstName="Kåre"; LastName="Monsen" }, + @{ Department="IT"; FirstName="Iris"; LastName="Elaiassen" }, + + # Consultants (9) + @{ Department="Consultants"; FirstName="Vilfred"; LastName="Williassen" }, + @{ Department="Consultants"; FirstName="May"; LastName="Karstensen" }, + @{ Department="Consultants"; FirstName="Mons"; LastName="Andersen" }, + @{ Department="Consultants"; FirstName="Anders"; LastName="Monsen" }, + @{ Department="Consultants"; FirstName="Ali"; LastName="Muhammed" }, + @{ Department="Consultants"; FirstName="Kristian"; LastName="Kristoffersen" }, + @{ Department="Consultants"; FirstName="Nicolai"; LastName="Stiansen" }, + @{ Department="Consultants"; FirstName="Marita"; LastName="Bruun" }, + @{ Department="Consultants"; FirstName="Ellie"; LastName="Eiliassen" } +) + +foreach ($u in $usersToCreate) { + $dept = $u.Department + $fn = $u.FirstName + $ln = $u.LastName + $fullName = "$fn $ln" + # SamAccountName: e.g. "jfin1", "sfin2", etc. + $sam = ($fn.Substring(0,1) + $ln).ToLower() + $upn = $sam + "@" + ($DomainDN.Replace("DC=", "").Replace(",", ".")) + $userOU = "OU=$dept,OU=RohanIT_Users,$DomainDN" + $password = New-RandomPassword -length 12 + + # Create user if doesn't exist + $checkUser = Get-ADUser -Filter "SamAccountName -eq '$sam'" -SearchBase $userOU -ErrorAction SilentlyContinue + if (-not $checkUser) { + try { + New-ADUser -Name $fullName ` + -SamAccountName $sam ` + -UserPrincipalName $upn ` + -Path $userOU ` + -GivenName $fn ` + -Surname $ln ` + -Department $dept ` + -AccountPassword (ConvertTo-SecureString $password -AsPlainText -Force) ` + -ChangePasswordAtLogon $true ` + -Enabled $true + + Write-Host "Created user: $fullName (SAM=$sam) in $dept. Password=$password" + + # Add user to the correct Global Group + $groupName = "GG_$dept" + Add-ADGroupMember -Identity $groupName -Members $sam + Write-Host " Added $fullName to $groupName." + } + catch { + Write-Warning "Error creating user $fullName. $_" + } + } + else { + Write-Host "User $sam already exists in OU=$dept. Skipping." + } +} + +Write-Host "`nDone creating OUs, groups, and users in RohanIT.sec domain." + + + + + +<# This instance created users; Created user: Bob Olsen (SAM=bolsen) in Finance. Password=CF&TXrJSPJ%m + Added Bob Olsen to GG_Finance. + Created user: Harry Hope (SAM=hhope) in HR. Password=Test1234* + Added Harry Hope to GG_HR. + Created user: Sally Amberlamps (SAM=samberlamps) in Sales. Password=#G6AiBWvKdL# + Added Sally Amberlamps to GG_Sales. + Created user: Sam Brannmann (SAM=sbrannmann) in Sales. Password=4ibXzHoEgSpT + Added Sam Brannmann to GG_Sales. + Created user: Kåre Monsen (SAM=kmonsen) in IT. Password=fXLDR!y!a8M7 + Added Kåre Monsen to GG_IT. + Created user: Iris Elaiassen (SAM=ielaiassen) in IT. Password=XBtY$%6$3A&g + Added Iris Elaiassen to GG_IT. + Created user: Vilfred Williassen (SAM=vwilliassen) in Consultants. Password=)yTowvb%y$yX + Added Vilfred Williassen to GG_Consultants. + Created user: May Karstensen (SAM=mkarstensen) in Consultants. Password=)#Ht@dunTB2X + Added May Karstensen to GG_Consultants. + Created user: Mons Andersen (SAM=mandersen) in Consultants. Password=Gp6ydyD)y)yx + Added Mons Andersen to GG_Consultants. + Created user: Anders Monsen (SAM=amonsen) in Consultants. Password=vbL*cj7A^HGy + Added Anders Monsen to GG_Consultants. + Created user: Ali Muhammed (SAM=amuhammed) in Consultants. Password=ThXb(JJySU^N + Added Ali Muhammed to GG_Consultants. + Created user: Kristian Kristoffersen (SAM=kkristoffersen) in Consultants. Password=UGHy6nDiJjnf + Added Kristian Kristoffersen to GG_Consultants. + Created user: Nicolai Stiansen (SAM=nstiansen) in Consultants. Password=*Pwz3U)X(4pF + Added Nicolai Stiansen to GG_Consultants. + Created user: Marita Bruun (SAM=mbruun) in Consultants. Password=ngHxu3C3mWKV + Added Marita Bruun to GG_Consultants. + Created user: Ellie Eiliassen (SAM=eeiliassen) in Consultants. Password=fh3o1jS5pjDq + Added Ellie Eiliassen to GG_Consultants. +#> \ No newline at end of file