Bearbeiten / Einstellen von MIME-Typen mit Powershell?

8

Ich habe mich also gefragt, ob es eine bestimmte Möglichkeit gibt, einen MIME-Typ in IIS 7.5 mithilfe von Powershell zu ändern / bearbeiten.

Bisher bin ich auf Lösungen gestoßen, um Mimetypen hinzuzufügen, wie zum Beispiel: http://sclarson.blogspot.co.at/2011/08/adding-mime-type-to-iis-vis-powershell.html http: // forums. iis.net/t/1192371.aspx und einige andere, auf die verwiesen wird, aber diese Bücher enthalten keine Informationen dazu, habe ich überprüft.

Es scheint, als würde die Verwendung von Add-WebConfigurationPropertyverwendet, aber wenn ich diese Methode für einen vorhandenen Mimetyp verwende, erhalte ich einen Fehler, der sich auf einen doppelten Elementeintrag bezieht (da er bereits vorhanden ist), sodass diese Methode nicht im Fenster angezeigt wird.

Ich habe versucht, Set-WebConfigurationPropertystattdessen das zu verwenden, aber das führte dazu, dass ALLE vorhandenen Mimetyp-Einträge gelöscht wurden und nur einer davon übrig blieb.

Hat jemand einen Vorschlag oder kennt vielleicht die richtige Methode, um dies zu tun? Ich habe auch überlegt, zuerst den Eintrag zu löschen und dann hinzuzufügen. Das einzige Problem ist, dass Sie sowohl den Mimetyp fileExtension als auch die mimeTypes (dh Text / XML usw.) kennen müssen. Ich gehe also davon aus, dass ich zuerst beide Eigenschaften mit der getwebconfigpropertyMethode abrufen und dann löschen muss, indem ich die Werte daraus in die delete-webpropconfigFunktion analysiere und dann hinzufüge ... Aber drei Schritte nur zum Festlegen eines Mimetyps zu gehen, scheint übertrieben.

Soweit ich weiß, wird die Methode appcmd.exe set config "Werte und Parameter hier" so ziemlich direkt ausgeführt. Das Problem dabei ist jedoch, dass wir sie leider nicht verwenden können. Und ja, ich verstehe, dass ich die Powershell dazu bringen kann, den Befehl appcmd auszuführen. Leider ist dies keine praktikable Option. Ich habe versucht, in Büchern nach Lösungen zu googeln und zu lesen, habe aber bisher keine Antwort darauf gefunden, warum

1) Die set-webconfigurationpropertyMethode löscht alle anderen Mimetyp-Einträge

2) das add-webconfigurationpropertyerlaubt mir nicht, es auszuführen und wirft eine "Fehlerduplizierungs" -Nachricht aus

3) eine funktionierende Lösung, um dies in 1 Zeile mit Powershell zu tun.

Orbital
quelle

Antworten:

7

Das einzige, was zu funktionieren schien, ist Folgendes:

& $Env:WinDir\system32\inetsrv\appcmd.exe set config /section:staticContent /-"[fileExtension='.eml']"
& $Env:WinDir\system32\inetsrv\appcmd.exe set config /section:staticContent /+"[fileExtension='.eml',mimeType='application/octet-stream']"

Also habe ich mich für diese Methode entschieden, wie vielleicht bereits erwähnt, hat jede Art von Befehl set-webconfiguration einfach die gesamte Mimetype-Liste im IIS-Mimetype-Menü überschrieben.

Hoffe das hilft jemandem in der Zukunft

Orbital
quelle
4

Sie können verwenden Set-WebConfigurationProperty, müssen jedoch im XPath-Filter angeben, welchen Mimetyp Sie ändern möchten.

Der folgende Befehl ändert beispielsweise den MIME- Typ mit der Dateierweiterung " .currentExt " in " .changedExt " in der vom IIS-Server verwendeten Root-Datei web.config:

Set-WebConfigurationProperty -Filter "//staticContent/mimeMap[@fileExtension='.currentExt']" -PSPath IIS:\ -Name fileExtension -Value ".changedExt"

mimeMap wird im XPath verwendet, da die Struktur der application.host.config wie folgt lautet:

<staticContent lockAttributes="isDocFooterFileName">
   <mimeMap fileExtension=".323" mimeType="text/h323" />
   <mimeMap fileExtension=".aaf" mimeType="application/octet-stream" />
   <mimeMap fileExtension=".aca" mimeType="application/octet-stream" />
   ...
