user2367
Goto Top

Zeiten von Servern abfragen und anschließend ordentlich formatiert per Email senden

Moin Administrator Forum,

ich habe zu meinem Problem in diesem Forum schon viel Hilfe gefunden, und wende mich daher jetzt mit meinem letzten kleinen Problem an euch.
Aber erst Mal von Anfang an:

Problem:
Auf den Servern sind Zeitunterschiede aufgetreten, die zu einigen Problemen geführt haben. Eigentlich sollten die Server ihre Zeit ja regelmäßig vom unternehmenseigenen Zeitserver abfragen, dass haben viele aber nur erstmalig beim Start gemacht. Die Server, die dann schon einige hundert Tage ohne Reboot online waren, hatten dann ganz andere Uhrzeiten.
Daher möchte ich mir jetzt täglich eine Email senden lassen mit den aktuellen Serverzeiten, hier mein aktuelles Skript:

 cd "C:\Display Server Time"  
FOR /F %%z IN (server.txt) DO net time \\%%z >>times.txt

fgrep -v "The command completed" times.txt>newtimes.txt  

@echo off & setlocal enabledelayedexpansion
set "Datei=newtimes.txt"  
set "Von=Current Time at \\"  
set "Nach="  

set "t=%temp%\text.tmp"  
if exist "%t%" del "%t%"  
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & set "Line=!Line:%Von%=%Nach%!" & >>"%t%" echo !Line!  
move "%t%" "%Datei%"  

@echo off & setlocal enabledelayedexpansion
set "Datei=newtimes.txt"  
set "Von=is"  
set "Nach=						"  

set "t=%temp%\text.tmp"  
if exist "%t%" del "%t%"  
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & set "Line=!Line:%Von%=%Nach%!" & >>"%t%" echo !Line!  
move "%t%" "%Datei%"  

blat.exe
blat newtimes.txt -tf recipients.txt -subject "Aktuelle Serverzeiten"   
del times.txt
del newtimes.txt 

Ich habe zwei txt Dateien im Vorfeld angefertigt, die Server.txt enthält alle Server, die recipients.txt alle Empfänger.

Die erste For Schleife führt für jeden eingetragenen Server net time aus und leitet die Ausgabe in die times.txt.
Anschließend lösche ich den für mich unnötigen Satz The command completed mit frgep und erstelle die neue txt newtimes.txt.
Dann lösche ich noch die Wörter Current time at und ersetze is durch mehrere Tabstopps.

Dadurch wird aus der unformatierten Ausgabe
 
Current time at \\sap01 is 08.12.2015 08:45:02

The command completed successfully.

Current time at \\sap02 is 08.12.2015 08:45:02

The command completed successfully.
sap01 						 08.12.2015 08:45:02
sap02 						 08.12.2015 08:45:02 

Die Email versende ich anschließend einfach mit blat, klappt einwandfrei.

Das Problem:
Wenn der Servername zu lang ist, rutscht die Zeit zu weit nach rechts:
sql01 						 08.12.2015 08:45:02
saperion01 						 08.12.2015 08:45:02
sap01 						 08.12.2015 08:45:02
testerv01 						 08.12.2015 08:45:04
sap02 						 08.12.2015 08:45:02

Nun hätte ich aber gerne, das alle Zeiten schön übersichtlich untereinander in einer Reihe stehen face-smile
Leider komme ich nicht weiter, mit den Tabstopps die ich einfüge wird das Ganze ja einfach weiter nach rechts verschoben..
Würde ich das ganze per Hand machen, würde ich mit Excel Daten in Spalten benutzen und gut ist. Allerdings kenne ich keine Skript Funktion, die mir so etwas machen könnte.

Es wäre echt super wenn Ihr mir bei dem letzten Feinschliff helfen könntet! face-smile

Vielen Dank und schöne Grüße,
user2367

Content-Key: 290360

Url: https://administrator.de/contentid/290360

Printed on: April 28, 2024 at 06:04 o'clock

Mitglied: 114757
114757 Dec 08, 2015 updated at 10:56:40 (UTC)
Goto Top
Powershell EInzeiler:
gc 'c:\servers.txt' | ?{Test-Connection -ComputerName $_ -Count 1 -Quiet} | %{"$_ = " + ((gwmi -Computername $_ Win32_OperatingSystem) | %{$_.ConverttoDateTime($_.LocalDateTime)})} | out-file 'C:\zeiten.txt'  

Mit
wmic /node:HOSTXYZ os get localdatetime /format:csv
kommst du auch zuverlässig an die Zeit, ohne dieses Stringauslesegedöhns ...,was sich übrigens hiermit machen lässt:
for /f "tokens=6,7" %%a in ('net time \\localhost ^| findstr ":"') do @echo %%a %%b

Die Server vernünftig zu konfigurieren wäre aber Zielgerichteter...

Gruß jodel32
Member: Pjordorf
Pjordorf Dec 08, 2015 at 10:50:32 (UTC)
Goto Top
Hallo,

