Hybrid Domain Joined gépek automatikus átnevezése

AutoPilot (Cloud Only) deployment profil konfigurálásánál lehetőség van Device name template megadására is, melyet az alábbiak szerint végezhetünk el:

Sajnos, a Hybrid Autpilot enrollment során ez a funkció nem elérhető:

Ebben az esetben a domain-join konfigurációs template-ben kell megadni a névsablont, amely viszont nem támogatja a %SERIAL% makrót:

Azt gondolná az ember, hogy “semmi gond, írjunk egy remediation scriptet, majd azzal átnevezzük a klienst..” Ez viszont nem fog működni: “Permission denied” üzenetet fogunk kapni:

Ennek az az oka, hogy a remediation script domainba léptetés után nem rendelkezik az Organizational Unit-on a megfelelő jogokkal.
Mit lehet akkor tenni?

Két opciónk van:

A:
Átnevezzük a gépet a Domainbe léptetés előtt, így nem kell a jogosultságokkal bajlódni, ez viszont nem minden esetre jó. Ha éppen Intune-ba migráljuk a már felhasználóknál lévő gépeket, akkor ez a megközelítés ezekre a gépekre nem lesz alkalmazható. Kizárólag Autopilot ESP alatt tud lefutni a script, még reboot előtt, mielőtt a Domain join megtörténik.
Ha neked ez elég, akkor ajánlom Shehab Noaman cikkét: LINK
Noaman megoldásához szükséged lesz pár PowerShell scriptre, amiket Win32 app-ba kell csomagolnod, ez az app egy scheduled taskon keresztül fogja a gépek átnevezését elvégezni.

B:
Abban az esetben, ha nem csak a frissen telepített gépeket szeretnéd átnevezni, hanem már a domain tagokat is, akkor picit bonyolódik a feladat. Ebben a cikkben ezt fogom bemutatni.


Valójában a B opciót is két részre lehet bontani.

B1: Remote Server Administration Tools (RSAT) használatával a kliensek képesek a tartományban lévő adataik módosítására. Ebben a cikkben nem térek ki erre, mert nem szeretnék külön PowerShell modult telepíteni a gépekre, amivel a kliens hozzáférne az AD-hoz.

B2: Group Managed Service Account (gMSA) használatával explicit módon meghatározhatjuk a szükséges jogosultságokat, jelszó használata nélkül tudunk hitelesíteni a tartományvezérlőn, és nincs szükségünk további PowerShell-modulokat telepíteni.

Eszközök átnevezése Group Managed Service Account (gMSA) használatával

Kezdjük ott, hogy mi is az a gMSA account?!
Az sMSA (standalone Managed Service Account) egy olyan tartományi fiók, amely automatikus jelszókezelést és SPN (Service Principal Name) adminisztrációt biztosít egyetlen gépen futó szolgáltatásokhoz.
A gMSA (group Managed Service Account) ugyanezt a funkciót kínálja, de több szerverre kiterjesztve, így minden példány ugyanazt a szolgáltatásfiókot használhatja. A jelszavakat automatikusan a Windows kezeli, nem kell manuálisan cserélni (30 naponta cserélődik a jelszó alapból). A Microsoft Key Distribution Service gondoskodik arról, hogy a domainvezérlők generálják és biztosítsák a gMSA aktuális jelszavát a jogosult gépeknek. Bővebben a gMSA-ról :MS cikk

Nézzük mire van szükségünk pontosan.

Domain Controller:
1. gMSA account
2. Security group, amelynek a tagjai jogosultak a gMSA jelszavát lekérdezni
3. megfelelő jogosultság a gMSA account számára a klienseket tartalmazó OU-ra
4. GPO amivel a klienseken létrehozzuk a szükséges komponenseket.
5. Share, ahova a logokat tudjuk gyűjteni ami az automatikus csoport kezeléséhez kell* (opcionális)

Kliensek:
1. “Log on as a batch job” a gMSA account számára
2. Administrator jogosultság a gMSA account-nak a klienseken
3. Scheduled Task, melyet a gMSA account nevében futtatunk
4. PowerShell script, amelyet a Scheduled Task indít

Active Directory Konfiguráció

Az egyszerűség kedvéért írtam 2 PowerShell scriptet amivel a fentieket létre tudjuk hozni. A least privilege (PoLP) szabályt követve a folyamat a gép átnevezése után, visszavon minden jogosultságot!

A következő scriptet a Domain Controller-en kell futtatni, a script-ben kommenteltem minden lépést:

gMSA fiók és jogosultságok beállítása PowerShell-el:


# ===============================
# Paraméterek
# ===============================
$gmsaName     = "svc_gMSA"
$dnsHostName  = "contoso.com"
$groupName    = "gMSA_Gepek"
$targetOU     = "OU=Hybrid,OU=CORP,DC=corp,DC=contoso,DC=com"  ## OU DistinguishedName

# ===============================
# 1. KDS Root Key ellenőrzése / létrehozása
# ===============================
if (-not (Get-KdsRootKey)) {
    Write-Host "KDS root kulcs nem található. Létrehozás..." -ForegroundColor Yellow
    Add-KdsRootKey -EffectiveImmediately
    Start-Sleep -Seconds 10
    # ===============================
    # A KDS kulcs létrejötte után rövid szünetet tartunk, hogy biztosan elérhető legyen minden domain controller számára.
    # ===============================
    Write-Host "KDS root kulcs létrehozva." -ForegroundColor Green
} else {
    Write-Host "KDS root kulcs már létezik." -ForegroundColor Green
}

# ===============================
# 2. Security group létrehozása (ha nem létezik)
# ===============================
if (-not (Get-ADGroup -Filter { Name -eq $groupName } -ErrorAction SilentlyContinue)) {
    # ===============================
    # Ha a megadott nevű csoport még nem létezik, létrehozzuk, hogy ebben gyűjthessük a gMSA használatára jogosult gépeket.
    # ===============================
    New-ADGroup -Name $groupName -GroupScope Global -GroupCategory Security
    Write-Host "Security group '$groupName' létrehozva." -ForegroundColor Green
} else {
    Write-Host "Security group '$groupName' már létezik." -ForegroundColor Cyan
}