</staticContent>

Ich gehe davon aus, dass Sie den von http://sclarson.blogspot.co.at/2011/08/adding-mime-type-to-iis-vis-powershell.html vorgeschlagenen Code geändert haben, als Sie versucht haben, die mimeTypes mithilfe von zu ändern Set-WebConfigurationProperty. Der Grund, warum alle mimeTypes überschrieben wurden, wenn die folgende Änderung am Code im Link verwendet wurde

set-webconfigurationproperty //staticContent -name collection -value @{fileExtension='.otf'; mimeType='application/octet-stream'} 

Dies liegt daran, dass die gesamte Sammlung von mimeTypes durch nur einen Eintrag ersetzt wird.

Castrohenge
quelle
Dies sollte die akzeptierte Antwort sein, @Orbital. Verwenden Sie außerdem: Set-, WebConfigurationProperty ... -Name mimeType -Value "application/new-mime-type"wenn Sie den mimeType anstelle der Erweiterung ändern möchten.
CTB
1

Ich verstehe, dass diese Frage alt ist und beantwortet wurde, aber ich möchte das Gespräch für neue Zuschauer ergänzen. Getestet am IIS 8.5 Windows Server 2012R2. Leider habe ich keinen Zugriff auf IIS 7.5.

Verwenden der ZIP-Erweiterung als Beispiel für eine Dateierweiterung

Hinzufügen eines neuen MIME-Typs:

Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter "system.webServer/staticContent" -Name "." -Value @{ fileExtension='.zip'; mimeType='application/x-zip-compressed' }

Bearbeiten eines vorhandenen MIME-Typs:

Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter "system.webServer/staticContent/mimeMap[@fileExtension='.zip']" -Name "fileExtension" -Value ".example"

Entfernen eines vorhandenen MIME-Typs:

Remove-WebConfigurationProperty  -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter "system.webServer/staticContent" -Name "." -AtElement @{ fileExtension= '.zip' }

Lesen / Abrufen eines vorhandenen MIME-Typs:

$getSetting = Get-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter "system.webServer/staticContent" -Name "."
$getSetting.Collection | Where-Object { $_.fileExtension -eq ".zip"}
#OR
Get-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter "system.webServer/staticContent" -Name "." | Where-Object { $_.fileExtension -eq ".zip"}
HiTech
quelle
0

Wenn Sie nicht verwenden appcmdkönnen und set-webconfigurationproprtynicht funktionieren, funktioniert möglicherweise eine benutzerdefinierte Funktion?

Holen Sie sich die COM-DLL "Interop.IISOle.dll" und platzieren Sie sie an einem leicht referenzierbaren Ort (z. B. verweisen Sie in einem Dummy-Projekt auf die COM-Komponente "Active DS IIS Namespace Provider", erstellen Sie die DLL und holen Sie sie aus dem bin-Ordner).

function AddMimeType ([string] $websiteId, [string] $extension, [string] $application)
{
    [Reflection.Assembly]::LoadFile("yourpath\Interop.IISOle.dll") | Out-Null;
    $directoryEntry = New-Object System
                      .DirectoryServices
                      .DirectoryEntry("IIS://localhost/W3SVC/$websiteId/root");
    try {
        $mimeMap = $directoryEntry.Properties["MimeMap"]
        $mimeType = New-Object "IISOle.MimeMapClass";
        $mimeType.Extension = $extension
        $mimeType.MimeType = $application
        $mimeMap.Add($mimeType)
        $directoryEntry.CommitChanges()
        } 
    finally {
        if ($directoryEntry -ne $null) {
            if ($directoryEntry.psbase -eq $null) {
                $directoryEntry.Dispose()
            } else {
                $directoryEntry.psbase.Dispose()
            }
        }
    }
}

AddMimeType "123456" ".pdf" "application/pdf"

Referenz: Die akzeptierte Antwort auf die Frage Wie verwende ich PowerShell, um den MIME-Typ auf einer IIS-Website festzulegen?

Benny Skogberg
quelle
1
Benny, sieht interessant aus, ich werde es am Montag überprüfen, wenn ich wieder im Büro bin. Vielen Dank dafür, ich bewerte dies als die richtige Antwort, weil ich ehrlich gesagt keine Optionen mehr habe und dies scheint zu funktionieren. Vielen Dank für Ihre Zeit!
Orbital