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

„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