This commit is contained in:
Gramzon
2025-01-27 15:50:09 +01:00
parent 44898bf457
commit dbf3e118fd
4 changed files with 417 additions and 26 deletions
+7 -7
View File
@@ -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.
#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.
+19 -19
View File
@@ -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.
+194
View File
@@ -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_<dept>)
$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."
+197
View File
@@ -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.
#>