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

„DS18B20 an BeagleBone Black (v1.2)“ weiterlesen

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

Nachinstallation von .Net 3.5

Die Installation von .NET 3.5 ist eine echte Herausforderung:
Trotz Internetanbindung schlägt das Nachladen meist fehl.

Die einfachste variante ist, meiner Meinung nach, das einlegend der DVD und dann die Offline-Installation per DISM:

DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:f:\sources\sxs

Die Option „LimitAccess“ sorgt dafür, dass kein Kontakt zum Internet aufgenommen wird.

Der Pfad bei „Source“ muss mit dem korrekten Laufwerksbuchstaben versehen werden!

 

Exchange Monitoring (ver 1.2.2)

Einfaches Monitoring von einer Exchange-Umgebung ( Jetzt auch für Exhcange 2013/6 )

Folgendes wird überprüft:

  • Dienst die auf Automatisches Starten eingestellt sind
  • Festplatten (leerer Speicherplatz)
  • Queues
  • Clusterresourcen
    • Dieser Test wird nur noch durchgeführt, wenn die entsprechende Rolle auf dem lokalem System installiert ist.
  • Zertifikate (Ablaufdatum)

„Exchange Monitoring (ver 1.2.2)“ weiterlesen

Mailbox-Datenbank leer räumen

Es gibt unterschiedliche Szenarien in denen eine Datenbank ausgedient hat:

  • Volume ist voll
  • Änderung der Namenskonvention
  • Änderung der Struktur wie z.B. eine DB pro Abteilung oder Standort

Seit Exchange 2010 ist es auf alle Fälle möglich ein Postfach in eine andere Datenbank zu verschieben, ohne dass der Benutzer gestört wird.

Ein Verschieben der Datenbank ist ohne Down-Time nicht möglich. Daher empfehle stat desse nimmer eine neue DB zu erstellen und die Mailboxen zu verschieben.

Mit den folgenden 3 Zeilen PowerShell-Code werden alle Postfächer von einer DB in eine andere geschoben.

Das ganze ist als Beispiel gedacht!

Die alte DB heisst „Mailbox Database 1507976970“

Die neue DB hat den Namen „Mail-01“

Get-MailboxDatabase "Mailbox Database 1507976970" | Get-Mailbox | New-MoveRequest -TargetDatabase Mail-01
Get-MailboxDatabase "Mailbox Database 1507976970" | Get-Mailbox -Archiv | New-MoveRequest -TargetDatabase Mail-01
Get-MailboxDatabase "Mailbox Database 1507976970" | Get-Mailbox -Arbitration | New-MoveRequest -TargetDatabase Mail-01