Für WMI-Abfragen ist es oft sinnvoll anhand des Betriebssystems bestimme GPOs zuzuordnen. Die Build-Nummer ist hierfür sehr gut geeignet
WINS aus NIC-Config löschen
folgendes Batch-Script löscht die WINS-Konfiguration von allen verbundenen Netzwerkkarten:
@echo off FOR /F "skip=2 tokens=4*" %%a IN ('NetSh.exe Interface IP Show Interface') DO ( if "%%a"=="connected" ( rem echo "%%b - %%a" netsh interface ipv4 set winsservers name="%%b" static none ) ) exit /B
„skip“ könnte hier auch weggelassen werden. Die Verarbeitung läuft trotzdem, da auf „connected“ geprüft wird.
Sollen alle NICs umkonfiguriert werden, sollte man „skip“ korrekt angeben, damit die richtige Anzahl an Zeilen übersprungen wird. Ansonsten werden ungültige Netzwerkadapter „konfiguriert“ was Fehler hervorruft…
Wird die Zahl zu groß gewählt, werden NICs übersprungen.
Exchange 2016: Log-Files-Speicherort ändern
Mit folgendem Script werden die meisten, per default aktivierten, Log-Files auf ein anderes Volume gelegt. Im Skript wird davon ausgegeangen, das der Installations-Pfad C:\Program Files\… ist
Der „alte“ Pfad wird in der ersten Zeile Angegeben.
Der Ziel-Pfad kann in der zweiten Zeile angepasst werden.
$Source = "C:\Program Files\Microsoft\Exchange Server\V15\" $Dest = "D:\Exchange\Logs\" $Log = Get-TransportService $env:computername | select *logpath $ConnectivityLogPath = $Log.ConnectivityLogPath.PathName.replace($Source,$Dest) $MessageTrackingLogPath = $Log.MessageTrackingLogPath.PathName.replace($Source,$Dest) $IrmLogPath = $Log.IrmLogPath.PathName.replace($Source,$Dest) $ActiveUserStatisticsLogPath = $Log.ActiveUserStatisticsLogPath.PathName.replace($Source,$Dest) $ServerStatisticsLogPath = $Log.ServerStatisticsLogPath.PathName.replace($Source,$Dest) $ReceiveProtocolLogPath = $Log.ReceiveProtocolLogPath.PathName.replace($Source,$Dest) $RoutingTableLogPath = $Log.RoutingTableLogPath.PathName.replace($Source,$Dest) $SendProtocolLogPath = $Log.SendProtocolLogPath.PathName.replace($Source,$Dest) $QueueLogPath = $Log.QueueLogPath.PathName.replace($Source,$Dest) $GeneralLogPath = $Log.GeneralLogPath.PathName.replace($Source,$Dest) $WlmLogPath = $Log.WlmLogPath.PathName.replace($Source,$Dest) $AgentLogPath = $Log.AgentLogPath.PathName.replace($Source,$Dest) New-Item -itemtype directory -path $ConnectivityLogPath New-Item -itemtype directory -path $MessageTrackingLogPath New-Item -itemtype directory -path $IrmLogPath New-Item -itemtype directory -path $ActiveUserStatisticsLogPath New-Item -itemtype directory -path $ServerStatisticsLogPath New-Item -itemtype directory -path $ReceiveProtocolLogPath New-Item -itemtype directory -path $RoutingTableLogPath New-Item -itemtype directory -path $SendProtocolLogPath New-Item -itemtype directory -path $QueueLogPath New-Item -itemtype directory -path $WlmLogPath New-Item -itemtype directory -path $AgentLogPath Set-TransportService $env:computername -ConnectivityLogPath $ConnectivityLogPath -MessageTrackingLogPath $MessageTrackingLogPath -IrmLogPath $IrmLogPath -ActiveUserStatisticsLogPath $ActiveUserStatisticsLogPath -ServerStatisticsLogPath $ServerStatisticsLogPath -ReceiveProtocolLogPath $ReceiveProtocolLogPath -RoutingTableLogPath $RoutingTableLogPath -SendProtocolLogPath $SendProtocolLogPath -QueueLogPath $QueueLogPath -WlmLogPath $WlmLogPath -AgentLogPath $AgentLogPath $Log = Get-Mailboxserver $env:computername | select *logpath* $CalendarRepairLogPath = $Log.CalendarRepairLogPath.PathName.replace($Source,$Dest) $LogPathForManagedFolders = $Log.LogPathForManagedFolders.PathName.replace($Source,$Dest) New-Item -itemtype directory -path $CalendarRepairLogPath New-Item -itemtype directory -path $LogPathForManagedFolders Set-Mailboxserver $env:computername -CalendarRepairLogPath $CalendarRepairLogPath -LogPathForManagedFolders $LogPathForManagedFolders
Exchange2013 – Adressbücher
Adressbuchrichtlinien sind ein praktisches Hilfsmittel, wenn man mehrere Organisationen mit einer Exchange-Umgebung bedient.
Dabei kann es unerwünscht sein, dass die unterschiedlichen Organisationen die Adressbucheinträge der anderen Organisationen sehen.
Hier nun eine Beispielkonfiguration für 3 Organisationen. „Exchange2013 – Adressbücher“ weiterlesen
Sysprep für Images
Beim Erstellen von Images wird häufig sysprep eingesetzt um Windows zu generalisieren, SIDs neu zu erstellen usw.
Sysprep führt jedoch, in der Standard-Konfiguration, einen rearm der Lizenz durch. Dies ist nur 3 mal zulässig. Beim 4ten versuch verwehrt sysprep seine Dienste.
Um dies zu verhindern erstellt man im sysprep-Verzeichnis (typisch c:\windows\system32\sysprep) eine Datei mit dem Namen unattend.xml mit folgendem Inhalt:
<settings pass="generalize"> <component name="Microsoft-Windows-Security-SPP" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SkipRearm>1</SkipRearm> </component> </settings>
Durch dieses File wird der rearm der Lizenz unterbunden!
Durch folgenden Reg-Key kann angeblich das gleiche erreicht werden:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\SoftwareProtectionPlatform\SkipRearm
Nützliche WMI-Filter für GPOs
Nur Clients ( also keine Server Systeme und keine DCs)
select * from Win32_OperatingSystem Where ProductType=1
Nur Clients Win7 und neuer
SELECT * FROM Win32_OperatingSystem WHERE BuildNumber >= 7600 AND ProductType = 1
Notebooks
select * from Win32_ComputerSystem where PCSystemType = 2
Nur Server 2008R2 und neuer (inkl. DCs)
SELECT * FROM Win32_OperatingSystem WHERE BuildNumber >= 7600 AND ProductType >= 2
…to be continued
DS18B20 – Teil 2: Erstellen von Grafiken
Eine Grafische Auswertung von Daten ist nicht immer Einfach.
Ich habe leider nichts gefunden mit dem ich einfach aus einer mySQL-DB eine Grafik erstellen kann. Daher habe ich dann aus mehreren Seite im Internet eine Python-Script zusammenkopiert. Die erstellten Diagramme können Sie jedoch sehen lassen: Heizung
Der Link verweist auf eine Kopie der aktuellen Daten. Das Beagle-Board selbst hat keinen direkten Internetzugang.
Nachfolgend das Python-Script:
# Get DS18B20 Temperatur-Data from mySQL and use mathplot # 4.4.2015 import sys import os import time import math import datetime import MySQLdb as mdb import numpy import matplotlib matplotlib.use('agg') matplotlib.rcParams['figure.dpi'] = 200 matplotlib.rcParams['figure.figsize'] = [13.65, 10.24] matplotlib.rcParams['lines.linewidth'] = 0.5 matplotlib.rcParams['axes.color_cycle'] = ['r', 'g', 'b', 'c', 'm', 'k'] matplotlib.rcParams['axes.labelsize'] = 'large' matplotlib.rcParams['font.size'] = 8 matplotlib.rcParams['grid.linestyle']='-' import matplotlib.pyplot as plt # Check if ther is a commandline-parameter if (len(sys.argv)) == 2 and int(sys.argv[1]) > 0: TimeValue = sys.argv[1] else: TimeValue = "24" #print TimeValue DBconn = mdb.connect('localhost', 'root', 'XXXXXXXXXX', 'measure') cursor = DBconn.cursor(mdb.cursors.DictCursor) sql1 = "select M.SensorID as id, S.name as name" sql1 += " from measure M inner join sensor S on ( S.id = M.SensorID )" sql1 += " where M.ts > (DATE_SUB(now(), INTERVAL " + TimeValue + " HOUR)) group by M.SensorID" cursor.execute(sql1) Sensors = cursor.fetchall() Sens = len ( Sensors ) +1 CurSens = 1 cursor = DBconn.cursor() sql1 = "select unix_timestamp(M.ts) as ts, M.value / 1000 as value " sql1 += "from measure M " sql1 += "where M.ts > (DATE_SUB(now(), INTERVAL " + TimeValue + " HOUR)) and M.SensorID = " tempmax = 0 tempmin = 0 Title = "Temperaturen unserer Heizung: " + TimeValue + " Stunden" for Sensor in Sensors: #print Sensor['id'], Sensor['name'], #Title += Sensor['name'] + ", " sql2 = sql1 + str(Sensor['id']) + " order by TS desc" cursor.execute(sql2) Raw = cursor.fetchall() Raw = numpy.fromiter(Raw, count=-1, dtype=[('', numpy.float)]*2) Raw = Raw.view(numpy.float).reshape(-1, 2) for value in Raw: if tempmax < value[1]: tempmax = value[1] if tempmin > value[1]: tempmin = value[1] (samples,ports)=Raw.shape #print 'Samples: {}, DataPoints: {}'.format(samples,ports) plotme=numpy.zeros((samples,ports-1)) # make an array the same shape minus the epoch numbers for y in range(ports-1): for x in range(samples-1): seconds = Raw[x+1,0]-Raw[x,0] plotme[x,y] = Raw[x,y+1] plotme[samples-1,y] = None dts = map(datetime.datetime.fromtimestamp, Raw[:,0]) lines = plt.plot(dts, plotme, label=Sensor['name']) #plt.text(dts[0], plotme[0], Sensor['name'], fontsize=8) position = ((samples / ( Sens )) * ( CurSens )) # if the calculation of the position does not work??!! if position > samples: position = samples / 2 # print samples, position plt.annotate(Sensor['name'], xy=(dts[position], plotme[position]), xycoords='data', xytext=(15, 15), textcoords='offset points', arrowprops=dict(arrowstyle="->", connectionstyle="angle,angleA=0,angleB=90,rad=10"), ) CurSens += 1 DBconn.close() #print plotme # set up the plot details we want plt.grid(True) plt.ylabel('Temp $^\circ$C') tempmax = int(( tempmax + 8 ) / 5 ) * 5 if tempmin < 0 : tempmin = int(( tempmin - 3 ) / 5) * 5 print "Max: " + str(tempmax) print "Min: " + str(tempmin) plt.axis(ymax=(tempmax) ,ymin=(tempmin) ) plt.xlabel(time.asctime()) plt.title(Title) plt.hold(True) # format Time and Date plt.gca().xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%d.%m. %H:%M')) plt.gca().xaxis.set_major_locator(matplotlib.dates.AutoDateLocator()) #lines = plt.plot(dts,plotme) plt.gcf().autofmt_xdate() FileName = "/tmp/" + TimeValue + "hour.png" plt.savefig(FileName) Destination = '/var/www/' os.system("cp " + FileName + " {}".format(Destination))
DS18B20 an BeagleBone Black (v1.2)
Funktionen
- Forkt sich selbst um in Hintergrund zu laufen
- Automatisches erkennen der angeschlossenen Sensoren
- Automatisches hinzufügen von neuen Sensoren
- Erkennen von Übertragungsfehlern (CRC)
- Ausgabe der Daten wahlweise:
- Erstellen eines CSV-Files pro Stunde im Webserver-Bereich
- MySQL-Datenbank
- Heartbeat-LED (usr0) zeigt Messzyklus an
- Sensor-Offset zum korrigieren von Toleranzen (nur bei der Verwendung von MySQL)
- Sauberes beenden bei „kill“ und „killall“
- Eigenes Cape mit On-Board Sensor
AD Recycle Bin – Der Papierkorb vom AD
So wird er aktiviert und benutzt
(wie immer die Kurzform)
Ausführliche Erklärung gibt es hier: https://technet.microsoft.com/de-de/library/dd379481(v=ws.10).aspx
Der folgende Befehl ist so gemacht, dass er einfach per Copy-Paste in ein Powershell-Fenster kopiert werden kann und ohne weitere Änderungen läuft. „AD Recycle Bin – Der Papierkorb vom AD“ weiterlesen
PowerShell Scripte signieren
…ich weiß, ich weiß…
Hierzu gibt es schon eine ganze menge an Artikel im Internet. Viele sehr ausführlich und gut geschrieben.
Dieser wird kurz und Bündig.