Zitat von @user2367:
Auf den Servern sind Zeitunterschiede aufgetreten
Wie sind die Server Konfiguriert - eine Domäne - jeder macht eigene Domäne - Workgroup - jeder tut was er will?

Eigentlich sollten die Server ihre Zeit ja regelmäßig vom unternehmenseigenen Zeitserver abfragen
Aber nur wenn entsprechend Konfiguriert bzw. die Voraussetzungen stimmen.

dass haben viele aber nur erstmalig beim Start gemacht.
Normales Verhalten von Server beim Starten.

Die Server, die dann schon einige hundert Tage ohne Reboot online waren, hatten dann ganz andere Uhrzeiten.
Vermutlich weil die keinen Zeit Server fanden oder nicht erreichen konnten. Steht im Ereignisprotokoll schön drin.

Daher möchte ich mir jetzt täglich eine Email senden lassen mit den aktuellen Serverzeiten, hier mein aktuelles Skript:
Man könnte auch die Server richtig konfigurieren....

https://technet.microsoft.com/en-us/library/cc773263(v=ws.10).aspx
https://technet.microsoft.com/en-us/library/cc773013(v=ws.10).aspx
https://technet.microsoft.com/de-de/library/cc816748(v=ws.10).aspx
https://technet.microsoft.com/en-us/library/cc786897(v=ws.10).aspx
http://www.timetoolsglobal.com/2013/06/21/how-to-synchronize-microsoft- ...
http://blogs.technet.com/b/nepapfe/archive/2013/03/01/it-s-simple-time- ...

http://serverfault.com/questions/307398/how-can-i-sync-time-between-two ...
http://superuser.com/questions/577495/how-can-i-sync-date-time-in-two-c ...
http://stackoverflow.com/questions/389417/synchronization-of-clocks-bet ...
http://www.howtogeek.com/tips/how-to-sync-your-linux-server-time-with-n ...
http://askubuntu.com/questions/254826/how-to-force-a-clock-update-using ...
http://www.tecmint.com/how-to-synchronize-time-with-ntp-server-in-ubunt ...

Gruß,
Peter
Member: user2367
user2367 Dec 09, 2015 updated at 12:40:51 (UTC)
Goto Top
Hallo Jodel32,

erst Mal danke für die Antwort.
ich versuche gerade deinen Powershell Einzeiler zum laufen zu kriegen, scheitere aber leider.
Bin noch ziemlich neu im Skripte schreiben und kenne mich daher leider noch nicht so aus..

Hier mein, mit den richtigen Pfaden, angepasster Code:
Get-Content 'C:\Users\admin\Desktop\dps\server.txt' | ?{Test-Connection -ComputerName $_ -Count 1 -Quiet} | %{"$_ = " + ((gwmi -Computername $_ Win32_OperatingSystem) | %{$_.ConverttoDateTime($_.LocalDateTime)})} | out-file 'C:\Users\admin\Desktop\dps\zeiten.txt'  


