Hallo ans Forum
Ich habe mein Loginscript für die Domäne ebenfalls in PowerShell geschrieben. Jetzt bin ich dabei, meine Server auf 2008 zu migrieren und habe dabei folgendes festgestellt:
Bei einem Login auf meinem neuen 2008er Server wird das Loginscript nicht mehr ausgeführt. Konkret habe ich den Benutzern im AD eine Batchdatei mit folgendem Inhalt als Loginscript hinterlegt:
powershell.exe -command "\\srv01\netlogon\logon.ps1"
Allerdings wird das Script dann bei einem Login auf einen 2008er Server nicht automatisch ausgeführt, er spuckt stattdessen diese Meldung aus, die man mit "M" quitieren muss, wenn das Script ausgeführt werden soll:
Führen Sie ausschließlich vertrauenswürdige Skripts aus. Skripts aus dem Internet können zwar nützlich sein, stellen jedoch auch eine potenzielle Gefahr für Ihren Computer dar. Möchten Sie "\\SRV01\netlogon\logon.ps1" ausführen? [N] Nicht ausführen [M] Einmal ausführen [H] Anhalten [?] Hilfe
Das Phänomen tritt nur auf dem 2008er auf, auf XP SP3, 2003 SP2 und Vista SP1 nicht. Die Execution-Policy ist auf unrestricted.
Wie kann ich diese Sicherheitsmeldung abschalten?
PS: "srv01" ist mein 2008er Server, der als Primärer Domänencontroller fungiert.
Grüsse aus der Schweiz
Hallo TuXHunT3R,
welche Zone wird dir denn angezeigt, wenn du den Pfad im IE oder FileExplorer eingibst? Funktioniert das Skript wenn du es über einen lokalen Pfad ansprichst? Also powershell.exe -command "c:\netlogon\logon.ps1".
Ich kenn es wenn die Netzwerkpfade, obwohl sie von einem DC kommen, wegen der UNC Notation als Zone Internet erkannt werden und damit dieses Verhalten auslösen. Gruß Rolf Nachtrag: Notfalls mal in den Gruppenrichtlinien nachsehen. Wenn es gar nicht klappt Signieren in Erwägung ziehen. Der Artikel in der Technet hilft eventuell weiter. Rolf
wir haben ja auch ein separates Forum zum Thema Login-Skript. Kannst du uns an deiner Version teilhaben lassen? Das entsprechende Forum wäre hier: http://www.powershell-ag.de/ps/CommunityProjekt/tabid/86/forumid/22/scope/threads/Default.aspx Vorab schon mal ein dickes Danke! Rolf P.S.: Du hast auf administrator.de ein sehr umfangreiches Skript gepostet. http://www.administrator.de/index.php?content=a84229763fc71908205ac3076440c2b5#332699 Kannst du uns das für das für unsere Skriptsammlung zur Verfügung stellen? Das wäre natürlich auch toll! Rolf
Hallo Rolf
Hab mein Problem mit einer Bastellösung nun hingekriegt. Habe nun in die Batch, welche das PowerShell-Script aufruft, die folgenden Zeilen eingebaut:
if exist %temp%\logon_duerst-sool.ps1 del /f /q %temp%\logon_duerst-sool.ps1
xcopy \\srv01\netlogon\logon_duerst-sool.ps1 %temp% /h /r /y
Nachdem das Setzen der Gruppenrichtlinie "Skriptausführung aktivieren" unter "Computerkonfiguration", "Administrative Vorlagen", "Windows Komponenten", "Windows PowerShell" und mehrere "gpupdate /force" nichts gebracht haben und ich nicht in mühseliger Kleinarbeit jedes Pipifax-Script von mir signieren will, habe ich mich für diesen Bastel entschieden. Ist zwar nicht die feine Art, aber es funktioniert wenigstens.
Diesbezüglich verstehe ich Microsoft auch nicht. Ich stelle bei einem Programm (PowerShell) ein, dass ich diese Sicherheitsmassnahmen abstellen will (set-executionpolicy unrestricted), aber es macht es nicht vollständig. Ich weiss nicht, wie Microsoft jemals grosse Scharen von Administratoren von der PowerShell überzeugen will, wenn sie einem solche Steine in den Weg legen. Naja, genug geflucht. Ich habe noch eine andere Frage:
Ich verbinde in meinem Loginscript mit dem COM-Objekt "Wscript.Network" die Laufwerke. Das sieht dann z.B. so aus:
$Netzwerkobjekt = New-Object -comobject "WScript.Network" write-host "Connecting Drive J: \\srv01\public$..." $Netzwerkobjekt.mapnetworkdrive("J:","\\srv01\public$","False") start-sleep -milliseconds 500 write-host "Drive J: successfully connected!" -foregroundcolor green
Irgendwie wäre es doch schon noch schön, wenn ich mittels einer Errorlevel-Abfrage abfragen könnte, ob das Verbinden des Laufwerks geklappt hat oder nicht und ich dann eine entsprechende Meldung ausgeben könnte. Ich habs bereits auf die folgende Weise probiert:
$Netzwerkobjekt.mapnetworkdrive("J:","\\srv01\public$","False") if ($LASTEXITCODE -ne 0) {Write-Host "Error: Drive J: was not successfully connected!" -ForegroundColor red} else {write-host "Drive J: successfully connected!"}
Irgendwie haut das aber offenbar nicht richtig hin. Ich habe nämlich mal das "J:" durch "C:" ersetzt, um einen Fehler zu produzieren. Das Script gibt zwar eine riesige Fehlermeldung aus, allerdings nicht meine. Bei meiner If-Abfrage sagt er immer noch "Drive Q: successfully connected!". Weisst du gerade eine Lösung? Ansonsten greife ich wieder auf "net use" zurück, das hat wenigstens einen Errorlevel, welchen man auswerten kann........
Gruss aus der Schweiz
TuXHunT3R
Edit:
PS: Das Script, welches ich auf administrator.de gepostet habe, kommt noch nicht mit den neuen XML-Eventlogs von Vista und 2008 Server zurecht. Sobald ich das hingebogen habe, werde ich das Script posten.
Hi TuxHunT3R,
wenn du des Laufwerkverbinden in eine Funktion einbaust, kannst du mit Hilfe von "trap" den Fehler abfangen und anschließend anhand der Variable $bolError die Meldung ausgeben ob es erfolgreich war:
function map-Drive() { param ( [string]$strDrive = '', [string]$strShare = '' ) if ($strDrive -eq '' -or $strShare -eq '') { break; }
$bolError = $false; trap { Set-Variable -Name bolError -Value $true -Scope 1 continue; } $Netzwerkobjekt = New-Object -comobject "WScript.Network" write-host "Connecting Drive $strDrive with $strShare"
$Netzwerkobjekt.mapnetworkdrive($strDrive, $strShare, "False")
if ($bolError -eq $false) { Write-Host "Drive $strDrive successfully connected!" } else { Write-Host "Error: Drive $strDrive was not successfully connected!" -ForegroundColor red } }
map-Drive 'J:' "\\srv01\public$"
Viele Grüße
Helmut