<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Daniels Blog &#187; Server</title>
	<atom:link href="http://blog.danielhahn.eu/tag/server/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.danielhahn.eu</link>
	<description>Themen rund um IT und das WWW</description>
	<lastBuildDate>Mon, 26 Dec 2011 13:54:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Servergespeicherte Profile und NVIDIA-Treiber</title>
		<link>http://blog.danielhahn.eu/2009/servergespeicherte-profile-und-nvidia-treiber/</link>
		<comments>http://blog.danielhahn.eu/2009/servergespeicherte-profile-und-nvidia-treiber/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 16:10:38 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Windows allgemein]]></category>
		<category><![CDATA[Abmeldung]]></category>
		<category><![CDATA[NVIDIA]]></category>
		<category><![CDATA[Profil]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[servergespeichert]]></category>
		<category><![CDATA[speichern]]></category>
		<category><![CDATA[zurückschreiben]]></category>

		<guid isPermaLink="false">http://blog.danielhahn.eu/?p=164</guid>
		<description><![CDATA[In unserem Unternehmen wurde kürzlich eine alte Charge Computer durch neue, mit NVIDIA-Grafik ausgestattete Rechner, ersetzt. Seitdem trat das Problem auf, dass die servergespeicherten Profile der Nutzer, die sich an diesen Rechnern anmeldeten, bei der Abmeldung nicht mehr auf den Server zurückgeschrieben wurden. Da dies bei ca. 200 Usern, die auch öfter den PC wechseln, &#8230; </p><p><a class="more-link block-button" href="http://blog.danielhahn.eu/2009/servergespeicherte-profile-und-nvidia-treiber/">Weiterlesen &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>In unserem Unternehmen wurde kürzlich eine alte Charge Computer durch neue, mit NVIDIA-Grafik ausgestattete Rechner, ersetzt. Seitdem trat das Problem auf, dass die servergespeicherten Profile der Nutzer, die sich an diesen Rechnern anmeldeten, bei der Abmeldung nicht mehr auf den Server zurückgeschrieben wurden. Da dies bei ca. 200 Usern, die auch öfter den PC wechseln, natürlich völlig inakzeptabel ist, musste schnell eine Lösung für das Problem gefunden werden. Leider gestalltete sich die Suche nach der Ursache alles andere als leicht. Der erste Schritt war, die betroffenen Profile neu anzulegen, was aber keinen Erfolg brachte. Die Ereignisanzeige sowohl des Servers, als auch der Clients brachte auch keine brauchbaren Informationen. Deshalb legte ich meine ganzen Hoffnungen in das USERENV-Loging. Via Registry volles Loging aktiviert und nach mehreren An- und Abmeldungen die userenv.log ausgewertet &#8211; leider ebenso ohne Erfolg. So blieb mir nur noch das Internet. Der einzige Hinweis, den ich da noch finden konnte, war ein Problem mit älteren NVIDIA-Treibern, dass andere Administratoren hatten. Diese schienen beim Abmelden das Benutzerprofil nicht richtig freizugeben, weshalb es dann nicht auf den Server zurückgeschrieben werden konnte. Obwohl wir bei uns relativ aktuelle Treiber im Einsatz haben, war das mein letzter Anahltspunkt und so habe ich mit dem Sysinternals Tool Autoruns alle NVIDIA-Autostarteinträge (bis auf die eigentlichen Treiberdateien) deaktiviert. Und tatsächlich konnte dies das Problem beheben. Es scheint also nach wie vor oder wieder eine Fehlfunktion in NVIDIAs Treibern zu geben. Leider erscheint weder in der Ereignisanzeige, noch in irgendwelchen LOG-Dateien eine entsprechende Meldung. Bleibt also nur zu hoffen, das NVIDA das Problem in den Griff bekommt, um uns Administratoren mühsame Sisyphusarbeit zu ersparen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danielhahn.eu/2009/servergespeicherte-profile-und-nvidia-treiber/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selektives Löschen mit der Windows Powershell 1.0</title>
		<link>http://blog.danielhahn.eu/2009/selektives-loeschen-mit-der-powershell-10/</link>
		<comments>http://blog.danielhahn.eu/2009/selektives-loeschen-mit-der-powershell-10/#comments</comments>
		<pubDate>Fri, 02 Jan 2009 19:23:05 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Windows allgemein]]></category>
		<category><![CDATA[leer]]></category>
		<category><![CDATA[löschen]]></category>
		<category><![CDATA[Ordner]]></category>
		<category><![CDATA[selektiv]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.danielhahn.eu/?p=60</guid>
		<description><![CDATA[Ich wünsche allen Leserinnen und Lesern meines Blogs ein gesundes und erfolgreiches Jahr 2009!! Ich möchte das Jahr mit einem Powershell (1.0) Skript einläuten, welches ich vor kurzem erstellt habe. Da es sich mit um eines meiner ersten &#8220;richtigen&#8221; Skripte für die Windows Powershell handelt und ich denke, dass die Problemstellung, die dem Ganzen zu &#8230; </p><p><a class="more-link block-button" href="http://blog.danielhahn.eu/2009/selektives-loeschen-mit-der-powershell-10/">Weiterlesen &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Ich wünsche allen Leserinnen und Lesern meines Blogs ein gesundes und erfolgreiches Jahr 2009!! Ich möchte das Jahr mit einem Powershell (1.0) Skript einläuten, welches ich vor kurzem erstellt habe. Da es sich mit um eines meiner ersten &#8220;richtigen&#8221; Skripte für die Windows Powershell handelt und ich denke, dass die Problemstellung, die dem Ganzen zu Grunde liegt, sicher auch für andere Administratoren interessant sein könnte, möchte ich Euch meine geistigen Ergüsse nicht vorenthalten und freue mich natürlich auch über Anregungen, was man an der einen oder anderen Stelle noch optimieren könnte.</p>
<p>Ich stand kürzlich in unserem Unternehmen vor dem Problem, dass ich auf einem windowsbasierten Serversystem aus bestimmten Ordnern unter einem Wurzelverzeichnis alle Dateien mit einem gewissen Alter, sowie alle leeren Unterordner löschen wollte. Klingt an und für sich so erst einmal nicht schwierig. Das Einfachste wäre sicher gewesen, mit der Windows Suchfunktion alle meinem Kriterium entsprechenden Dateien herausfischen zu lassen, und diese dann über den Explorer zu löschen. Halbwegs Praktikabel, wenn man auf das Löschen leerer Ordner verzichten kann und es sich um eine einmalige Sache handelt. Damit wollte ich mich aber nicht zufrieden geben; die leeren Verzeichnisse sollten ebenfalls eliminiert und der Vorgang jede Nacht automatisch gestartet werden. Es musste also ein Skript her, welches via Taskplaner jede Nacht ausgeführt wird. Doch in welcher Form? VBS, eine einfache Batchdatei mit DOS-Befehlen oder die neue Powershell? Ich habe mich für die Powershell (1.0) entschieden, da ich von den scheinbar endlosen Möglichkeiten dieses Werkzeugs begeistert bin.<span id="more-60"></span></p>
<p>Und so sieht das Ganze dann codemäßig aus (den Download findet ihr am Ende des Artikels):</p>
<pre class="brush: vb; title: ; notranslate">
# DeleteShareFolderContent.ps1
# Daniel Hahn - Dezember 2008

# -----------------------------------------------------

Write-Host
Write-Host
Write-Host &quot;Skript zum selektiven Leeren von Tauschordnern&quot;
Write-Host &quot;==============================================&quot;
Write-Host
Write-Host

# Hier das Wurzelverzeichnis angeben
$strRootFolder = &quot;Drive:Folder&quot;

# Logfile anlegen und Kopfzeilen schreiben
$strTimestamp = Get-Date -Format &quot;dd.MM.yyyy - HH:mm&quot;
$strTimestampFile = Get-Date -Format &quot;yyyy-MM-dd-HHmm&quot;
$strLogfileName = &quot;Tausch leeren &quot; + $strTimestampFile + &quot;.log&quot;
$strLogfile = $Env:Temp + &quot;\&quot; + $strLogfileName
&quot;Vorgang gestartet: $strTimestamp&quot; &gt;&gt; $strLogfile
&quot;&quot; &gt;&gt; $strLogfile

# -----------------------------------------------------
function CheckFiles
{
param([object] $objRootFolder)
$strRootFolder = $objRootFolder.Path
$strRootFolderName = $objRootFolder.Name
$colFiles = $objRootFolder.Files
$DirContent = $null
$DirContent = Get-ChildItem $strRootFolder

foreach($objFile in $colFiles)
{
$strFile = $strRootFolder + &quot;\&quot; + $objFile.Name
$dtFile = $objFile.DateCreated
$dtSys = Get-Date -Format &quot;dd.MM.yyyy HH:mm:ss&quot;
$iDif = (New-TimeSpan -Start $dtFile -End $dtSys).TotalDays

if($iDif -gt 7)
{
$FSO.DeleteFile($strFile, $true)
Write-Host &quot;Datei &quot; -NoNewline
Write-Host $strFile -ForegroundColor &quot;magenta&quot; -NoNewline
Write-Host &quot; gelöscht&quot;
&quot;Nach Frist gelöscht: $strFile&quot; &gt;&gt; $strLogfile
$script:iDeletedCount++
}
$script:iFileCount++
}

if(($DirContent -eq $null) -and ($strRootFolderName -notlike &quot;*04*Tausch&quot;))
{
$FSO.DeleteFolder($strRootFolder)
Write-Host &quot;Leeres Verzeichnis &quot; -NoNewline
Write-Host $strRootFolder -ForegroundColor &quot;magenta&quot; -NoNewline
Write-Host &quot; gelöscht&quot;
&quot;Leeres Verzeichnis gelöscht: $strRootFolder&quot; &gt;&gt; $strLogfile
$script:iFolderDeletedCount++
}
}

# -----------------------------------------------------
function FindSubFolders
{
param([object] $objRootFolder)
$colRootSubFolders = $objRootFolder.SubFolders

foreach($objRootSubFolder in $colRootSubFolders)
{
FindSubFolders $objRootSubFolder
CheckFiles $objRootSubFolder
$script:iFolderCount++
}
}

# -----------------------------------------------------
function FindShareFolders
{
param([object] $objRootFolder)
$colRootSubFolders = $objRootFolder.SubFolders

foreach($objRootSubFolder in $colRootSubFolders)
{
$strRootSubFolder = $objRootSubFolder.Name

if($strRootSubFolder -like &quot;*Tausch&quot;)
{
CheckFiles $objRootSubFolder
FindSubFolders $objRootSubFolder

$script:iFolderCount++
}
}
}

# -----------------------------------------------------
function WaitKey
{
$strPrompt = &quot;Beliebige Taste zum Verlassen drücken ... &quot;
Write-Host
Write-Host $strPrompt -NoNewline
$key = [Console]::ReadKey($true)
Write-Host
}

# -----------------------------------------------------
# main

$iFolderDeletedCount = 0
$iDeletedCount = 0
$iFolderCount = 0
$iFileCount = 0

Write-Host &quot;Temporäres Logfile:&quot; $strLogfile
Write-Host
Write-Host &quot;Beginne mit Durchsuchen der Tauschordner in &quot;
Write-Host $strRootFolder -ForegroundColor &quot;Cyan&quot; -NoNewline
Write-Host

$FSO = New-Object -COM Scripting.FileSystemObject

if(-not $FSO.FolderExists($strRootFolder))
{
Write-Host &quot;Fehler: Wurzelverzeichnis existiert nicht!&quot; -ForegroundColor &quot;Red&quot;
Write-Host
Write-Host &quot;Ausführung wird abgebrochen&quot;
WaitKey
exit
}

$objRootFolder = $FSO.GetFolder($strRootFolder)
FindShareFolders $objRootFolder

Write-Host
Write-Host &quot;Insgesamt&quot; $iFileCount &quot;Datei(en) in&quot; $iFolderCount &quot;Ordnern gefunden.&quot; -ForegroundColor &quot;magenta&quot;
Write-Host $iDeletedCount &quot;Datei(en) gelöscht&quot; -ForegroundColor &quot;magenta&quot;
Write-Host $iFolderDeletedCount &quot;leere(r) Ordner gelöscht&quot; -ForegroundColor &quot;magenta&quot;

$strTimestamp = Get-Date -Format &quot;dd.MM.yyyy - HH:mm&quot;
&quot;&quot; &gt;&gt; $strLogfile
&quot;$iDeletedCount Datei(en) gelöscht&quot; &gt;&gt; $strLogfile
&quot;$iFolderDeletedCount Ordner gelöscht&quot; &gt;&gt; $strLogfile
&quot;&quot; &gt;&gt; $strLogfile
&quot;Skript beendet: $strTimestamp&quot; &gt;&gt; $strLogfile

WaitKey

# -----------------------------------------------------
</pre>
<p>Das Skript ist vielleicht an der einen oder anderen Stelle nicht perfekt, erfüllt aber seinen Zweck. (Ich habe versucht, möglichst selbsterklärende Variablen- und Funktionsnamen zu verwenden, sowie die Verständlichkeit durch Kommentare zu verbessern)</p>
<p>[download#1]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danielhahn.eu/2009/selektives-loeschen-mit-der-powershell-10/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

