patrickebert
Goto Top

Macadressenfilterung per Powershell

Hallo alle miteinander, weil ich bisher immer mit euren Ratschlägen gut klar gekommen bin, habe ich doch gleich mal ein Anliegen.

Und zwar habe ich folgendes vor.
Ich habe eine Excel Tabelle, wo die ganzen Macadressen drin stehen, die sich auf einem TS verbinden dürfen.
Falls diese nicht drin steht, soll er sich abmelden.
Mein code ist bisher folgender

$Whitelist = import-csv "C:\Macadresse.csv" -Delimiter ";"  
$macadresse =Get-WmiObject -Class win32_networkadapterconfiguration -ComputerName %clientname% |select macaddress 
$überprüfung = "$whitelist" -match "$macadresse"  
if ($überprüfung -eq $False) 
{(Get-WmiObject -class Win32_OperatingSystem).Win32Shutdown(0) }

Meine Excel Tabelle hingegen so (c:\Macadresse.csv)
6dc937eb5264a75fade9835457558b38

Ich denke das die Formatierung bei der MACAdresse auslesen mit dem in der Excel Tabelle nicht übereinstimmt.
Folgendes Problem habe ich auch, wenn ich die Umgebungsvariable %clientname% nehme: Der RPC Server ist nicht verfügbar, wenn ich jedoch den Computername an sich nehme, stellt dies kein Problem dar.
Wo liegen meine Fehler? face-sad

Content-ID: 277629

Url: https://administrator.de/contentid/277629

Ausgedruckt am: 25.11.2024 um 08:11 Uhr

holli.zimmi
holli.zimmi 17.07.2015 um 08:26:09 Uhr
Goto Top
Hi,

%clientname% kenn ich nur von Citrix - Terminalserver. Aber ich weis nicht, ob dies bei MS TS der Fall ist.
%computername% ist der lokale PC-Name gemeint.

Gruß

Holli
patrickebert
patrickebert 17.07.2015 um 08:39:31 Uhr
Goto Top
wenn du Remote bei einem TS oder sonstigen Rechner drauf bist, kannst du ja mal eingeben.

get-childitem env:


Da steht dann auch etwas von Clientname da, wenn du natürlich nur am lokalen PC sitzt und dann dies eingibst, dann steht Computername als Umgebungsvariable da, also dies sollte schon stimmen.
122990
Lösung 122990 17.07.2015 aktualisiert um 11:11:10 Uhr
Goto Top
Moin,
erstens muss sichergestellt sein das die Rechner via WMI ferngewartet werden dürfen, d.h die Firewall der Clients muss dies erlauben.
Zweitens: Umgebungsvariablen solltest du in Powershell so ansprechen $env:ClientName
Drittens sollte deine Csv keinen Header haben musst du ihn mit übergeben.
$Whitelist = import-csv "C:\Macadresse.csv" -Delimiter ";" -header mac  
$macs = Get-WmiObject -Class win32_networkadapterconfiguration -ComputerName $env:Clientname | select macaddress 
$überprüfung = $macs | ?{$_.MacAddress -in $whitelist.mac}
if (!$überprüfung) {
    (Get-WmiObject -class Win32_OperatingSystem).Win32Shutdown(0)
 }
Gruß grexit
patrickebert
patrickebert 17.07.2015 um 09:43:59 Uhr
Goto Top
Also nach deinem Befehl kommt bei mir aber auch immer false raus und dann meldet er sich auch nicht ab?
So wirklich schlüssig bin ich mir auch nicht was diese Zeile macht

$macs | ?{$_.MacAddress -in $whitelist.mac}

bei dem Rest komme ich überall noch mit, aber kannst du mir erklären was er da macht?
holli.zimmi
holli.zimmi 17.07.2015 um 11:01:08 Uhr
Goto Top
122990
Lösung 122990 18.07.2015, aktualisiert am 20.07.2015 um 09:14:43 Uhr
Goto Top
bei dem Rest komme ich überall noch mit, aber kannst du mir erklären was er da macht?
In diesem Abschnitt wird jede MAC die die Abfrage auf dem Client ergeben hat (und ja , das können mehrere sein!) mit der Whitelist abgeglichen, dabei wird der Operator -in verwendet der ab PS 3.0 verfügbar ist und der einen Wert mit einem Array aus Werten vergleicht - gibt es eine Übereinstimmung übergibt das where-object (?{}) die MAC-Adresse und die Variable $Überprüfung ist nicht mehr leer, ansonsten ist sie leer und die negierte If-Abfrage wird abgearbeitet.
patrickebert
patrickebert 20.07.2015 aktualisiert um 09:39:51 Uhr
Goto Top
Vielen Dank,
habe jetzt aber ein Problem, wenn ich das Script normal ausführe über die Powershell funktioniert alles, ob über den Editor oder auch ganz normal.
Wenn ich jedoch jetzt dieses Script als Aufgabenplanung oder in den gruppenrichtlinien anwende, dann kommt folgende Fehlermeldung:

befehl:
-computername $env:clientname
das argument für den parameter computername kann nicht überprüft werden, da der Parameter null ist.


und wenn ich folgenden Befehl eingebe:
-Computername clientname

kommt als Fehlermeldung der RPC-Server ist nicht verfügbar.

Dies passiert bei allen Clients von denen ich zugreife.
122990
122990 20.07.2015 aktualisiert um 13:34:09 Uhr
Goto Top
Du sagst hier ja noch nicht mal was über deine Umgebung wie und wo du die Skripte verknüpfst, ob es Start oder Logon-Scripte sind etc. pp. OS usw. Da kann man leider nur die berühmte Glaskugel bemühen face-sad

-Computername clientname
Das kann ja schon mal gar nicht gehen, oder hast du clientname durch einen existierenden Namen ersetzt ?
Die Firewalls der Clients müssen WMI fernwartbar sein damit das funkionieren soll, und außerdem muss dann der Account unter dem per WMI auf den Client zugegriffen wird die entsprechenden Rechte dafür besitzen.

Und in der Remote-Session muss unter folgendem Registry-Schlüsseln und Unterschlüsseln der Clientname als Umgebungsvariable registriert worden sein:
HKEY_CURRENT_USER\Volatile Environment\

-edit- was du auch unbedingt sicherstellen solltest ist das der Client unbedingt eine gesicherte Verbindung mit dem Server haben sollte, d.h. er muss erfolgreich in der Domäne registriert sein und der Computer darf nicht mit gecachten Offline-Credentials online sein. Er muss also ein gültiges Computer Access Token besitzen.
patrickebert
patrickebert 21.07.2015 um 08:25:24 Uhr
Goto Top
Hallo,
Also die Umgebung ist ein Windows Server 2008R2 als Terminalserver, sowie die Clients mit Windows 7 versehen.
Das Script soll als Logonscript funktionieren. dies ist aber leider nicht möglich, wegen des oben beschrieben Problemen.
Wenn ich das Script jedoch nochmal auf dem Terminalserver über die Windowspowershell ausführe funktioniert dies Prima.
Die Firewalls habe ich an den Test-Rechner mal direkt ausgeschalten und am Test-Server ebenfalls, jedoch bringt dies keine Verbesserung.
Desweiteren habe ich auch in den von dir geschriebene Registryeintrag geschaut, welcher einen Unterordner hat mit der Sessionnumber und mit der Itemproberty Clientname und den dazugehörigen Rechnernamen als Schlüssel.
Der Server und die Clients befinden sich in der selben Domäne und sind Standardmäßig konfiguriert, sodass der Computer eigentlich auch Standardmäßig das Computer Access Token besitzen sollte... oder irre ich mich und muss dies einstellen?
patrickebert
patrickebert 22.07.2015 um 10:42:23 Uhr
Goto Top
Problem gelöst... Powershell konnte die Variable $env:clientame nicht über GPO und über die Aufgabenplanung bereitstellen, habe Sie mir dann über die Registry geholt. Hier noch der code falls es jemand interessiert.

$clients= Get-ItemProperty "hkcu:volatile environment\*\" |select -ExpandProperty clientname  
$Whitelist = import-csv "C:\Macadresse.csv" -Delimiter ";" -header mac  
$macs = Get-WmiObject -Class win32_networkadapterconfiguration -ComputerName $clients | select macaddress 
$überprüfung = $macs | ?{$_.MacAddress -in $whitelist.mac}
if (!$überprüfung) {
   logoff
}
holli.zimmi
holli.zimmi 22.07.2015 um 11:01:21 Uhr
Goto Top
HI,

danke für den Hinweis!
Man kann es ja auch für andere Sachen gebrauchen!

Gruß

Holli