¿Edición / configuración de tipos MIME con Powershell?

8

Entonces, me preguntaba si hay una forma específica de cambiar / editar un tipo mime en IIS 7.5 usando powershell.

Hasta ahora he encontrado soluciones para agregar tipos MIME como: http://sclarson.blogspot.co.at/2011/08/adding-mime-type-to-iis-vis-powershell.html http: // foros. iis.net/t/1192371.aspx y un par de otros que tienen libros a los que se hace referencia pero esos libros no contienen ninguna información al respecto, lo comprobé.

Parece que Add-WebConfigurationPropertyse usa el, pero cuando uso este método para un tipo MIME existente, recibiré un error relacionado con una entrada de elemento duplicado (ya que está allí), por lo que este método está fuera de la ventana.

Intenté usar el Set-WebConfigurationPropertyen su lugar, pero eso provocó que eliminara TODAS las entradas de mimetype existentes y simplemente dejara una de ellas.

Entonces, ¿alguien tiene una sugerencia o quizás conoce el método correcto para hacerlo? También consideré hacer algo como eliminar primero la entrada y luego agregarla, el único problema es que necesitará conocer tanto la extensión de archivo mimetype como los tipos de mime (es decir, texto / XML, etc.). Así que supongo que primero necesitaría obtener ambas propiedades usando el getwebconfigpropertymétodo, luego eliminarlo analizando los valores en la delete-webpropconfigfunción y luego agregarlo ... Pero seguir tres pasos solo para establecer un tipo MIME parece excesivo ...

Por lo que entiendo, el método appcmd.exe set config "valores y parámetros aquí" prácticamente lo hará directamente ... el problema con esto, sin embargo, es que desafortunadamente no podemos usarlo. Y sí, entiendo que puedo hacer que el PowerShell ejecute el comando appcmd desafortunadamente, esta no es una opción viable. He intentado buscar en Google y leer libros en busca de soluciones, pero hasta ahora no he encontrado una respuesta sobre por qué

1) el set-webconfigurationpropertymétodo elimina todas las demás entradas mimetype

2) el add-webconfigurationpropertyno me permitirá realizarlo y arroja un mensaje de "duplicación de error"

3) una solución de trabajo para hacer esto en 1 línea con powershell.

Orbital
fuente

Respuestas:

7

Lo único que parecía funcionar es esto:

& $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']"

Así que he seguido este método, tal vez como se mencionó anteriormente, cualquier tipo de comando set-webconfiguration simplemente ha sobrescrito toda la lista mimetype dentro del menú IIS mimetype.

Espero que esto ayude a alguien en el futuro

Orbital
fuente
4

Puede usar, Set-WebConfigurationPropertypero debe especificar en el filtro XPath qué tipo de mime desea cambiar.

Por ejemplo, el siguiente comando cambiará el tipo mime con la extensión de archivo " .currentExt " a " .changedExt " en la raíz web.config utilizada por el servidor IIS:

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

mimeMap se usa en XPath porque la estructura de application.host.config es la siguiente:

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

Supongo que estaba modificando el código sugerido por http://sclarson.blogspot.co.at/2011/08/adding-mime-type-to-iis-vis-powershell.html al intentar modificar los mimeTypes usando Set-WebConfigurationProperty. La razón por la que se sobrescribieron todos los mimeTypes al usar la siguiente modificación en el código en el enlace

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

es porque toda la colección de mimeTypes está siendo reemplazada por una sola entrada.

Castrohenge
fuente
Esta debería ser la respuesta aceptada, @Orbital. Además, use: Set- WebConfigurationProperty ... -Name mimeType -Value "application/new-mime-type"si desea cambiar el mimeType en lugar de la extensión.
ctb
1

Entiendo que esta pregunta es antigua y ha sido respondida, pero me gustaría agregar a la conversación para los nuevos espectadores. Probado en IIS 8.5 Windows Server 2012R2. Lamentablemente, no tengo acceso a IIS 7.5.

Usando la extensión .zip como mi extensión de archivo de ejemplo

Agregar un nuevo tipo MIME:

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

Edición de un tipo MIME existente:

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

Eliminar un tipo MIME existente:

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

Lectura / obtención de un tipo MIME existente:

$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"}
De alta tecnología
fuente
0

Si no puede usar appcmd, y set-webconfigurationproprtyno funciona, ¿tal vez funcionará una función personalizada?

Tome el DLL COM "Interop.IISOle.dll" y colóquelo en un lugar fácilmente referenciado (por ejemplo, haga referencia al componente COM "Proveedor de espacio de nombres Active DS IIS" en un proyecto ficticio, compile y tome el DLL de la carpeta bin)

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"

Referencia: la respuesta aceptada a la pregunta ¿Cómo usar PowerShell para configurar Mime Type en un sitio web de IIS?

Benny Skogberg
fuente
1
Benny, parece interesante, lo comprobaré el lunes cuando vuelva a la oficina. Gracias por esto, lo califico como la respuesta correcta porque, francamente, no tengo opciones y parece que funcionará. ¡Gracias por tu tiempo!
Orbital