# ===============================
# 3. gMSA fiók létrehozása (ha nem létezik)
# ===============================
if (-not (Get-ADServiceAccount -Identity $gmsaName -ErrorAction SilentlyContinue)) {
    New-ADServiceAccount -Name $gmsaName `
        -DNSHostName $dnsHostName `
        -PrincipalsAllowedToRetrieveManagedPassword $groupName `
        -Enabled $true
    # ===============================
    # A PrincipalsAllowedToRetrieveManagedPassword paraméterrel megadott csoport tagjai (gépek) jogosultak lesznek használni a gMSA fiókot.
    # =============================== 
    Write-Host "gMSA fiók '$gmsaName' létrehozva." -ForegroundColor Green
} else {
    Write-Host "gMSA fiók '$gmsaName' már létezik." -ForegroundColor Cyan
}

# ===============================
# 4. Jogosultság delegálása az OU-ra
# ===============================
$netbiosName = "corp"

try {
    $ou = [ADSI]"LDAP://$targetOU"
    # ===============================
    # Identity helyes formátumban: NETBIOS domain név + fióknév
    # ===============================
    $identity = "$netbiosName\$gmsaName$"  

    $acl = $ou.psbase.ObjectSecurity
    # ===============================
    # Meglévő jogok: Validated write to DNS és SPN, valamint attribútummódosítás
    # ===============================
    $rights = @(
        [System.DirectoryServices.ActiveDirectoryRights]::ExtendedRight,
        [System.DirectoryServices.ActiveDirectoryRights]::ExtendedRight,
        [System.DirectoryServices.ActiveDirectoryRights]::WriteProperty
    )
    $extendedRights = @(
        "Validated write to DNS host name",
        "Validated write to service principal name",
        "Write all properties of computer objects"
    )
    # ===============================
    # Végigmegyünk a rights listán, és minden jogosultságot hozzáadunk az OU-hoz a gMSA nevében.
    # ===============================
    for ($i = 0; $i -lt $rights.Count; $i++) {
        try {
            # ===============================
            # NTAccount példányosítás külön, hogy elkapjuk a hibát, ha az identity nem létezik, vagy hibás a formázása.
            # ===============================
            $ntAccount = New-Object System.Security.Principal.NTAccount($identity)
        }
        catch {
            throw "A megadott identity '$identity' nem található vagy formázása hibás. $_"
        }
        # ===============================
        # ACE létrehozás helyesen
        # ===============================
        $ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule (
            $ntAccount,
            $rights[$i],
            [System.Security.AccessControl.AccessControlType]::Allow,  # Helyes enum
            [Guid]::Empty,
            [System.DirectoryServices.ActiveDirectorySecurityInheritance]::All
        )
        
        $acl.AddAccessRule($ace)
    }

    $ou.psbase.CommitChanges()
    Write-Host "Jogosultságok delegálva az '$targetOU' OU-ra ($identity): DNS write, SPN write és attribútum módosítás." -ForegroundColor Green
}
catch {
    Write-Host "Jogosultságdelegálás nem sikerült: $_" -ForegroundColor Red
}

Fontos, hogy a KDS root key létrehozása után (1.blokk) várj amíg elérhető lesz a kulcs.

Miután sikeresen futott a teljes script, a Managed Service Accounts OU-ban fogjuk találni a gMSA accountot. Illetve a Users container-ben a security csoportot.

Az svc_gMSA account jogait tudod ellenőrizni a klienseket tartalmazó OU-n. (OU-> Properties -> Security -> Advanced)

Ha szeretnéd, még tudod szűkíteni a “Special” access alatt lévő jogosultságokat.

Mielőtt a GPO konfigurációt megkezdjük, adjunk hozzá pár gépet az imént létrehozott gMSA_Gepek security group-hoz. Kizárólag azok a kliensek tudják az svc_gMSA account jelszavát lekérni, akik ennek a csoportnak a tagjai!
Miután a klienseket hozzáadtuk a csoporthoz, szükséges egy reboot a kliens-en, így megkapják a jogosultságot az svc_gMSA account-hoz.
Egyenlőre a csoport tagokat manuálisan kezeljük, de a cikk végén kitérek egy lehetséges automatizációra.

Group Policy létrehozása

1. Hozzunk létre egy GPO-t, a Group Policy Management consolon.
2. Adjunk az svc_gMSA fióknak “Log on a batch job” jogosultságot:

“Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Local Policies -> User Rights Assignments -> Log on as a batch job”

Az svc usert csak akkor tudjuk tallózni, ha a “Service Account”-okat is felvesszük a keresési objektumok közé:


3. Állítsunk be egy “Logon script”-et:
“Computer Configuration -> Policies -> Windows Settings -> Scripts (Startup/Shutdown) -> Startup”

A “Startup Properties” ablakon nyissuk meg a “PowerShell Scripts” tab-ot, majd “Add” gombra kattintva tallózzuk a scriptet, amit a klienseken fogunk futtatni.

A startup scriptet a “\\domain\sysvol\domain\{GPO GUID}\machine\scripts\startup”
mappába kell bemásolni. A gpo guid-ot GPO objectumra kattintva a “Details” tab-on találod:

Nézzük a scriptet amit futtatni fogunk Logon scriptként a GPO-val.
Mit csinál pontosan a script?

  • Paramétereket kezel
  • Log funkciót tartalmaz, minden eseményt időbélyeggel naplóz egy .txt fájlba.
  • Lekérdezi a gép sorozatszámát, és abból képez új gépnevet: IC-<SerialNumber>.
  • Ellenőrzi, hogy a szükséges könyvtár létezik-e, ha nem, létrehozza.
  • Ha a gép neve már helyes:
    • Eltávolítja a gMSA-t a “Local Administrators” csoportból.
    • Eltávolítja a Scheduled Task-ot.
    • Átmásolja a log fájlt a hálózati megosztásra, ha még nincs ott. (Erre is mindjárt kitérek!)
  • Ha még nem megfelelő a gépnév:
    • Létrehozza a rename_computer.ps1 segédscriptet, amelyet a Scheduled Task fog futtatni.
      • Rename_Computer.ps1 script:
      • Átnevezi a gépet. (Max 15 karakter lehet a NetBios name, így a prefix megadásakor ezzel számolj!)
      • Archiválja az esetleges meglévő logfájlt a megosztáson.
      • Logol minden lépést.
  • Hozzáadja a gMSA-t az admin csoporthoz, ha még nincs benne.
  • Létrehozza a Scheduled Task-ot:
  • Beállítja, hogy a gMSA fiók futtassa a rename_computer.ps1 scriptet bejelentkezéskor.
  • Azonnal elindítja a Scheduled Task-ot. Ezt a részt opcionálisan hagytam a script-ben, mivel bootoláskor ha fut a script, az első user login-nál nem fog tudni a felhasználó belépni, mivel a gép neve a kliensen még nem válltozott meg de a DC-n már igen, ilyenkor kell egy reboot a kliens-re és ez megoldja a “problémát!”

# svc_gMSA_client.ps1
# -------------------------------------------------------------
# Ez a szkript összeállítja és regisztrálja a gép átnevezéséhez
# szükséges PowerShell szkriptet és Scheduled Task-ot, amelyet
# egy gMSA fiók hajt végre. A folyamat naplózásra kerül lokálisan
# és opcionálisan egy hálózati megosztásra is mentésre kerül.
# -------------------------------------------------------------

# ===============================
# Paraméterek
# ===============================
param(
    [string]$UserID         = 'corp\svc_gMSA$',
    [string]$ScriptFolder   = 'C:\scripts',
    [string]$RemoteLogShare = '\\dc1\share'
)

# ===============================
# Log funkció definíciója
# ===============================
function Write-Log {
    param([string]$Message)
    $timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
    $LogFile   = Join-Path $ScriptFolder $newNameFile
    "$timestamp $Message" | Out-File -FilePath $LogFile -Encoding UTF8 -Append
}

$ErrorActionPreference = 'Continue'

# ===============================
# Gépnév meghatározása és összehasonlítás
# ===============================
$serial      = (Get-CimInstance Win32_BIOS).SerialNumber
$newName     = ("IC-$serial").Substring(0, [Math]::Min(15, ("IC-$serial").Length))
$newNameFile = "$newName.txt"
$currentName = $env:COMPUTERNAME

# ===============================
# Script mappa létrehozása, ha nem létezik
# ===============================
if (-not (Test-Path $ScriptFolder)) {
    try {
        New-Item -Path $ScriptFolder -ItemType Directory -Force | Out-Null
        Write-Log "Folder '$ScriptFolder' created."
    }
    catch {
        Write-Log "Failed to create folder '$ScriptFolder': $_"
    }
}

# ===============================
# Ha a gép neve már megfelelő, takarítás
# ===============================
if ($currentName -eq $newName) {
    Write-Log "Name OK: $currentName"
    # ===============================
    # GMSA eltávolítása a local admin group-ból, ha benne van
    # ===============================
    if (Get-LocalGroupMember Administrators -ErrorAction SilentlyContinue | Where Name -EQ $UserID) {
        try {
            Remove-LocalGroupMember -Group Administrators -Member $UserID -ErrorAction Stop
            Write-Log "Removed svc_gMSA from Administrators."
        } catch {
            Write-Log "Failed to remove svc_gMSA: $_"
        }
    } else {
        Write-Log "svc_gMSA not in Administrators."
    }
    # ===============================
    # Scheduled Task eltávolítása
    # ===============================
    try {
        Unregister-ScheduledTask -TaskName 'gMSA_Task' -Confirm:$false -ErrorAction Stop
        Write-Log "Removed scheduled task gMSA_Task."
    } catch {
        Write-Log "Failed to remove task: $_"
    }
    # ===============================
    # Log másolása hálózatra, ha még nincs ott
    # ===============================
    $dest = Join-Path $RemoteLogShare $newNameFile
    if (-not (Test-Path $dest)) {
        try {
            Copy-Item -Path (Join-Path $ScriptFolder $newNameFile) -Destination $dest -Force
            Write-Log "Log copied to share as $newNameFile"
        } catch {
            Write-Log "Failed to copy log: $_"
        }
    } else {
        Write-Log "Log already exists on share: $newNameFile"
    }
    exit
}

# ===============================
# rename_computer.ps1 script létrehozása
# ===============================
$scriptPath = Join-Path $ScriptFolder 'rename_computer.ps1'
if (-not (Test-Path $scriptPath)) {
@"
param(
    [string]`$RemoteLogShare = '$RemoteLogShare',
    [string]`$ScriptFolder   = '$ScriptFolder',
    [string]`$newName        = '$newName'
)

