Jump to content

mamamia

Members
  • Gesamte Inhalte

    312
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von mamamia

  1. Also wenn du einen logischen Algorithmus "erfinden" kannst, dann lässt sich sowas sicherlich abbilden.

     

    Allerdings läuft so ein Script immer nur zyklisch ab, du kannst einkommende Mails also nicht direkt ansprechen und bearbeiten.

     

    Mit Powershell kannst du wie folgt ein Postfach ansprechen:

    $outlook 	= new-object -com Outlook.Application
    $namespace 	= $outlook.GetNamespace("MAPI")
    $inbox 		= $outlook.Session.GetDefaultFolder(6)
    

     

    An die Mails kommst du dann so ran:

    $Items 	= $objFolder.Items
    foreach ($Item in $Items) {
    
    }
    

     

    In das foreach müssten jetzt deine Filter platziert werden, damit die Mails verschoben werden können.

     

    Aber möglicherweise macht es hier mehr Sinn, sich von Outlook zu verabschieden und in Richtung eines Ticketsystems zu gehen oder ähnliches.

  2. Das Script:

    # Region Description
    #
    # Name:		checkServerUpdateState
    # Author:	Markus Frank
    # Version:	0.2 { $_ -Like '*Reboot Pending*' -or $_ -Like '*RebootRequired=1*' } hinzugefügt, um DC´s abzufragen
    #		0.1 initiale Version
    # Description:	prüft auf allen Servern den Stand der Windows Updates
    # 
    # EndRegion
    
    Add-PSSnapin *Quest*
    
    Clear
    
    $sendmail 	= $true
    $BodyHeader = "Folgende Server sind noch nicht geupdated bzw neugestartet:`r`r"
    $Body 		= ""
    $allServer 	= 0
    
    # definieren der Server
    $Server = Get-QADComputer -SearchRoot 'OU=Domain Controllers,DC=domain,DC=local' -Name "DE-DC*"
    $Server = $Server + (Get-QADComputer -SearchRoot 'OU=DE,OU=Luetze Group,DC=domain,DC=local' -OSName "*Windows Server*")
    
    # start der Abfrage
    $Server | Sort-Object Name | Group-Object managedby | ForEach-Object {
    if ($_.Name) {
    	$Name  = (Get-QADObject $_.Name).displayname
    	$email = (Get-QADObject $_.Name).email
    } else {
    	$Name = "ohne Zuordnung"
    }
    $BodyOwner = "$Name`r"
    $ServerCount = 0
    $_.Group | ForEach-Object {
    	#prüfen ob Host erreichbar ist
    	if (Test-Connection -ComputerName $_.Name -Quiet -Count 1) {
    		# Anzahl Updates ermitteln
    		$strcomputer = $_.Name
    		$WSUSLog_Reboot_Time = ""
    		$WSUSLog_Reboot_Time = ""
    
    		# letzte Zeile Pending Reboot auslesen				
    		$path1 = "\\$strComputer\c$\windows\windowsupdate.log"
    		$WSUSLog_Reboot = Get-Content $Path1 -Encoding UTF8 | Where-Object { $_ -Like '*Reboot Pending*' -or $_ -Like '*RebootRequired=1*' } | Select -Last 1
    		$WSUSLog_Reboot = $WSUSLog_Reboot.Split("`t")
    		$WSUSLog_Reboot_Time = $WSUSLog_Reboot[0]+" "+$WSUSLog_Reboot[1].Substring(0,8)
    		$WSUSLog_Reboot_Time = Get-Date $WSUSLog_Reboot_Time
    
    		# letzte Zeile Updates detected auslesen
    		$WSUSLog_Updates = Get-Content $Path1 -Encoding UTF8 | Where-Object { $_ -Like '*updates detected*' } | Select -Last 1
    		$WSUSLog_Updates = $WSUSLog_Updates.Split("`t")
    		$WSUSLog_Updates_Time = $WSUSLog_Updates[0]+" "+$WSUSLog_Updates[1].Substring(0,8)
    		$WSUSLog_Updates_Time = Get-Date $WSUSLog_Updates_Time
    
    		# Datum vergleichen
    		if ($WSUSLog_Reboot_Time -ge $WSUSLog_Updates_Time) {
    			$BodyOwner = $BodyOwner + " " + $_.Name + "`t" + $_.description + " | muss neugestartet werden`r"
    			$ServerCount++
    			$allServer++
    		} else {
    			$WSUSLog_Updates = $WSUSLog_Updates[5].Split(" ")
    			# wenn mehr als 0 Updates anstehen, ausgeben
    			if ($WSUSLog_Updates[3] -gt 0) {
    				$BodyOwner = $BodyOwner + " " + $_.Name + "`t" + $_.description + " | " + $WSUSLog_Updates[3] + " neue(s) Update(s) anstehend`r"
    				$ServerCount++
    				$allServer++
    			}
    		}
    	}
    }
    # Zusammenfassung senden, für einzelne User
    if (($sendmail) -and ($ServerCount -gt 0)) {
    	Send-MailMessage 	-From "WSUS Computer Status<wsusstatus@domain.local>" -To "email@domain.local" `
    						-Subject "aktueller Stand Windows Updates Server $Name" `
    						-Body "$BodyHeader$BodyOwner" -SmtpServer "smtp.domain.local"
    }						
    if ($ServerCount -gt 0) {
    	$Body = $Body + $BodyOwner + "`r"
    }
    }
    # Zusammenfassung senden für alle User und Server
    if (($sendmail) -and ($allServer -gt 0)) {
    Send-MailMessage 	-From "WSUS Computer Status<wsusstatus@domain.local>" -To "email@domain.local" `
    					-Subject "aktueller ServerStatus Windows Updates" `
    					-Body "$BodyHeader$Body" -SmtpServer "smtp.domain.local"
    } else {
    Write-Host $BodyHeader$Body
    }
    
    
    

  3. Hallo Board,

     

    ich stand vor dem Problem, mir eine Übersicht zu verschaffen, welcher Server gerade welchen Updatestatus hat.

    Es ist so, dass nach dem Freigeben der Updates man in einer großen Farm und mit mehreren Admins die Übersicht verliert, auf welchem Server noch Interaktionen zu tätigen sind (Updates installieren, Neustarten, Nacharbeiten, oder eben nix).

     

    Es ist bei uns so, dass Updates mit einem Monat Verzögerung ausgerollt werden und auf den Servern manuell installiert werden müssen. Daher kann mir die WSUS Konsole keine genauen Daten liefern.

     

    Ich habe mir also ein Script geschrieben, welches die \windowsupdate.log auf den Servern parst und mir dann alles detailliert ausgibt oder eine eMail versendet.

     

    Zudem wurden den Computerobjekten noch Besitzer (die jeweiligen Admins) zugewiesen, damit jeder über seine Server informiert ist. Es geht aber auch ohne!

     

    Benötigt werden die ActiveRoles von Quest (PowerShell Commands (CMDLETs) for Active Directory by Quest Software)

     

    Die Ausgabe sieht wie folgt aus:

    Folgende Server sind noch nicht geupdated bzw neugestartet:
    
    Admin A
     ServerA01 11 neue(s) Update(s) anstehend
     ServerA02 10 neue(s) Update(s) anstehend
     ServerA03 13 neue(s) Update(s) anstehend
     ServerA04 muss neugestartet werden
    Admin B
     ServerB01 11 neue(s) Update(s) anstehend
     ServerB02 10 neue(s) Update(s) anstehend
     ServerB03 13 neue(s) Update(s) anstehend
     ServerB04 muss neugestartet werden
    

     

    Wir haben es noch mit einem geplanten Task verknüpft und bekommen so eine aktuelle Übersicht des Updatestatus per eMail.

     

    Vielleicht kann es ja jemand gebrauchen. Gegen ein bisschen Feedback hätte ich nix einzuwenden ;)

  4. Servus,

     

    ich geb hier mal meine Version davon zum besten!

     

    ' Region Description
    '
    ' Name:			deployFonts.vbs
    ' Author:		mamamia
    ' Version:		0.3
    ' Description:	kopiert Fonts von $Fontspath zu den Systemfonts
    ' 
    ' 
    ' EndRegion
    
    Set objNetwork 	= CreateObject("WScript.Network")
    Set objShellApp	= CreateObject("Shell.Application")
    Set WSHShell	= CreateObject("WScript.Shell")
    Set oFileSys	= CreateObject("Scripting.FileSystemObject")
    Computer		= UCase(objNetwork.ComputerName)
    
    Function deplyFonts (FontsPath)
    Set objFolder 	= objShellApp.Namespace(FontsPath)
    SystemFonts		= WSHShell.ExpandEnvironmentStrings("%Systemroot%") & "\Fonts\"
    Set Folder 		= oFileSys.GetFolder(FontsPath)	
    
    For Each File In objFolder.Items
    	' Nur Files mit der Endung "ttf" lesen
    	If UCase(Right(File.Path, 3)) = "TTF" Then
    		' wenn Font auf dem System noch nicht vorhanden ist, kopieren
    		If Not oFileSys.FileExists(SystemFonts & File.Name & ".TTF") Then
    			objShellApp.Namespace(SystemFonts).CopyHere File
    		Else
    			'prüfen ob eine neuere Version auf dem Server liegt	
    			Set DestFile	= oFileSys.GetFile(File.Path)
    			Set SourceFile 	= oFileSys.GetFile(SystemFonts & File.Name & ".TTF")
    
    			If SourceFile.DateCreated <> DestFile.DateCreated Then
    				oFileSys.CopyFile File.Path, SystemFonts, vbTrue
    			End If	
    		End If
    	End If
    Next
    
    End Function
    
    deplyFonts("\\pfad\zu\den\Fonts")
    

     

    - es wird geprüft ob die Schriften schon auf dem System vorhanden sind

    - bei vorhanden sein, wird auf eine mögliche neue Version geprüft (Update der Fonts)

  5. Hier die Powershelllösung:

    # Region Description
    #
    # Name:		mapNetworkprinter
    # Author:	mamamia
    # Version:	0.1
    # Description:	Netzwerkdrucker werden gemäß Gruppenzugehörigkeit gemappt
    # 
    # EndRegion
    
    Add-PSSnapin *Quest*
    
    $net = new-Object -com WScript.Network
    Get-QADMemberOf $ENV:USERNAME -Indirect -Name 'DE-P*' | foreach {$net.AddWindowsPrinterConnection("\\Printserver\"+$_.Name)}
    

     

    Das PS-Script ist noch in der Entwicklung ;)

     

    Ich finde, dass ist auch ein recht ansehnlicher Vergleich, zwischen Powershell und WSH, wie viel einfacher hier doch einiges ist!

    Auf die Prüfung von vorhanden sein der Drucker habe ich verzichtet, da die Funktionen dies selber tun.

    Sollte ein Netzwerkdrucker gemappt sein, dann wird dieser übersprungen.

  6. Servus,

     

    gleich eins vorweg, ich weiss im 2k8R2 gehts auch über GPO´s ;)

    Möchte hier aber mal meine Lösungen für alle anderen Vorstellen.

     

    Vorraussetzungen: Powershell 2.0 (+Quest CMDLETs), WSH, AD Gruppen für die Druckerzuordnung

     

    Die AD Gruppen werden wie die Drucker benannt, User oder Abteilungsgruppen dann den Druckergruppen hinzugefügt:

    Drucker-Gruppen-Namen:

    DE-P-IT-001

    DE-P-IT-002

    DE-P-IT-003

    ...

     

    Beim Anmelden wird dann geprüft, in welcher Gruppe der User direkt oder indirekt (Group nesting) Mitglied ist.

     

    Hier die WSH Lösung:

    ' Region Description
    '
    ' Name:			performPrinterInstallation
    ' Author:		mamamia
    ' Version:		0.4
    '			0.4 | Anpassung an neue Firma
    '			0.3 | Gruppenzugehörigkeit in eigenes Array verlagert
    '			0.2 | Multidomänfahig gemacht
    '			0.1 | Grundscript
    ' Description:	Verteilt Drucker anhand von Zugehörigkeit einer Druckergruppe
    ' 
    ' 
    ' EndRegion
    
    Set objNetwork 	= CreateObject("WScript.Network")
    Set WSHShell	= CreateObject("WScript.Shell")
    Set oFileSys 	= CreateObject("Scripting.FileSystemObject")
    Set objcon 		= CreateObject("ADODB.Connection")
    
    name 		= WSHShell.ExpandEnvironmentStrings("%USERNAME%")
    PrintServer		= "\\Printserver\"
    Domain 		= objNetwork.UserDomain	
    
    Dim strLDAPQuery
    Dim objcon
    strPrinterOU = "<LDAP://OU der Drucker>;(&(objectClass=group)); distinguishedName,name;subtree"
    
    ' Falls Variablen nicht gesetzt wurden, Script beenden
    If strLDAPQuery = "" Or strPrinterOU = "" Then
    WScript.Quit
    End If
    
    On Error Resume Next
    ' Userobjekt deklarieren um auf Attribute zugreifen zu können
    objcon.Open "Provider=ADSDSOObject"
    Set rs 		= objcon.Execute(strLDAPQuery)
    Set objUser = GetObject(rs("adspath"))
    If Err.number <> 0 Then
    WScript.Quit
    End If
    On Error Goto 0
    
    Dim UserGroups()
    
    If IsArray(objUser.memberOf) = 0 Then
    ReDim UserGroups(1)
    UserGroups(0) = objUser.memberOf
    Else
    ReDim UserGroups(UBound(objUser.memberOf))
    I = 0
    For Each Group In objUser.memberOf
    	UserGroups(I) = Group
    	I = I + 1
    Next
    End If
    
    ' OU Auslesen um Drucker Gruppen zu ermitteln
    Set objCommand = CreateObject("ADODB.Command")
    objCommand.ActiveConnection = objcon
    objCommand.CommandText = strPrinterOU
    Set objRecordSet = objCommand.Execute
    
    ' Prüfen ob User in einer DruckerGruppe ist oder eine Gruppe in der DruckerGruppe in der der User Mitglied ist
    ' Bsp1: User direkt in Gruppe DE-P-IT-001
    ' Bsp2: User in der Gruppe DE-DG-IT; DE-DG-IT Mitglied der Gruppe DE-P-IT-001
    
    While Not objRecordSet.EOF
    Set objGroup = GetObject ("LDAP://" & objRecordSet.Fields("distinguishedName"))
    objGroup.GetInfo
    ' wenn User keine Gruppenmitgliedschaft hat
    
    On Error Resume Next
    	arrMembersOf = objGroup.GetEx("member") ' wenn DruckerGruppe keine Mitglieder enthält gibt es einen Runtimeerror, der wird hier abgefangen
    	FehlerCode = Err.number
    On Error Goto 0
    If Not FehlerCode <> 0 Then
    	For Each Group In UserGroups
    		If Group = objRecordSet.Fields("distinguishedName") Then ' Wenn User in einer PrinterGruppe
    			installPrinter objRecordSet.Fields("name")
    			gefunden = True
    		End If
    	Next
    	If gefunden = False Then
    		For Each strMemberOf In arrMembersOf
    			For Each Group In UserGroups
    				If Group = strMemberOf Then	' Wenn eine Gruppe in der der User ist Mitglied ist
    					installPrinter objRecordSet.Fields("name")
    				End If
    			Next
    		Next
    	End If
    End If
    gefunden = False
    objRecordSet.MoveNext	
    Wend
    objcon.Close 
    WScript.Quit
    
    Function installPrinter (PrinterName)
    Err.Clear
    On Error Resume Next
    	objNetwork.AddWindowsPrinterConnection PrintServer & PrinterName
    	FehlerNr = Err.number
    	Fehler   = Err.Description
    On Error Goto 0
    
    Select Case FehlerNr
    	Case "-2147023095"
    		Fehler = "Gruppe in AD entspricht nicht dem Druckernamen. Schreibweise prüfen!"
    End Select
    End Function
    
    

  7. Hier mein Script dazu:

     

    ' Region Description
    '
    ' Name:		deployFonts.vbs
    ' Author:		mamamia
    ' Version:		0.2
    '			0.2 | Registrierung der Schriftarten hinzugefügt
    ' Description:	kopiert Fonts von $Fontspath zu den Systemfonts
    ' 
    ' 
    ' EndRegion
    
    Set objNetwork 	= CreateObject("WScript.Network")
    Set objShellApp	= CreateObject("Shell.Application")
    Set WSHShell	= CreateObject("WScript.Shell")
    Set oFileSys	= CreateObject("Scripting.FileSystemObject")
    
    Computer		= UCase(objNetwork.ComputerName)
    
    Function deplyFonts (FontsPath)
    
    Set objFolder 	= objShellApp.Namespace(FontsPath)
    SystemFonts	= WSHShell.ExpandEnvironmentStrings("%Systemroot%") & "\Fonts\"
    Set Folder 		= oFileSys.GetFolder(FontsPath)	
    For Each File In objFolder.Items
    	' Nur Files mit der Endung "ttf" lesen
    	If UCase(Right(File.Path, 3)) = "TTF" Then
    		' wenn Font auf dem System noch nicht vorhanden ist, kopieren
    		If Not oFileSys.FileExists(SystemFonts & File.Name) Then
    			oFileSys.CopyFile File.Path, SystemFonts, True
    			' Schriftart registriern, damit diese von Programmen gefunden wird
    			If (objFolder.GetDetailsOf(File, 21) <> "") Then
    				WSHShell.RegWrite "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Fonts" & objFolder.GetDetailsOf(File, 21), UCase(File.Name), "REG_SZ"
    			Else 
    				WSHShell.RegWrite "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Fonts" & File.Name, UCase(File.Name), "REG_SZ"
    			End If
    			'prüfen ob eine neuere Version auf dem Server liegt	
    		Else
    			Set DestFile	= oFileSys.GetFile(File.Path)
    			Set SourceFile 	= oFileSys.GetFile(SystemFonts & File.Name)
    
    			If SourceFile.DateCreated <> DestFile.DateCreated Then
    				oFileSys.CopyFile File.Path, SystemFonts, True
    				' Schriftart registriern, damit diese von Programmen gefunden wird
    				If (objFolder.GetDetailsOf(File, 21) <> "") Then
    					WSHShell.RegWrite "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Fonts" & objFolder.GetDetailsOf(File, 21), UCase(File.Name), "REG_SZ"
    				Else 
    					WSHShell.RegWrite "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Fonts" & File.Name, UCase(File.Name), "REG_SZ"
    				End If
    			End If	
    		End If
    	End If
    Next
    
    End Function
    
    ' Allgemeine Fonts für Alle installieren
    deplyFonts("\\PFAD\Fonts\ALLE")
    
    ' Fonts für KE und MA installieren (wenn KE oder MA im Rechnernamen vorhanden)
    If (InStr(Computer, "KE") Or InStr(Computer, "MA")) Then
    deplyFonts("\\PFAD\Fonts\KE")
    End If
    
    
    WScript.Quit
    

     

    Fonts werden geprüft ob Sie installiert sind, wenn nicht, werden diese kopiert und in der Registry registriert und wenn eine neuere Version des Fonts vorhanden ist, dann wird dieser aktualisiert.

     

    Zudem Möglichkeit für differenzierte Verteilung nach Kriterien!

     

    Viel Spass damit!

  8. Hallo,

     

    wir wollen unsere Konferenzräume freigeben, damit man sieht, wer wann welchen Raum gebucht hat. Mehr aber auch nicht.

     

    Wenn wir jetzt unter Kalenderberechtigungen den Standard auf Stufe 2 berechtigen, dann können alle User den Termin öffnen und sehen wer mit wem einen Termin (Termin öffnen >> Terminplanungsassisten) hat.

     

    Das ist sehr ungünstig. Nehmen wir als Beispiel Personalgespräch.

    Wenn da jetzt der Abteilungsleiter + ein MA drin stehen und das kann jeder lesen, dann ist das sehr schlecht.

     

    Kann man es so einstellen, dass die User nur die Kalenderübersicht sehen, aber den Termin nicht öffnen können?

  9. Hi Leute,

     

    habe ne kleine PS-Frage.

    Ich möchte bestimmte Gruppen für ein Userobjekt entfernen, bzw den User aus den Gruppen entfernen. Habe dazu folgendes gemacht

     

    Get-QADMemberOf $User -Indirect -Name 'DE-EXDG*' | ft DN
    

    Damit bekomm ich die Gruppen, die ich brauch. Jetzt möchte ich gleich am besten mittels Pipe den User aus der Gruppe entfernen.

     

    Logisch würde ich das so irgendwie machen:

    Get-QADMemberOf $User -Indirect -Name 'DE-EXDG*' | ft DN | Remove-QADMemberOf $User -Group $_
    

     

    Sodass quasi das Ergebnis übergeben wird. Funktioniert allerdings leider nicht.

    Hoffentlich ist mein Denkfehler nicht zu derb ;)

     

    Wie macht man sowas am elegantesten?

     

    Danke im voraus!

  10. obwohl der Testcenter 20 EUR teuerer ist?

     

    Naja... das muss ich dann wohl in Kauf nehmen. Ist mir lieber als jetzt direkt bei Prometric zahlen zu müssen!

     

    Danke!!

     

    Warum ist das so schlimm??

    Ist doch am Ende egal, wem du dein Geld in den Rachen schiebst!

     

    Ich zahl das immer mit Kreditkarte und gut iss..

     

    Gebucht - Bezahlt - Bestanden ;)

  11. Hallo zusammen,

     

    ich habe mich auch für die Prüfung angemeldet und bin fleißig am lernen.

    Wie ist die neue Prüfung denn aufgebaut? Ich habe hier gelesen, dass es 2 Prüfungsergebnisse gibt? Kann mir das einer erklären wieso es 2 Ergebniss gibt?

     

    Das iss ne Kombinationsprüfung.

    Baut sich folgendermaßen zusammen:

     

    70-640: TS: Windows Server 2008 Active Directory, Konfigurieren

    • Konfigurieren der Serverfunktionen (30 Prozent)

    • Verwalten der Active Directory-Umgebung (32 Prozent)

    • Konfigurieren der Active Directory-Infrastruktur (38 Prozent)

     

    70-642: TS: Windows Server 2008 Netzwerkinfrastruktur, Konfigurieren

    • Konfigurieren des Netzwerkzugriffs (49 Prozent)

    • Bereitstellen von Servern (51 Prozent)

     

    Die 70-648 = 70-642 + 70-640

     

    Das ganze dann in 2 Teilen.

    Einer mit 27 und einer mit 30(?) Fragen. Weiss nicht mehr genau.

×
×
  • Neu erstellen...