Edição / configuração de tipos de mímica com o PowerShell?

8

Então, eu queria saber se existe uma maneira específica de alterar / editar um tipo MIME no IIS 7.5 usando o PowerShell?

Até agora, encontrei soluções para adicionar tipos de mimet como: http://sclarson.blogspot.co.at/2011/08/adding-mime-type-to-iis-vis-powershell.html http: // forums. iis.net/t/1192371.aspx e alguns outros que têm livros sendo referenciados, mas esses livros não contêm nenhuma informação sobre isso, verifiquei.

Parece que o uso de Add-WebConfigurationPropertyé usado, mas quando eu uso esse método para um tipo mimético existente, recebo um erro relacionado a uma entrada de item duplicada (já que ela já está lá), portanto esse método fica fora da janela.

Tentei usar o em Set-WebConfigurationPropertyvez disso, mas isso resultou na exclusão de TODAS as entradas de tipo MIME existentes e deixando apenas uma delas.

Então, alguém tem uma sugestão ou talvez saiba o método correto de fazer isso? Também considerei fazer algo como primeiro excluir a entrada e depois adicioná-la, o único problema é que você precisará conhecer o tipo de arquivo mimetypeExtension e os mimeTypes (por exemplo, texto / XML etc.). Então, suponho que eu precisaria primeiro obter as duas propriedades usando o getwebconfigpropertymétodo, excluí-lo analisando os valores dele na delete-webpropconfigfunção e adicioná-lo ... Mas seguir três etapas apenas para definir um tipo de mim parece excessivo ..

Pelo que entendi, o método appcmd.exe set config "values ​​and params here" será bastante simples. O problema é que, infelizmente, não podemos usá-lo. E sim, eu entendo que posso fazer o PowerShell executar o comando appcmd, infelizmente, essa não é uma opção viável. Tentei pesquisar no Google e ler livros em busca de soluções, mas ainda não encontrei uma resposta sobre o porquê.

1) o set-webconfigurationpropertymétodo exclui todas as outras entradas de tipo MIME

2) o add-webconfigurationpropertynão permitirá que eu o execute e lança uma mensagem de "duplicação de erro"

3) uma solução funcional para fazer isso em 1 linha com o PowerShell.

Orbital
fonte

Respostas:

7

A única coisa que parecia funcionar é o seguinte:

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

Então, eu segui esse método, como talvez mencionado anteriormente, qualquer tipo de comando set-webconfiguration simplesmente substituiu a lista inteira de tipos de mimetipo no menu mimetype do IIS.

espero que isso ajude alguém no futuro

Orbital
fonte
4

Você pode usar, Set-WebConfigurationPropertymas precisa especificar, no filtro XPath, o tipo de tipo que deseja alterar.

Por exemplo, o comando a seguir alterará o tipo mime com a extensão de arquivo " .currentExt " para " .changedExt " no web.config raiz usado pelo servidor IIS:

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

mimeMap é usado no XPath porque a estrutura do application.host.config é a seguinte:

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

Suponho que você estava modificando o código sugerido por http://sclarson.blogspot.co.at/2011/08/adding-mime-type-to-iis-vis-powershell.html ao tentar modificar os mimeTypes usando Set-WebConfigurationProperty. O motivo pelo qual todos os mimeTypes estavam sendo substituídos ao usar a seguinte modificação no código no link

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

é porque toda a coleção de mimeTypes está sendo substituída por apenas uma entrada.

Castrohenge
fonte
Essa deve ser a resposta aceita, @Orbital. Além disso, use: Set - WebConfigurationProperty ... -Name mimeType -Value "application/new-mime-type"se você deseja alterar o mimeType em vez da extensão.
CTB
1

Entendo que esta pergunta é antiga e foi respondida, mas gostaria de adicionar à conversa os novos visitantes. Testado em IIS 8.5 Windows Server 2012R2. Infelizmente, não tenho acesso ao IIS 7.5.

Usando a extensão .zip como minha extensão de arquivo de exemplo

Adicionando um novo tipo MIME:

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

Editando um tipo MIME existente:

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

Removendo um tipo MIME existente:

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

Lendo / Obtendo um 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"}
HiTech
fonte
0

Se você não pode usar appcmde set-webconfigurationproprtynão está funcionando, talvez uma função personalizada funcione?

Pegue a DLL COM "Interop.IISOle.dll" e coloque-a em algum lugar facilmente referenciada (por exemplo, faça referência ao componente COM "Provedor de Namespace Active DS IIS" em um projeto fictício, crie e pegue a DLL na pasta 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"

Referência: a resposta aceita para a pergunta Como usar o PowerShell para definir o Mime Type em um site do IIS?

Benny Skogberg
fonte
1
Benny, parece interessante, vou dar uma olhada na segunda-feira quando voltar ao escritório. Obrigado por isso, estou classificando isso como a resposta correta, porque, francamente, estou sem opções e isso parece que vai funcionar. Obrigado pelo seu tempo!
Orbital