Powershell: Active Directory Gruppe Monitoren

Wie oft ist es schon passiert, dass sich Administratoren die Frage stellen, seit wann ein Account, eine Gruppe, effektive eine Person(engruppe) die Vorzüge oder Einschränkungen hinter einer Active Directory Security Group bekommt.

Nun dafür gibt es eine einfache Lösung:

Import-Module ActiveDirectory
#Variables
#Variable for AD group to be checked
$CheckGroup = 'Group-Name die überwacht werden soll'
$Folder = 'c:\temp\'
$BasePath = $Folder + 'base.txt'
$CompPath = $Folder + 'comp.txt'
#Variable for comparison base
[IO.File]::ReadAllText("C:\temp\base.txt") -replace '\s+\r\n+', "`r`n" | Out-File "C:\temp\base.txt"
$BaseList = get-content C:\temp\base.txt
#variable for change date of AD group
$ChangeDate = (Get-ADGroup -Identity $CheckGroup -Properties *).whenChanged
#variables for email options
$SMTPServerA = "SMTP Server"
$Sender = 'Absender'
$Receipient = 'Empfänger'
#Variable for comparison output
[System.Collections.ArrayList]$output = @()

#create comparison list
(Get-ADGroupMember -Identity $CheckGroup).Name | Out-File c:\temp\comp.txt

#variable for list to compare with base
[IO.File]::ReadAllText("C:\temp\comp.txt") -replace '\s+\r\n+', "`r`n" | Out-File "C:\temp\comp.txt"
$CompList = get-content C:\temp\comp.txt

$Members = Compare-Object -ReferenceObject $BaseList -DifferenceObject $CompList -IncludeEqual

foreach ($Member in $Members)
{
    switch ($Member.SideIndicator)
	{
		'<='
		{
			if ($Member.InputObjet -ne '')
			{
				$result = $Member.InputObject + " has been removed"
				$output.add($result)
			}
		}
		'=>'
		{
			if ($Member.InputObjet -ne '')
			{
				$result = $Member.InputObject + " has been added"
				$output.add($result)
			}
		}
		'=='
		{
		}
	}
}
#Send Email if list changed
If ($output.count -gt 0)
{
	Send-MailMessage -From $Sender -to $Receipient -Subject "Change on Group-Name recognised" -SmtpServer $SMTPServerA -Body "$output</br>'Last ChangeDate: '$ChangeDate" -Priority High -BodyAsHtml
}
#remove baselist
If (Test-Path $BasePath)
{
	Remove-Item $BasePath
}
#make complist new baselist
If (Test-Path $CompPath)
{
	Rename-Item -Path $CompPath -NewName 'base.txt'
}

Dieses Skript als “Scheduled Task” kann schon Licht ins Dunkle bringen.
Klar, es wird noch nicht geklärt, wer die Änderung gemacht hat.

Das ist eine ganz andere Geschichte.

ConfigMgr2012: Alle Laptops für alle OUs in Active Directory filtern

SystemCenter Logo

Und wieder mal eine kleine aber nützliche Query. Diesmal filtere ich alle Laptops (… etc…) nach Chassistype.

select distinct
    SYS.Netbios_Name0 as [Computer Name],
	GSSE.ChassisTypes0 as [Chassis Type],
	GSOS.Caption0 as [OS],
	RASS.System_OU_Name0 as [OU Name]
from v_R_System as SYS
inner join v_GS_SYSTEM_ENCLOSURE as GSSE on GSSE.ResourceID = SYS.ResourceID
inner join v_GS_OPERATING_SYSTEM as GSOS on GSOS.ResourceID = SYS.ResourceID
inner join v_RA_System_SystemOUName as RASS on RASS.ResourceID = SYS.ResourceID
where GSSE.ChassisTypes0 in ('8', '9', '10', '14') 

Da es für die Chassistypes eine ganze Liste gibt und diese auch nicht immer nachvollziehbar und logisch verwendet sind….. ( 🙂 ) müssen gleich einige Typen berücksichtigt werden. Die Liste an verfügbaren Chassistype Codes hab ich mal mit gepostet.

