Home PowerShell .NET Code Access Security (CAS) Full Trust für ein Netzwerk-Share mit PowerShell und CASPOL.exe
formats

.NET Code Access Security (CAS) Full Trust für ein Netzwerk-Share mit PowerShell und CASPOL.exe

PowerShell Snapins und auch viele Module bestehen aus Dynamik Link Libraries (DLL) die mit .NET Programmiert wurden.
Möchte man diese .NET Programme auf eine Netzwerkfreigabe (Share) legen und von dort aus nutzen (starten), gibt es mit ärger mit der Sicherheit.

Diese Sicherheitsrichtlinien die dort wirken, werden .NET Code Access Security (CAS) genannt.
Man kann die CAS im Active Directory über Gruppenrichtlinien regeln, oder auf jedem Rechner einzeln mit dem DOS Kommando CASPOL.EXE.

Ich stelle hier einen leichten weg vor, wie man dies auf einem Rechner mit der CASPOL.EXE und PowerShell erledigt.


Um die .NET Programme von einem Share ohne Probleme nutzen zu können reicht eine Zeile Code aus.
CASPOL.exe -m -ag 1.2 -url file://\\ServerName\ShareName\*

Diese Zeile muss aber für jede .NET Framework Version einzeln, für 32Bit und 64Bit ausgeführt werden.
Dies kann auf eine 64Bit Rechner mit Verschiedenen .NET Framework Versionen recht aufwändig werden.

Was man einschaltet soll man auch wieder ausschalten können

Das Entfernen der Vertrauensstellung wird ebenso aufwändig wie das herstellen.
Hinzu kommt das der Parameter -Name nicht mit dem -URL Parameter benutzt werden kann.
Somit kann man die Vertrauensstellung nicht anhand eines eindeutigen Namens leicht wieder löschen.
Hier muss man die Gruppen, die Caspol automatisch erstellt, nutzen. Diese Gruppen-Namen variieren und werden einfach heraufgezählt.

Die PowerShell CASPOL Funktionen

Alle guten Dinge sind 3!