function Write-Log {
    param([string]`$Message)
    `$timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
    `$LogFile   = Join-Path `$ScriptFolder "`$newName.txt"
    "`$timestamp `$Message" | Out-File -FilePath `$LogFile -Encoding UTF8 -Append
}

`$serial      = (Get-CimInstance Win32_BIOS).SerialNumber
`$newNameFile = "`$newName.txt"
`$currentName = `$env:COMPUTERNAME

if (`$currentName -ne `$newName) {
    try {
        Rename-Computer -NewName `$newName -Force -ErrorAction Stop -Verbose
        Write-Log "Renamed: `$currentName -> `$newName"

        try {
            `$LogFile = Join-Path `$ScriptFolder `$newNameFile
            `$dest    = Join-Path `$RemoteLogShare `$newNameFile

            if (Test-Path `$dest) {
                try {
                    `$fileInfo = Get-Item `$dest
                    `$creationDate = `$fileInfo.CreationTime.ToString('yyyy-MM-dd')
                    `$archiveName = "`$newName"+"-`$creationDate.txt"
                    `$archiveDest = Join-Path `$RemoteLogShare `$archiveName
                    Rename-Item -Path `$dest -NewName `$archiveDest -ErrorAction Stop
                    Write-Log "Existing log renamed to `$archiveName (creation date used)"
                }
                catch {
                    Write-Log "Failed to archive existing log: `$($_)"
                }
            }

            Copy-Item -Path `$LogFile -Destination `$dest -Force -ErrorAction Stop
            Write-Log "Log copied to share as `$newNameFile"
        }
        catch {
            Write-Log "Failed to copy log to share: `$($_)"
        }
    }
    catch {
        Write-Log "Rename failed: `$($_)"
    }
}
else {
    Write-Log "Name already correct: `$currentName"
}
"@ | Out-File -FilePath $scriptPath -Encoding UTF8

    Write-Log "Created rename_computer.ps1"
}