1 = "Other"
2 = "Unknown"
3 = "DeskTop"
4 = "Low Profile Desktop"
5 = "Pizza Box"
6 = "Mini Tower"
7 = "Tower"
8 = "Portable"
9 = "Laptop"
10 = "Notebook"
11 = "Handheld"
12 = "Docking Station"
13 = "All-in-One"
14 = "Sub-Notebook"
15 = "Space Saving"
16 = "Lunch Box"
17 = "Main System Chassis"
18 = "Expansion Chassis"
19 = "Sub-Chassis"
20 = "Bus Expansion Chassis"
21 = "Peripheral Chassis"
22 = "Storage Chassis"
23 = "Rack Mount Chassis"
24 = "Sealed-Case PC"
25 = "Tablet"

Den effektiven Filter mach ich persönlich gerne in Excel mit einer Pivot Tabelle.

Powershell: Computer soll sich selbst zur einer AD Gruppe hinzufügen

Wenn das Active Directory nicht manuelle OU’s für Desktops und Laptops hat, die auch noch akribisch gepflegt werden, gibt es hin und wieder die Notwendigkeit die Computer der Einen oder Anderen Benutzergruppe, also die Rechner der Laptop-Anwender bzw. Desktop Anwender separat zu bedienen. Der Microsoft Configuration Manager macht das recht einfach möglich. Nun kann ich more

Powershell: Active Directory mit Powershell – Einfach und Wirkungsvoll

Active Directory (AD) kann sehr einfach mit Powershell verwaltet werden.

Ein paar einfach Kniffe gibts hier:

Alle AD Objekte ausgeben, die Computer-Objekte sind

Get-ADComputer –Filter {Name –Like "*"}

Alle AD Computer-Objekte die seit 60 Tagen inaktiv sind

Search-ADaccount -AccountInactive -Timespan 60 -ComputersOnly

oder etwas dynamischer um gleich in einer Funktion weiter zu verwenden

$days = 60
$lastLogon = (get-date).adddays(-$days).ToFileTime()
Get-ADComputer -filter {lastLogonTimestamp -gt $lastLogon}

Deaktivierte Computer-Objekte löschen (Achtung! Vorsicht beim Löschen!)

Search-ADAccount -AccountDisabled -ComputersOnly | 
    Sort-Object | 
    Remove-ADComputer

Deaktivierte Computer-Objekte einer spezifischen OU löschen (Achtung! Vorsicht beim Löschen!)

Search-ADAccount -AccountDisabled -Searchbase "OU=OU-Name,DC=Domain,DC=Com" -ComputersOnly | 
    Sort-Object | 
    Remove-ADComputer

 

Weitere CMDlets werde ich noch hinzufügen.

Powershell: Veraltete Computer in Excel exportieren

Mit diesem Script wird ein Export aus dem Active Directory erstellt. Mit den Parametern können die Rahmenbedingungen für den Export festgelegt werden

function Get-OutdatedComputer
{
[CmdletBinding()]
Param
(
    [Parameter(Mandatory=$true)]
    [string]$Path,
    [Parameter(Mandatory=$true)]
    [int]$Age,
    [Parameter(Mandatory=$true)]
    [string]$OU    
)
[int]$ComputerPasswordAgeDays = $Age
IF ((test-path "$Path") -eq $False) { md "$Path" }
$ExportFile = "$Path\$OU-InactiveWorkstations.csv"
$ComputerStaleDate = (Get-Date).AddDays(-$ComputerPasswordAgeDays)
$InactiveWorkstations = Get-ADComputer -filter { (passwordLastSet -le $ComputerStaleDate) -and (OperatingSystem -notlike "*Server*") -and (OperatingSystem -like "*Windows*") } -properties Name, DistinguishedName, OperatingSystem,OperatingSystemServicePack, passwordLastSet,LastLogonDate,Description | Where { $_.DistinguishedName -like "*Computer*" } | where { $_.DistinguishedName -like "*OU=$OU,*" }  #| where { $_.DNSHostName -like "$OU.*" }
$InactiveWorkstations | export-csv $ExportFile -Delimiter ';'  
}

Mein Nutzen daraus ist ist ganz klar der Clean-Up-Gedanke.