Folgende Ausgabe erscheint dann bei Ausführung in Powershell:
Test-Connection : Invalid parameter
At line:1 char:91
+ Get-Content 'C:\Users\admin\Desktop\dps\server.txt' | Foreach-Object {Test-Connection <<<<  -Compute  
unt 1 -Quiet} | %{"$_ = " + ((gwmi -Computername $_ Win32_OperatingSystem) | %{$_.ConverttoDateTime($_.Loca  
} | out-file 'C:\Users\admin\Desktop\dps\zeiten.txt'  
    + CategoryInfo          : InvalidOperation: (:) [Test-Connection], ManagementException
    + FullyQualifiedErrorId : TestConnectionException,Microsoft.PowerShell.Commands.TestConnectionCommand


Zeichen 91 ist der Teil nach ComputerName, weißt du woran das genau liegt?
Finde die Lösung leider nicht face-sad

Danke face-smile
Member: user2367
user2367 Dec 09, 2015 at 10:50:11 (UTC)
Goto Top
Moin Pjordorf,

die Server sind selbstverständlich in der gleichen Domäne, waren auch im Prinzip richtig konfiguriert, haben aber wie gesagt unglücklicherweise nur beim Start die Zeit abgefragt und anschließend nicht mehr.
Die Server wurden jetzt neu konfiguriert, trotzdem will ich um sicher zu gehen noch dieses Skript fertig basteln um das Problem in Zukunft früher zu erkennen, falls es denn überhaupt noch auftreten wird.

Gruß,
user2367
Mitglied: 114757
114757 Dec 09, 2015 updated at 11:00:18 (UTC)
Goto Top
Zitat von @user2367:
Zeichen 91 ist der Teil nach ComputerName, weißt du woran das genau liegt?
Finde die Lösung leider nicht face-sad
Wie sieht deine Textdatei aus, bzw wie ist diese aufgebaut, evt. auch in UTF8?
Funktioniert hier soweit problemlos ...
Powershell-Version ? (zeigt dir $PSVersiontable auf der PS-Konsole)
Member: user2367
user2367 Dec 09, 2015 updated at 11:54:57 (UTC)
Goto Top
Wie sieht deine Textdatei aus, bzw wie ist diese aufgebaut, evt. auch in UTF8?
Funktioniert hier soweit problemlos ...
Powershell-Version ? (zeigt dir $PSVersiontable auf der PS-Konsole)

Powershell Version ist die 2.0
Das ganze läuft auf einem Windows Server 2008 R2.


In der Server.txt Datei ist pro Zeile ein Server vorhanden:
sap01
sap02
sap03
data01
data02
...

Notepad++ zeigt mir außerdem noch an, dass es sich um UTF-8 w/o BOM handelt.
Mitglied: 114757
114757 Dec 09, 2015 updated at 12:11:22 (UTC)
Goto Top
Zitat von @user2367:

Wie sieht deine Textdatei aus, bzw wie ist diese aufgebaut, evt. auch in UTF8?
Funktioniert hier soweit problemlos ...
Powershell-Version ? (zeigt dir $PSVersiontable auf der PS-Konsole)

Powershell Version ist die 2.0
Dann erst mal Update, vollkommen veraltet und voller Fehler ...
Notepad++ zeigt mir außerdem noch an, dass es sich um UTF-8 w/o BOM handelt.
Ab PS 3.0 gibt es den Parameter -Encoding bei Get-Content, aber mal eine einfach Ausgabe der Rechnernamen in der Shell sollte Klarheit schaffen ob das die Ursache ist. Ansonsten einfach mal als ANSI speichern und durchjagen. Kommt man eigentlich auch selber drauf.
Member: user2367
user2367 Dec 09, 2015 at 12:54:51 (UTC)
Goto Top
Dann erst mal Update, vollkommen veraltet und voller Fehler ...
Werde ich mal anstoßen, habe das nicht zu entscheiden, ist aber auf jeden Fall sinnvoll.

Ab PS 3.0 gibt es den Parameter -Encoding bei Get-Content, aber mal eine einfach Ausgabe der Rechnernamen in der Shell sollte Klarheit schaffen ob das die Ursache ist. Ansonsten einfach mal als ANSI speichern und durchjagen. Kommt man eigentlich auch selber drauf.
Habe diese Server Liste nun sowohl als ANSI, als auch UTF8 gespeichert, bringt aber keinen Unterschied. Mittlerweile kommt aber nicht mehr die Invalid Parameter Fehlermeldung, sondern folgendes:
et-WmiObject : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
At line:1 char:132
+ Get-Content 'C:\Users\admin\Desktop\dps\server.txt' | ?{Test-Connection -ComputerName $_ -Count 1 -Quiet} | %{"$  
_ = " + ((gwmi <<<<  -Computername $_ Win32_OperatingSystem) | %{$_.ConverttoDateTime($_.LocalDateTime)})} | out-file '  
C:\Users\admin\Desktop\dps\zeiten.txt'  
    + CategoryInfo          : NotSpecified: (:) [Get-WmiObject], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

Werde ich nicht schlau draus, denn wenn ich Test-Connection manuell ausführe wird der Zugriff nicht verweigert..
Mitglied: 114757
114757 Dec 09, 2015 updated at 15:38:52 (UTC)
Goto Top
Werde ich nicht schlau draus, denn wenn ich Test-Connection manuell ausführe wird der Zugriff nicht verweigert..
Das liegt auch nicht an Test-Connection sondern an Get-WMIObject, sagt die Fehlermeldung ja auch ...
Du hast mit deinem Account nicht genügend Rechte um per WMI die Clients remote abzufragen, das ist der Grund !!
Die Clients müssen natürlich ebenfalls per WMI remote verwaltbar sein (Firewall Regeln der Clients checken).
Member: user2367
user2367 Dec 15, 2015 at 07:03:13 (UTC)
Goto Top
Das liegt auch nicht an Test-Connection sondern an Get-WMIObject, sagt die Fehlermeldung ja auch ...
Du hast mit deinem Account nicht genügend Rechte um per WMI die Clients remote abzufragen, das ist der Grund !!
Die Clients müssen natürlich ebenfalls per WMI remote verwaltbar sein (Firewall Regeln der Clients checken).

Das macht natürlich Sinn...

Mittlerweile habe ich eine Art provisorische Lösung für mich gefunden:
Ich speichere die Server in zwei separaten Text Dateien - eine für die längeren Server Namen und eine für die Kurzen.
Im Skript lasse ich bei den langen Servern dann einfach einen Tabstopp weg.
Ja ich weiß, das ist kein schönes Coding aber es funktioniert und das ist die Hauptsache :D

Vielen Dank an alle für eure Hilfe!
Mitglied: 114757
114757 Dec 15, 2015 updated at 08:24:29 (UTC)
Goto Top
*Koppschüttel*

Dann bitte noch ein gelöst hinten dran. Danke.