# ===============================
# gMSA fiók admin jog hozzárendelése, ha nem tag
# ===============================
if (-not (Get-LocalGroupMember Administrators -ErrorAction SilentlyContinue | Where Name -EQ $UserID)) {
    try {
        Add-LocalGroupMember -Group Administrators -Member $UserID -ErrorAction Stop
        Write-Log "Added svc_gMSA to Administrators."
    } catch {
        Write-Log "Failed to add svc_gMSA: $_"
    }
} else {
    Write-Log "svc_gMSA already in Administrators."
}

# ===============================
# Scheduled Task regisztráció
# ===============================
$TaskName = 'gMSA_Task'
$psPath   = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
$psArgs   = "-ExecutionPolicy Bypass -NoProfile -File `"$scriptPath`""
$action   = New-ScheduledTaskAction -Execute $psPath -Argument $psArgs
$trigger  = New-ScheduledTaskTrigger -AtLogOn
$principal= New-ScheduledTaskPrincipal -UserID $UserID -LogonType Password -RunLevel Highest

if (-not (Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue)) {
    try {
        Register-ScheduledTask -TaskName $TaskName -Action $action -Trigger $trigger -Principal $principal -ErrorAction Stop
        Write-Log "Registered task $TaskName"
    } catch {
        Write-Log "Failed to register task: $_"
    }
} else {
    Write-Log "Task $TaskName already exists."
}

# ===============================
# Task indítása
# ===============================


Zárjuk be a GPO-t, és link-eljük a megfelelő OU-ra!

A fenti script létrehoz egy rename_computer.ps1 file-t a gépen, amit a scheduled task fog futtatni az svc_gMSA fiók nevében. Ez a script tartalmaz egy részt amikor a log file-okat egy share-re másol, de erre miért van szükség?
Mivel az svc_gMSA fiók jelszavát csak azok a képek tudják lekérdezni az AD-ból akik tagjai a “gMSA_Gepek” security group-nak. Korábban említettem, hogy ha nem szeretnénk manuálisan kezelni a csoport tagjait, akkor ezt tudjuk automatizálni.

gMSA_Gepek tagság automatikus kezelése

Scheduled task segítségével képesek vagyunk a gMSA_Gepek security group tagjait úgy frissíteni, hogy csak azok a kliensek legyenek aktuálisan benne a csoportban, amelyeknél az átnevezés még nem futott le. Szükségünk van a következőkre:
1. Scheduled task a DC-n ami ütemezetten fut
2. PowerShell script amit a Scheduled task futtat
OU tagok lekérése:
• Lekéri az összes számítógépobjektumot a megadott Hybrid OU-ból ($targetOUdn).
Csoporttagok lekérése:
• Lekéri a megadott gMSA_Gepek nevű security group számítógép-tagjait.
Összehasonlítás és szinkronizáció:
• Végigmegy az OU-ban lévő gépeken:
o Ha a géphez tartozó logfájl létezik a share-en (\\share\gépnév.txt), akkor feltételezi, hogy a gép átnevezése sikeres volt:
Ebben az esetben eltávolítja a gépet a csoportból, ha benne van.
o Ha a logfájl nem létezik, akkor a gép még nem végzett, ezért:
Hozzáadja a gépet a csoporthoz, ha még nincs benne.
Logolás:
• Az egész műveletet naplózza a C:\scheduled scripts\UpdateGMSAGroup.log fájlba.
3. Share amihez az svc_gMSA account-nak adunk írási jogot


Nézzük a scriptet:


# UpdateGMSAGroup.ps1
# -------------------------------------------------------------
# Szinkronizálja a Hybrid OU gépobjektumait a 'gMSA_Gepek' AD csoporttal.
# Ha egy gépről még nincs log a megosztáson, hozzáadja a csoporthoz.
# Ha már van logja, eltávolítja a csoportból.
# -------------------------------------------------------------

# ===============================
# Paraméterek
# ===============================
$targetOUdn  = "OU=Hybrid,OU=CORP,DC=corp,DC=contoso,DC=com"  # Cél OU DN
$groupName   = "gMSA_Gepek"                                   # AD csoport neve
$logShare    = "\\dc1\share"                                  # Közös log megosztás helye
$logPath     = "C:\scheduled scripts\UpdateGMSAGroup.log"     # Lokális log fájl

# ===============================
# Minden művelet naplózása
# ===============================
Start-Transcript -Path $logPath -Append -ErrorAction SilentlyContinue

try {
    # ===============================
    # 1) OU gépek lekérdezése
    # ===============================
    $ouComputers = Get-ADComputer -SearchBase $targetOUdn -Filter * -Properties Name, DistinguishedName |
                   Select-Object Name, DistinguishedName

    Write-Host "Found $($ouComputers.Count) computer(s) in OU $targetOUdn" -ForegroundColor Cyan

    # ===============================
    # 2) Csoport jelenlegi számítógép-tagjai
    # ===============================
    $groupMembers = Get-ADGroupMember -Identity $groupName -Recursive -ErrorAction Stop |
                    Where-Object { $_.objectClass -eq 'computer' } |
                    Select-Object Name, DistinguishedName

    if (-not $groupMembers) { $groupMembers = @() }  # Üres tömb, ha nincs tag

    Write-Host "Group '$groupName' currently has $($groupMembers.Count) computer member(s)." -ForegroundColor Cyan

    # ===============================
    # 3) Minden OU-beli gép feldolgozása
    # ===============================
    foreach ($comp in $ouComputers) {
        $computerName = $comp.Name
        $computerDN   = $comp.DistinguishedName
        $logFile      = Join-Path $logShare "$computerName.txt"  # Logfájl elérési útja

        if (Test-Path $logFile) {
            # --- Log már létezik -> gépet el kell távolítani a csoportból ---
            if ($groupMembers.DistinguishedName -contains $computerDN) {
                try {
                    Remove-ADGroupMember -Identity $groupName -Members $computerDN -Confirm:$false -ErrorAction Stop
                    Write-Host "Removed $computerName from $groupName (log found on share)." -ForegroundColor Yellow
                }
                catch {
                    Write-Host "Failed to remove $computerName $_" -ForegroundColor Red
                }
            } else {
                Write-Host "$computerName not in group (log exists) – no action needed." -ForegroundColor Gray
            }
        }
        else {
            # --- Nincs log -> gépet hozzá kell adni a csoporthoz ---
            if (-not ($groupMembers.DistinguishedName -contains $computerDN)) {
                try {
                    Add-ADGroupMember -Identity $groupName -Members $computerDN -ErrorAction Stop
                    Write-Host "Added $computerName to $groupName (log not found)." -ForegroundColor Green
                }
                catch {
                    Write-Host "Failed to add $computerName $_" -ForegroundColor Red
                }
            } else {
                Write-Host "$computerName already in group – no action needed." -ForegroundColor Green
            }
        }
    }
}
catch {
    # Hiba esetén naplózzuk
    Write-Host "Error during group update: $_" -ForegroundColor Red
}
finally {
    # Naplózás leállítása
    Stop-Transcript | Out-Null
}

Természetesen ennek a scriptnek / automatizmusnak a használata opcionális, kézzel is lehet kezelni a csoport tagjait. Abban az esetben, ha Hybrid Autopilot-hoz szeretnéd illeszteni a folyamatot, érdemes implementálni ezt is.

A scriptek-et érdemes átnézni, és minden változót frissíteni a környezettől függően! Abban az esetben, h anem szeretnéd automatizálni a security group kezelését, kommenteld ki azt a részt a scriptből, ami a Share-re másolja a logokat!

Lehet, hogy nem pont ezt a megoldást fogod használni, de remélhetőleg adott néhány hasznos ötletet vagy új nézőpontot. 🙂


Comments

Leave a comment