AD User auslesen und in Datei mit Logo abspeichern
Hallo zusammen,
ich stehe vor eine neuern Aufgabe. Ich möchte gerne AD-User aus einer entsprechende Gruppe auslesen.
Diese sollen in eine Datei, csv, html, doc... exportiert werden. Wichtig ist, dass sich die Anzahl der vorhandenen User, sowie deren Name in dem Dokument befindet.
außerdem soll noch ein Logo der Firma automatisch in der Dokument bei der Erzeugung eingepflegt werden.
Mit csv wird es denke ich nicht möglich sein.
Das sind meine ersten Überlegungen, allerdings wird in die HTML-Datei die Anzahl der Nutzer nicht mit exportiert.
Außerdem weiß ich keine Lösung für das Logo...
Kann mir da von euch wer weiterhelfen?
VG
ich stehe vor eine neuern Aufgabe. Ich möchte gerne AD-User aus einer entsprechende Gruppe auslesen.
Diese sollen in eine Datei, csv, html, doc... exportiert werden. Wichtig ist, dass sich die Anzahl der vorhandenen User, sowie deren Name in dem Dokument befindet.
außerdem soll noch ein Logo der Firma automatisch in der Dokument bei der Erzeugung eingepflegt werden.
Mit csv wird es denke ich nicht möglich sein.
$Server = "10.10.10.1"
$gruppen = @("test")
$date = (Get-date(Get-Date) -Format "dd-MM-yyyy HH:mm:ss")
$AD_Domain = "test"
$AD-User = "test"
$AD_Domain_User = $AD_Domain + $AD_User
$securepass = gc "D:\test.txt" | convertto-SecureString
## $cred = New-Object PSCredential $AD_User, $securepass
$cred = New-Object System.Management.Automation.PSCredential($AD_Domain_User, $securepass)
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
$count = 0
$daten = @()
foreach($group in $gruppen){
$all = @()
$all += Get-ADGroupMember $group -Recursive -Server $Server -Credential $cred -EA SilentlyContinue
$all += Get-ADGroupMember $group -Server $Server -Credential $cred -EA SilentlyContinue | ?{$_.objectClass -eq "group"} | Get-ADGroupMember -Recursive
#$all = $all | Where{ $_.SamAccountName -eq "mpauluth" }
$daten += $all.Count
$daten += $all | Select-Object name
$daten | convertto-html > D:\data\HtmlReport.html
}
Das sind meine ersten Überlegungen, allerdings wird in die HTML-Datei die Anzahl der Nutzer nicht mit exportiert.
Außerdem weiß ich keine Lösung für das Logo...
Kann mir da von euch wer weiterhelfen?
VG
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 278619
Url: https://administrator.de/contentid/278619
Ausgedruckt am: 05.11.2024 um 02:11 Uhr
31 Kommentare
Neuester Kommentar
Hallo makaroni,
probiere es mal mit diesem VB-Skipt, das liest dir aus einer AD-Datenbank eine bestimmte OU aus und erzeugt eine HTA-Datei (ähnlich einer HTM), dazu habe ich mir noch eingebaut, das nur Mitarbeiter einer bestimmten "Company" ausgelesen werden, passe das einfach für dich an:
In Zeile 67 packst du den Link zum Logo, in Zeile 87 die abzufragende OU, in Zeile 93 kannst du ggfs. noch das Feld "Company" abfragen:
Natürlich muss das Konto, unter dem du das Skript ausführst, auch entsprechende Berechtigungen haben
Das ganze packst du in eine BAT und taksplanst das:
Schöne Grüße
Marcus
probiere es mal mit diesem VB-Skipt, das liest dir aus einer AD-Datenbank eine bestimmte OU aus und erzeugt eine HTA-Datei (ähnlich einer HTM), dazu habe ich mir noch eingebaut, das nur Mitarbeiter einer bestimmten "Company" ausgelesen werden, passe das einfach für dich an:
In Zeile 67 packst du den Link zum Logo, in Zeile 87 die abzufragende OU, in Zeile 93 kannst du ggfs. noch das Feld "Company" abfragen:
On Error Resume Next
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
'Zielfpfad + Datei
htaFilePath = "c:\Mitarbeiterliste.hta"
Set htmlFile = objFSO.CreateTextFile(htaFilePath, TRUE) ' neue HTA-Datei erstellen
htmlfile.WriteLine("<HTML>") ' ...zeilenweise die HTA-Datei füllen
htmlfile.WriteLine("<TITLE>Firma Roehrich und Soehne Mitarbeiter-Übersicht</TITLE>")
htmlfile.WriteLine("<HEAD>")
htmlfile.WriteLine("<HTA:APPLICATION")
htmlfile.WriteLine("MAXIMIZEBUTTON=""no""")
htmlfile.WriteLine("SINGLEINSTANCE=""yes"">")
htmlfile.WriteLine("SYSMENU=""no"">")
'Aufbau der Ausgabetabelle festelegen
htmlfile.WriteLine("<STYLE type=""text/css"">")
htmlfile.WriteLine("")
htmlfile.WriteLine("#TABLE1") 'hier die Ausgabe der Daten formatieren
htmlfile.WriteLine("{")
htmlfile.WriteLine(" font-family: ""Arial"", ""Arial"", Sans-Serif;")
htmlfile.WriteLine(" font-size: 12px;")
htmlfile.WriteLine(" background: #fff;")
htmlfile.WriteLine(" margin: 25px;")
htmlfile.WriteLine(" width: 95%;")
htmlfile.WriteLine(" border-collapse: collapse;")
htmlfile.WriteLine(" text-align: left;")
htmlfile.WriteLine("}")
htmlfile.WriteLine("#TABLE1 TH") 'Überschriften formatieren
htmlfile.WriteLine("{")
htmlfile.WriteLine(" font-size: 13px;")
htmlfile.WriteLine(" font-weight: normal;")
htmlfile.WriteLine(" color: #600;")
htmlfile.WriteLine(" background: #ccc;") 'Hintergrund leicht grau
htmlfile.WriteLine(" padding: 10px 8px;")
htmlfile.WriteLine(" border-bottom: 2px solid #6678b1;")
htmlfile.WriteLine("}")
htmlfile.WriteLine("#TABLE1 TD") 'Datenbereich formatieren
htmlfile.WriteLine("{")
htmlfile.WriteLine(" border-bottom: 1px solid #ccc;")
htmlfile.WriteLine(" color: #000;")
htmlfile.WriteLine(" padding: 6px 8px;")
htmlfile.WriteLine("}")
htmlfile.WriteLine("</STYLE>")
'Grösse des Anzeigefensters festlegen
htmlfile.WriteLine("<SCRIPT Language=""VBScript"">")
htmlfile.WriteLine(" Sub Window_Onload")
htmlfile.WriteLine(" window.resizeTo 1500,900") ' windows-größe einstellen
htmlfile.WriteLine(" End Sub")
htmlfile.WriteLine("</SCRIPT>")
'Fenster füllen
htmlfile.WriteLine("</HEAD>")
htmlfile.WriteLine("")
htmlfile.WriteLine("<BODY><RIGHT>")
htmlfile.WriteLine("<img src=""https://www.bsi.bund.de/SiteGlobals/StyleBundles/Bilder/Farbschema_A/logo_a.gif;jsessionid=6457A952E4DA59827FC1A1934FBB6076.2_cid368?__blob=normal&v=2"">")
htmlfile.WriteLine("<CENTER>")
htmlfile.WriteLine("<H2 style=""font-family: Arial; color: #600""><b>Mitarbeiter-Übersicht          Stand "& FormatDateTime(date(),1) & " um " & FormatDateTime(time(),4) & " Uhr     Quelle: ActiveDirectory-DB'</b></H2>")
htmlfile.WriteLine("<TABLE id=""table1"" border=""0""><TBODY>")
htmlfile.WriteLine("<THEAD>")
htmlfile.WriteLine(" <TR>")
htmlfile.WriteLine(" <TH>Initialen</TH>")
htmlfile.WriteLine(" <TH>Name</TH>")
htmlfile.WriteLine(" <TH>Abteilung</TH>")
htmlfile.WriteLine(" <TH>Büro</TH>")
htmlfile.WriteLine(" <TH>PLZ</TH>")
htmlfile.WriteLine(" <TH>Ort</TH>")
htmlfile.WriteLine(" <TH>Bundesland</TH>")
htmlfile.WriteLine(" <TH>Telefon</TH>")
htmlfile.WriteLine(" <TH>Mobilfunk</TH>")
htmlfile.WriteLine(" </TR>")
htmlfile.WriteLine("</THEAD>")
htmlfile.WriteLine("")
htmlfile.WriteLine("<TBODY>")
Set objContainer = GetObject("LDAP://ou=benutzer,dc=roehrich,dc=ads") ' welche OU?
objContainer.Filter = Array("user")
For Each objChild In objContainer
If objChild.company = "Roehrich GmbH" Then ' nur die mit company = "Roehrich GmbH"
htmlfile.WriteLine("<TR>")
htmlfile.WriteLine(" <TD>" & objChild.initials & "</TD>") ' Initialen
htmlfile.WriteLine(" <TD>" & objChild.displayname & "</TD>") ' Anzeigename Mustermann, Max
htmlfile.WriteLine(" <TD>" & objChild.department & "</TD>") ' Abteilung
htmlfile.WriteLine(" <TD>" & objChild.physicalDeliveryOfficeName & "</TD>") ' Büro
htmlfile.WriteLine(" <TD>" & objChild.postalcode & "</TD>") ' PLZ
htmlfile.WriteLine(" <TD>" & objChild.l & "</TD>") ' Ort = Location
htmlfile.WriteLine(" <TD>" & objChild.st & "</TD>") ' Bundesland = state
htmlfile.WriteLine(" <TD>" & objChild.telephonenumber & "</TD>") ' Telefon
htmlfile.WriteLine(" <TD>" & objChild.mobile & "</TD>") ' Mobilfunk
htmlfile.WriteLine("</TR>")
End If
Next
htmlfile.WriteLine("</TBODY>")
htmlfile.WriteLine("</TABLE>")
htmlfile.WriteLine("</CENTER>")
htmlfile.WriteLine("")
htmlfile.WriteLine("</BODY></HTML>")
'objShell.Run htaFilePath 'HTA Datei ausgeben
set objFSO = Nothing
set objShell = Nothing
set objContainer = Nothing
Natürlich muss das Konto, unter dem du das Skript ausführst, auch entsprechende Berechtigungen haben
Das ganze packst du in eine BAT und taksplanst das:
C:\Windows\System32\cscript "c:\Mitarbeiterliste.vbs"
Schöne Grüße
Marcus
Aha, gibt wieder mal Makaroni
Ich liefere den Emmentaler dazu ;-P
Im Beispiel wird das Logo als Base64 String direkt in die HTML-Datei eingebettet, man kann natürlich auch einen festen Pfad nehmen und das Bild verlinken, wie man es halt benötigt... Oder man schickt das ganze hinterher an einen PDF-Printer, jedem wie er es mag..
Ich habe deinen Code aufgegriffen und entsprechend ergänzt...
Eine Beispielhafte Ausgabe sieht dann so aus:
dem kreativen Gemüt sind bei der Gestaltung natürlich keine Grenzen gesetzt.
Als denn gutes Gelingen.
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Ich liefere den Emmentaler dazu ;-P
Im Beispiel wird das Logo als Base64 String direkt in die HTML-Datei eingebettet, man kann natürlich auch einen festen Pfad nehmen und das Bild verlinken, wie man es halt benötigt... Oder man schickt das ganze hinterher an einen PDF-Printer, jedem wie er es mag..
Ich habe deinen Code aufgegriffen und entsprechend ergänzt...
$Server = "10.10.10.1"
$gruppen = @('Gruppe1','Gruppe2')
$AD_Domain = "test"
$AD_User = "test"
# Pfad zur Ausgabe HTML-Datei
$htmlfile = "D:\data\HtmlReport_$(get-date -F 'yyyyMMdd').html"
# Pfad zum Logo
$logo = 'C:\data\Logo.jpg'
$AD_Domain_User = $AD_Domain + $AD_User
$securepass = gc "D:\test.txt" | convertto-SecureString
$cred = New-Object PSCredential($AD_Domain_User, $securepass)
$date = get-date -F 'dd-MM-yyyy HH:mm:ss'
# Bild zu Base64 Data konvertieren
$b64 = "data:image/$([System.IO.Path]::GetExtension($logo).substring(1));base64," + [convert]::ToBase64String((Get-Content $logo -Encoding byte))
$all = @()
$gruppen | %{
$mitglieder = @()
$mitglieder += Get-AdGroupMember $_ -Recursive -Server $server -Credential $cred -EA SilentlyContinue
$mitglieder += Get-ADGroupMember $_ -Server $Server -Credential $cred -EA SilentlyContinue | ?{$_.objectClass -eq "group"} | Get-ADGroupMember -Recursive
$mitglieder = $mitglieder | select -Unique
$all += New-Object PSObject -Property @{Gruppe=$_;Mitglieder=$mitglieder}
}
$html = @"
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Berechtigungen</title>
<style type="text/css">
body {
font-family: Verdana, Geneva, sans-serif;
font-size: 13px;
}
H1{font-size:1.8em}
table td {
vertical-align:middle;
}
th {
text-align: left;
background-color: #666;
color: white;
height: 20px;
padding: 5px;
}
tr.bodyrow td{
height: 20px;
border-bottom-width: 1px;
border-bottom-style: dashed;
border-bottom-color: #CCC;
}
tr.grouprow td {
height: 20px;
border-bottom-width: 1px;
border-bottom-style: dashed;
border-bottom-color: #CCC;
background-color: #96B0F5;
padding: 2px;
font-weight: bold;
color: #333;
}
</style>
</head>
<body>
<img src="$b64"/>
<h1>Übersicht der Gruppenmitglieder</h1>
<p>
$date
</p>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<th>Name</th>
<th>SamAccountName</th>
<th>SID</th>
</tr>
$($all | %{
@"
<tr class="grouprow">
<td colspan="5">$($_.Gruppe) / ( $($_.Mitglieder.length) Mitglieder)</td>
</tr>
"@
$($_.Mitglieder | %{
@"
<tr class="bodyrow">
<td>$($_.Name)</td>
<td>$($_.SamAccountName)</td>
<td>$($_.SID)</td>
</tr>
"@
})
})
</table>
<p>
<strong>Gesamtanzahl der User aus allen Gruppen:</strong> $($all.Mitglieder.Length)
</p>
</body>
</html>
"@ | out-file $htmlfile -Encoding UTF8
# HTML File aufrufen
start-process $htmlfile
dem kreativen Gemüt sind bei der Gestaltung natürlich keine Grenzen gesetzt.
Als denn gutes Gelingen.
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Super Uwe!
In der Powershell bin ich jetzt noch nicht soooooo firm, deswegen 2 Fragen dazu:
- wie bekomme ich die Namensliste alphabetisch sortiert?
- wie bekomme ich weitere AD-Attribute ausgegeben, z.B. POSTALCODE, L und DEPARTMENT etc.? Wenn ich das cmdlet get-adgroupmember benutze, bekomme ich ja nur 6 Attribute zurück...
Schöne Grüße
MArcus
In der Powershell bin ich jetzt noch nicht soooooo firm, deswegen 2 Fragen dazu:
- wie bekomme ich die Namensliste alphabetisch sortiert?
- wie bekomme ich weitere AD-Attribute ausgegeben, z.B. POSTALCODE, L und DEPARTMENT etc.? Wenn ich das cmdlet get-adgroupmember benutze, bekomme ich ja nur 6 Attribute zurück...
Schöne Grüße
MArcus
Hallo Marcus,
Mach dir später noch ein Beispiel dazu wenn du nicht zurecht kommst ...
-edit- hier das Update das mit den Variablen im oberen Teil gesteuert werden kann:
Grüße Uwe
- wie bekomme ich die Namensliste alphabetisch sortiert?
Zeile 87 so umschreiben:$($_.Mitglieder | sort Name | %{
wie bekomme ich weitere AD-Attribute ausgegeben
Mit (get-aduser USERNAME -Properties *) kommst du an alle Attribute eines Users, diese kannst du dann dem Objekt hinzufügen und in neuen Spalten im HTML-Code ausgeben.Mach dir später noch ein Beispiel dazu wenn du nicht zurecht kommst ...
-edit- hier das Update das mit den Variablen im oberen Teil gesteuert werden kann:
# Pfad zur Ausgabe HTML-Datei
$htmlfile = "D:\data\HtmlReport_$(get-date -F 'yyyyMMdd').html"
# Pfad zum Logo
$logo = 'C:\Logo.jpg'
# Gruppen festlegen dessen Mitglieder ausgeben werden sollen
$gruppen = @(
'Gruppe1'
'Gruppe2'
)
# Zusätzliche AD-Eigenschaften des Users definieren welche ausgelesen werden sollen
$additionalProperties = @(
'Department'
'PostalCode'
)
# Alle endgültigen Eigenschaften für die Tabelle festlegen
$columns = @(
'Name'
'SamAccountName'
'SID'
'Department'
'PostalCode'
'HomePage'
)
# ----------------------
# Bild zu Base64 Data konvertieren
$b64 = "data:image/$([System.IO.Path]::GetExtension($logo).substring(1));base64," + [convert]::ToBase64String((Get-Content $logo -Encoding byte))
$date = get-date -F 'dd-MM-yyyy HH:mm:ss'
$all = @()
$gruppen | %{
#Gruppenmitglieder rekursiv auslesen
$mitglieder = @()
$mitglieder += Get-AdGroupMember $_ -Recursive
# Fix um Gruppenmitglieder der Standard Domaingruppen zu erfassen
$mitglieder += Get-ADGroupMember $_ -EA SilentlyContinue | ?{$_.objectClass -eq "group"} | Get-ADGroupMember -Recursive
# Felder der weiteren Eigenschaften anlegen
$additionalProperties | %{Add-Member -InputObject $mitglieder -MemberType NoteProperty -Name $_ -Value ''}
foreach($member in $mitglieder){
$props = get-aduser $member.SamAccountName -Properties $additionalProperties | select $additionalProperties
$additionalProperties |%{$member.($_) = $props.($_)}
}
$mitglieder = $mitglieder | sort Name | select -Unique
$all += New-Object PSObject -Property @{Gruppe=$_;Mitglieder=$mitglieder}
}
$html = @"
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Berechtigungen</title>
<style type="text/css">
body {
font-family: Verdana, Geneva, sans-serif;
font-size: 13px;
}
H1{font-size:1.8em}
table td {
vertical-align:middle;
}
th {
text-align: left;
background-color: #666;
color: white;
height: 20px;
padding: 5px;
}
tr.bodyrow td{
height: 20px;
border-bottom-width: 1px;
border-bottom-style: dashed;
border-bottom-color: #CCC;
}
tr.grouprow td {
height: 20px;
border-bottom-width: 1px;
border-bottom-style: dashed;
border-bottom-color: #CCC;
background-color: #96B0F5;
padding: 2px;
font-weight: bold;
color: #333;
}
</style>
</head>
<body>
<img src="$b64"/>
<h1>Übersicht der Gruppenmitglieder</h1>
<p>
$date
</p>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
$($columns |%{
"<th>$_</th>"
})
</tr>
$($all | %{
@"
<tr class="grouprow">
<td colspan="$($columns.length)">$($_.Gruppe) / ( $($_.Mitglieder.length) Mitglieder)</td>
</tr>
"@
$($_.Mitglieder | %{
$m = $_
@"
<tr class="bodyrow">
$($columns | %{
"<td>$($m.$_)</td>"
})
</tr>
"@
})
})
</table>
<p>
<strong>Gesamtanzahl der User aus allen Gruppen:</strong> $($all.Mitglieder.Length)
</p>
</body>
</html>
"@ | out-file $htmlfile -Encoding UTF8
start-process $htmlfile
Nein, habe das hier nur lokal getestet, deswegen, aber kannst du ja einfach wieder einbauen.
Ebenfalls ein schönes Wochenende
Grüße Uwe
Ebenfalls ein schönes Wochenende
Grüße Uwe
So hat geklappt, ist klar dass das Unique nicht funktioniert hat. Er hat es ja nur auf die Gruppen angewandt.
Dann hast du es an der falschen Stelle angewandt, vermutlich auf $all, da wäre das klar.Aber für die Gesamtanzahl der User kannst du auch folgendes hernehmen:
($all.mitglieder.SamAccountName | select -Unique).Length
Moin again du Nudel ,
dafür fügst du einfach im zweiten Skript noch der Variablen $aditionalProperties die Eigenschaft Enabled hinzu. Diese sagt aus ob ein Benutzeraccount aktiviert oder deaktiviert ist ($true / $false)
Dann filterst du die User einfach am Schluss bevor sie zur Variablen $all hinzugefügt werden noch zusätzlich mit
Fertig.
Grüße Uwe
dafür fügst du einfach im zweiten Skript noch der Variablen $aditionalProperties die Eigenschaft Enabled hinzu. Diese sagt aus ob ein Benutzeraccount aktiviert oder deaktiviert ist ($true / $false)
$additionalProperties = @(
'Department'
'PostalCode'
'Enabled'
)
$mitglieder = $mitglieder | ?{$_.Enabled -eq $true} | sort Name | select -Unique
Grüße Uwe
für Get-ADuser gibt es keine Properties, die anzeigen lassen, ob ein Account abgelaufen ist.
Doch die Eigenschaft gibt es..., lautet AccountExpirationDateBeispiel
get-aduser -Filter * -Properties AccountExpirationDate | ?{$_.Enabled -and ($_.AccountExpirationDate -eq $null -or $_.AccountExpirationDate -gt (get-date))}
Klasse Script @colinardo
Spende folgt :D
Gibt es denn soetwas auch als Computerabfrage mit jeweiligen installierten Programmen?
Spende folgt :D
Gibt es denn soetwas auch als Computerabfrage mit jeweiligen installierten Programmen?
Bitte
Grüße Uwe
Spende folgt :D
Danke Dir Das gibt extra Kugeln beim Italiener...Gibt es denn soetwas auch als Computerabfrage mit jeweiligen installierten Programmen?
Kann man selbstverständlich auch machen, aber das gehört ja nicht in diesen Thread.Grüße Uwe