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. Weiterlesen „Exchange2013 – Adressbücher“

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

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

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. Weiterlesen „AD Recycle Bin – Der Papierkorb vom AD“

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)

Weiterlesen „Exchange Monitoring (ver 1.2.2)“