Um einem Share zu vertrauen nutzt man folgende Funktion:
ADD-CaspolUrlFullTrust(‘file://\\ServerName/ShareName/*’)

Um dieses vertrauen wider zu entfernen nutzt man folgende Funktion:
Remove-CaspolUrlFullTrust(‘file://\\ServerName/ShareName/*’)

Um sich die Änderungen an den Policies ansehen zu können nutzt man folgende Funktion:
Get-CaspolMachineGroup

Es werden jeweils immer an allen .NET Framework Versionen die 32Bit und die 63Bit Aktionen ausgeführt.

Und hier nun das gesamte Script:
Download des Scriptes im Microsoft Code Repository.

Function ADD-CaspolUrlFullTrust($UrlToAdd) {
# Function to trust a URL (Network-Share)
# Adds a URL to the Group under 1.2. (Zone - Intranet: LocalIntranet),
# in -machine Level with FullTrust
# $UrlToAdd the String URL to add. Like: 'file://\\ServerName/ShareName/*'

Get-ChildItem "$env:windir\Microsoft.Net\Framework" -Filter v* | where{$_.psiscontainer} | foreach {

$CaspolExe = $($_.fullname + "\caspol.exe")

If (Test-Path $CaspolExe) {

$UrlToAddExist = $False
$GroupName = ""

# test if the FullTrust to the URL allready exist
# List all Caspol Groups from machine level: "caspol -m -lg
# find the URL String ($UrlToAdd) in Caspol result text
Invoke-Expression -Command $($CaspolExe + " -m -lg") | `
Select-String -pattern $UrlToAdd -SimpleMatch -casesensitive | foreach {

# the first 'word' in Line is the Groupname
$GroupName = $_.tostring().trim().split(' ')[0]

# test if a fulltrust URL with Groupname starting with 1.2. allready exist
If ($_.ToString().ToUpper().Contains('URL') -and $GroupName.StartsWith('1.2.') -and $_.ToString().Trim().ToLower().EndsWith('fulltrust')) {
$UrlToAddExist = $True
"32Bit FullTrust Policy allready exist for URL: $UrlToAdd in Group -Machine 1.2. !"
}
}

# don´t add the URL twice
# we add the URL only if its not allready exist
if ($UrlToAddExist -eq $False) {
Invoke-Expression -Command $($CaspolExe + " -polchgprompt off")
# remove Group (URL) from Caspol
"Adding 32Bit POL: " + $($CaspolExe +  " -m -ag 1.2 -url $UrlToAdd FullTrust")
Invoke-Expression -Command $($CaspolExe + " -m -ag 1.2 -url $UrlToAdd FullTrust")
Invoke-Expression -Command $($CaspolExe + " -polchgprompt on")
}
}
}

Get-ChildItem "$env:windir\Microsoft.Net\Framework64" -Filter v* | where{$_.psiscontainer} | foreach {

$CaspolExe64 = $($_.fullname + "\caspol.exe")

If (Test-Path $CaspolExe64) {

$UrlToAddExist64 = $False
$GroupName64 = ""

# test if the FullTrust to the URL allready exist
# List all Caspol Groups from machine level: "caspol -m -lg
# find the URL String ($UrlToAdd) in Caspol result text
Invoke-Expression -Command $($CaspolExe64 + " -m -lg") | `
Select-String -pattern $UrlToAdd -SimpleMatch -casesensitive | foreach {

# the first 'word' in Line is the Groupname
$GroupName64 = $_.tostring().trim().split(' ')[0]

# test if a fulltrust URL with Groupname starting with 1.2. allready exist
If ($_.ToString().ToUpper().Contains('URL') -and $GroupName64.StartsWith('1.2.') -and $_.ToString().Trim().ToLower().EndsWith('fulltrust')) {
$UrlToAddExist64 = $True
"64Bit FullTrust Policy allready exist for URL: $UrlToAdd in Group -Machine 1.2. !"
}
}

# don´t add the URL twice
# we add the URL only if its not allready exist
if ($UrlToAddExist64 -eq $False) {
Invoke-Expression -Command $($CaspolExe64 + " -polchgprompt off")
# remove Group (URL) from Caspol
"Adding 64Bit POL: " + $($CaspolExe64 +  " -m -ag 1.2 -url $UrlToAdd FullTrust")
Invoke-Expression -Command $($CaspolExe64 + " -m -ag 1.2 -url $UrlToAdd FullTrust")
Invoke-Expression -Command $($CaspolExe64 + " -polchgprompt on")
}
}
}
}

Function Remove-CaspolUrlFullTrust($UrlToRemove) {
# Function to remove the trust of a URL (Network-Share)
# Removes ALL URLs which are matches the $UrlToRemove string,
# in the Group under 1.2. (Zone - Intranet: LocalIntranet),
# in -machine Level with FullTrust
# $UrlToRemove the String URL to remove. Like: 'file://\\ServerName/ShareName/*'

Get-ChildItem "$env:windir\Microsoft.Net\Framework" -Filter v* | where{$_.psiscontainer} | foreach {

$CaspolExe = $($_.fullname + "\caspol.exe")

If (Test-Path $CaspolExe){
$Groupnames = @() # clear Array

# List all Caspol Groups from machine level: "caspol -m -lg
# find the URL String ($UrlToRemove) in Caspol result text
# Split Line wich contains the URL.
# the first 'word' in Line, is the Groupname to remove wich begins with 1.2.
Invoke-Expression -Command $($CaspolExe + " -m -lg") | `
Select-String -pattern $UrlToRemove -SimpleMatch -casesensitive | foreach {

# the first 'word' in Line is the Groupname
$GroupName = $_.tostring().trim().split(' ')[0]

# we add the groupname to the Array
# Add only if its a fulltrust URL and Groupname starts with 1.2.
If ($_.ToString().ToUpper().Contains('URL') -and $GroupName.StartsWith('1.2.') -and $_.ToString().Trim().ToLower().EndsWith('fulltrust')) {
$Groupnames += $GroupName
}
}

# Sort Array descending because we have to remove high groups bevor low groups (reverse removing)
$Groupnames = $Groupnames | Sort-Object -Descending

foreach($GroupName in $Groupnames) {
Invoke-Expression -Command $($CaspolExe + " -polchgprompt off")
# remove Group (URL) from Caspol
"Removing: " + $($CaspolExe + " -rg $GroupName")
Invoke-Expression -Command $($CaspolExe + " -rg $GroupName")
Invoke-Expression -Command $($CaspolExe + " -polchgprompt on")
}

}
}

Get-ChildItem "$env:windir\Microsoft.Net\Framework64" -Filter v* | where{$_.psiscontainer} | foreach {

$CaspolExe64 = $($_.fullname + "\caspol.exe")

If (Test-Path $CaspolExe64){

$Groupnames64 = @() # clear Array

# List all Caspol Groups from machine level: "caspol -m -lg
# find the URL String ($UrlToRemove) in Caspol result text
# Split Line wich contains the URL.
# the first 'word' in Line, is the Groupname to remove
Invoke-Expression -Command $($CaspolExe64 + " -m -lg") | `
Select-String -pattern $UrlToRemove -SimpleMatch -casesensitive | foreach {

# the first 'word' in Line is the Groupname
$GroupName64 = $_.tostring().trim().split(' ')[0]

# we add the groupname to the Array
# Add only if its a fulltrust URL and Groupname starts with 1.2.
If ($_.ToString().ToUpper().Contains('URL') -and $GroupName64.StartsWith('1.2.') -and $_.ToString().Trim().ToLower().EndsWith('fulltrust')) {
$Groupnames64 += $_.tostring().trim().split(' ')[0]
}
}

# Sort Array descending because we have to remove high groups bevor low groups  (reverse removing)
$Groupnames64 = $Groupnames64 | Sort-Object -Descending

foreach($GroupName64 in $Groupnames64) {
Invoke-Expression -Command $($CaspolExe64 + " -polchgprompt off")
# remove Group (URL) from Caspol
"Removing: " + $($CaspolExe64 + " -rg $GroupName")
Invoke-Expression -Command $($CaspolExe64 + " -rg $GroupName")
Invoke-Expression -Command $($CaspolExe64 + " -polchgprompt on")
}
}
}
}

Function Get-CaspolMachineGroup() {
# List the Caspol Groups in -machine level

Get-ChildItem "$env:windir\Microsoft.Net\Framework" -Filter v* | where{$_.psiscontainer} | foreach {

$CaspolExe = $($_.fullname + "\caspol.exe")

If (Test-Path $CaspolExe){
$CaspolExe
Invoke-Expression -Command $($CaspolExe + " -m -lg")
}
}

Get-ChildItem "$env:windir\Microsoft.Net\Framework64" -Filter v* | where{$_.psiscontainer} | foreach {

$CaspolExe64 = $($_.fullname + "\caspol.exe")

If (Test-Path $CaspolExe64){
$CaspolExe64
Invoke-Expression -Command $($CaspolExe64 + " -m -lg")
}
}
}

# EXAMPLES:

# ADD-CaspolUrlFullTrust('file://\\ServerName/ShareName/*')

# Get-CaspolMachineGroup

# Remove-CaspolUrlFullTrust('file://\\ServerName/ShareName/*')

# Get-CaspolMachineGroup

MSDN Documentation:
Caspol.exe (Richtlinientool für die Codezugriffssicherheit)

 
 Share on Facebook Share on Twitter Share on Reddit Share on LinkedIn
Kommentare deaktiviert  comments