Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo fornece algumas informações sobre o problema de manter os recursos de idioma e funcionalidades a pedido durante as atualizações do sistema operativo e oferece orientações para o ajudar a avançar a curto prazo e a preparar-se a longo prazo.
Quando atualiza o sistema operativo, é fundamental manter os recursos de idioma e as Funcionalidades a Pedido (FODs). Muitas organizações comerciais utilizam Configuration Manager ou outras ferramentas de gestão para distribuir e orquestrar a configuração do cliente Windows com uma imagem ou ficheiro WIM local do Windows (uma atualização baseada em sequência de tarefas ou baseada em multimédia). Outros fazem atualizações no local através de uma atualização de funcionalidades de cliente Windows aprovada com Windows Server Update Services (WSUS), Configuration Manager ou ferramentas equivalentes (uma atualização baseada em manutenção).
Nenhuma das abordagens contém o conjunto completo de funcionalidades opcionais do Windows de que o dispositivo de um utilizador poderá precisar, pelo que essas funcionalidades não são migradas para o novo sistema operativo. No passado, essas funcionalidades não estavam disponíveis no Configuration Manager nem no WSUS para aquisição no local após uma atualização de funcionalidades.
O que é conteúdo opcional?
O conteúdo opcional inclui os seguintes itens:
- Funcionalidades Gerais a Pedido também referidas como FODs (por exemplo, Windows Mixed Reality)
- FODs regionais e baseados em idiomas (por exemplo, Language.Basic~~ja-jp~0.0.1.0)
- Pacotes de Experiência Local
- Pacotes de idiomas
O conteúdo opcional não está incluído por predefinição no ficheiro de imagem do Windows que faz parte do suporte de dados do sistema operativo disponível no Centro de Serviços de Licenciamento em Volume (VLSC). Em vez disso, é lançado como um ficheiro ISO adicional no VLSC. Enviar estas funcionalidades para fora do suporte de dados do sistema operativo e enviá-las separadamente reduz a quantidade de espaço no disco do Windows. Esta abordagem fornece mais espaço para os dados do utilizador. Também reduz o tempo necessário para atender o sistema operativo, quer esteja a instalar uma atualização de qualidade mensal ou a atualizar para uma versão mais recente. Uma imagem predefinida do Windows mais pequena também significa menos dados para transmitir através da rede.
Porque é que a aquisição de conteúdo opcional é desafiante?
Normalmente, os desafios em torno dos conteúdos opcionais enquadram-se em dois grupos:
Atualizações incompletas do sistema operativo
O primeiro desafio está relacionado com a migração de conteúdos durante uma atualização de funcionalidades. Quando a Configuração do Windows efetua uma atualização no local, o novo sistema operativo é escrito no disco do utilizador juntamente com a versão antiga numa pasta temporária, onde é instalado um segundo sistema operativo limpo e preparado para o utilizador avançar. Quando a operação acontece, a Configuração do Windows enumera o conteúdo opcional já instalado na versão atual e planeia instalar a nova versão deste conteúdo no novo sistema operativo.
A Configuração do Windows precisa de acesso ao conteúdo opcional. Uma vez que os conteúdos opcionais não estão na imagem do Windows por predefinição, a Configuração do Windows tem de procurar noutro local para obter os pacotes do Windows, configurá-los e, em seguida, instalá-los no novo sistema operativo. Quando não é possível localizar o conteúdo, o resultado é uma atualização que tem funcionalidades em falta no dispositivo, um utilizador final frustrado e, provavelmente, uma chamada de suporte técnico. Por vezes, este ponto de dor é referido como falha ao migrar conteúdo opcional durante a atualização. Para atualizações baseadas em multimédia, o Windows tentará automaticamente novamente assim que o novo sistema operativo arrancar. Chamamos a esta aquisição latente.
Falha na aquisição de funcionalidades iniciada pelo utilizador
O segundo desafio envolve uma falha na aquisição de funcionalidades quando um utilizador as solicita. Imagine um utilizador a executar um dispositivo com uma nova versão do cliente Windows ao utilizar uma instalação limpo ou uma atualização no local. O utilizador visita Definições e tenta instalar um segundo idioma, mais funcionalidades de experiência de idioma ou outro conteúdo opcional. Uma vez que estas funcionalidades não estão no sistema operativo, os pacotes têm de ser adquiridos. Para um utilizador típico com acesso à Internet, o Windows adquire as funcionalidades de uma rede de entrega de conteúdos da Microsoft próxima e tudo funciona conforme concebido. Para os utilizadores comerciais, alguns podem não ter acesso à Internet ou ter políticas para impedir a aquisição através da Internet. Nestas situações, o Windows tem de adquirir o conteúdo a partir de uma localização alternativa. Quando não é possível encontrar o conteúdo, os utilizadores ficam frustrados e pode ser efetuada outra chamada de suporte técnico. Por vezes, este ponto de dor é referido como falha ao adquirir conteúdo opcional.
Opções para adquirir conteúdo opcional
A maioria das organizações comerciais compreende os pontos de dor descritos acima e as discussões normalmente começam com elas a perguntar que planos estão disponíveis para enfrentar estes desafios. A tabela seguinte inclui várias opções para consideração, consoante a forma como está atualmente a implementar o cliente Windows. As seguintes definições são utilizadas nos cabeçalhos de tabela:
- Migração: suporta a migração de conteúdo opcional durante uma atualização.
- Aquisição: suporta a aquisição de conteúdo opcional (ou seja, iniciada pelo utilizador).
- Suporte de dados: aplicável com implementações baseadas em multimédia.
- Manutenção: aplicável com implementações baseadas em manutenção.
| Método | Migração | Aquisição | Mídia | Manutenção |
|---|---|---|---|---|
| Opção 1: Utilizar Windows Update | Sim | Sim | Não | Sim |
| Opção 2: Utilizar o WSUS com a Integração UUP | Sim | Sim | Não | Sim |
| Opção 3: Ativar a Atualização Dinâmica | Sim | Não | Sim | Sim |
| Opção 4: Personalizar a imagem do Windows antes da implementação | Sim | Não | Sim | Não |
| Opção 5: Instalar funcionalidades de idioma durante a implementação | Parcial | Não | Sim | Não |
| Opção 6: Instalar conteúdo opcional após a implementação | Sim | Não | Sim | Sim |
| Opção 7: Configurar uma origem alternativa para Funcionalidades a Pedido | Não | Parcial | Sim | Sim |
Opção 1: Utilizar Windows Update
Windows Update políticas de cliente resolvem o problema de conteúdo opcional. O conteúdo opcional é publicado e está disponível para aquisição pela Configuração do Windows a partir de uma rede de entrega de conteúdos da Microsoft próxima e adquirido através da Plataforma de Atualização Unificada. Os cenários opcionais de migração e aquisição de conteúdos só funcionam quando o dispositivo está ligado a um serviço de atualização que utiliza a Plataforma de Atualização Unificada, como Windows Update ou Windows Update políticas de cliente. Se, por algum motivo, um pacote de idiomas não conseguir instalar durante a atualização, a atualização será revertida automaticamente.
A Plataforma de Atualização Unificada é uma melhoria na tecnologia de atualização do Windows subjacente que resulta em tamanhos de transferência mais pequenos e num protocolo mais eficiente para procurar atualizações, adquirir e instalar os pacotes necessários e ficar atualizado num passo de atualização. A tecnologia é unificada porque reúne a pilha de atualizações para o cliente Windows, Windows Server e outros produtos, como o HoloLens.
Considere mudar para Windows Update políticas de cliente. O cenário de conteúdo opcional não só funcionará de forma totalmente integrada (como acontece atualmente com os dispositivos de consumidor), como também obterá todas as vantagens de tamanhos de transferência mais pequenos. Além disso, os dispositivos são imunes ao desafio de atualizar o Windows quando o idioma de instalação do sistema operativo é inadvertidamente alterado para um novo idioma. Caso contrário, quaisquer futuras atualizações de funcionalidades baseadas em multimédia podem falhar quando o suporte de dados de instalação tiver um idioma de instalação diferente. Para obter mais informações sobre este problema, veja Atualizar dispositivos Windows 10 com suportes de dados de instalação diferentes do idioma de instalação do SO original.
Opção 2: Utilizar o WSUS com a Integração UUP
A partir de março de 2023, a UUP foi integrada no WSUS e Configuration Manager para trazer os mesmos benefícios opcionais de conteúdo e aquisição de Windows Update para soluções de gestão no local. Por exemplo:
Os FODs e os idiomas migrarão automaticamente para dispositivos que efetuem uma atualização no local com uma atualização de funcionalidades de cliente de Windows 11 aprovada, versão 22H2 do WSUS. Da mesma forma, as atualizações, como a atualização cumulativa combinada, as atualizações de Configuração e as atualizações do SO Seguro, são incluídas e atualizadas com base no mês em que a atualização de funcionalidades foi aprovada.
Os dispositivos que atualizam com uma imagem do Windows local, mas que utilizam o WSUS ou Configuration Manager para aprovar a atualização cumulativa combinada, beneficiarão do suporte para a aquisição de conteúdo opcional no SO Windows atualizado, bem como a autorrecuperação do SO.
O conteúdo necessário para o ativar será adquirido através do WSUS ou Configuration Manager, sem que os pontos finais do cliente necessitem de conectividade à Internet. Para ativar esta melhoria, uma vez por versão principal do Windows, é necessária uma transferência significativa para o diretório de conteúdos do WSUS ou para o ponto de distribuição. Isto inclui pacotes para suportar fod e aquisição de idioma, juntamente com pacotes para permitir a autorrecuperação do SO devido a danos. Para obter mais informações, veja Planear a implementação do WSUS.
Opção 3: Ativar a Atualização Dinâmica
Se não estiver pronto para mudar para Windows Update, outra opção é ativar a Atualização Dinâmica durante uma atualização de funcionalidades. Assim que uma atualização de funcionalidades do Windows é iniciada, seja através de uma atualização baseada em multimédia ou de uma atualização de funcionalidades baseada em WSUS, a Atualização Dinâmica é um dos primeiros passos invocados. A Configuração do Windows liga-se a um URL com acesso à Internet alojado pela Microsoft para obter conteúdo de Atualização Dinâmica e, em seguida, aplica essas atualizações ao suporte de dados de instalação do sistema operativo. O conteúdo adquirido inclui o seguinte:
- Atualizações de configuração: correções para Setup.exe binários ou quaisquer ficheiros que a Configuração utilize para atualizações de funcionalidades.
- Atualizações seguras do SO: correções para o SO seguro que são utilizados para atualizar o ambiente de recuperação do Windows (WinRE).
- Atualizações da pilha de manutenção: correções necessárias para resolver o problema da pilha de manutenção do Windows e, portanto, necessárias para concluir a atualização de funcionalidades.
- Atualização cumulativa mais recente: instala a atualização de qualidade cumulativa mais recente.
- Atualizações do controlador: a versão mais recente dos controladores aplicáveis que já foram publicados pelos fabricantes no Windows Update e destinada especificamente à Atualização Dinâmica.
Além destas atualizações para o novo sistema operativo, a Atualização Dinâmica adquire conteúdo opcional durante o processo de atualização para garantir que o dispositivo tem este conteúdo presente quando a atualização for concluída. Assim, embora o dispositivo não esteja ligado a Windows Update, obtém conteúdo de uma rede de transferência de conteúdos (CDN) da Microsoft próxima. Esta abordagem aborda o primeiro ponto de dor com conteúdo opcional, mas não aquisição iniciada pelo utilizador. Por predefinição, a Atualização Dinâmica é ativada pela Configuração do Windows. Pode ativar ou desativar a Atualização Dinâmica utilizando a opção /DynamicUpdate na Configuração do Windows. Se utilizar a abordagem baseada na manutenção, pode definir este valor com setupconfig.ini. Veja Descrição Geral da Automatização de Configuração do Windows para obter detalhes.
A Atualização Dinâmica pode ser configurada com opções adicionais. Por exemplo, poderá querer ter os benefícios da migração de conteúdo opcional sem adquirir automaticamente a atualização de qualidade mais recente. Pode fazê-lo com a opção /DynamicUpdate NoLCU da Configuração do Windows. Posteriormente, seguiria separadamente o processo existente para testar e aprovar atualizações mensais. A desvantagem desta abordagem é que o dispositivo reinicia novamente para a atualização cumulativa mais recente, uma vez que não estava disponível durante a atualização de funcionalidades.
Uma outra consideração ao utilizar a Atualização Dinâmica é o efeito na sua rede. Um dos principais bloqueadores desta abordagem é a preocupação de que cada dispositivo obtenha separadamente este conteúdo da Microsoft. A configuração transfere o conteúdo da Atualização Dinâmica através da Otimização da Entrega quando disponível. Para dispositivos que não estão ligados à Internet, está disponível um subconjunto do conteúdo da Atualização Dinâmica através do WSUS e do catálogo da Microsoft.
Opção 4: Personalizar a Imagem do Windows antes da implementação
Para muitas organizações, o fluxo de trabalho de implementação envolve uma sequência de tarefas Configuration Manager que executa uma atualização baseada em multimédia. Alguns clientes não têm conectividade à Internet ou a conectividade é fraca, pelo que não podem ativar a Atualização Dinâmica. Nestes casos, recomendamos a instalação de conteúdos opcionais antes da implementação. Por vezes, esta atividade é referida como personalização do suporte de dados de instalação.
Pode personalizar a imagem do Windows das seguintes formas:
- Aplicar uma atualização cumulativa
- Aplicar atualizações à pilha de manutenção
- Aplicar atualizações a
Setup.exebinários ou outros ficheiros que a configuração utiliza para atualizações de funcionalidades - Aplicar atualizações para o sistema operativo seguro (SafeOS) utilizado para o ambiente de recuperação do Windows
- Adicionar ou remover idiomas
- Adicionar ou remover Funcionalidades a Pedido
A vantagem desta opção é que a imagem do Windows pode incluir esses idiomas adicionais, funcionalidades de experiência de idioma e outras Funcionalidades a Pedido através de atualizações únicas à imagem. Em seguida, pode utilizá-los numa sequência de tarefas existente ou numa implementação personalizada em Setup.exe que esteja envolvido. A desvantagem desta abordagem é que requer alguma preparação antecipada da imagem, incluindo scripting com DISM para instalar os pacotes adicionais. Também significa que a imagem é a mesma para todos os dispositivos que a consomem e pode conter mais funcionalidades do que alguns utilizadores precisam. Para obter mais informações sobre como personalizar o suporte de dados, consulte Atualizar Windows 10 multimédia com pacotes de Atualização Dinâmica. Tal como a Atualização Dinâmica, ainda tem uma solução para a migração de conteúdo opcional, mas não suporta a aquisição de conteúdo opcional iniciada pelo utilizador. Além disso, existe uma variação desta opção em que o suporte de dados é atualizado no dispositivo imediatamente antes da instalação. Esta opção permite a personalização de imagens específicas do dispositivo com base no que está atualmente instalado.
Opção 5: Instalar funcionalidades de idioma durante a implementação
Uma solução parcial para resolver o primeiro ponto de falha na migração de conteúdo opcional durante a atualização é injetar um subconjunto de conteúdo opcional durante o processo de atualização. Esta abordagem utiliza a opção de Configuração do Windows /InstallLangPacks para adicionar Pacotes de Idiomas e capacidades de linguagem, como o reconhecimento de conversão de texto em voz a partir de uma pasta que contém os pacotes. Esta abordagem permite que um profissional de TI utilize um subconjunto de conteúdos opcionais e os teste na respetiva rede. Se utilizar a abordagem baseada na manutenção, pode configurar InstallLangPacks com setupconfig.ini. Para obter mais informações, veja Descrição Geral da Automatização de Configuração do Windows.
Quando a Configuração é executada, injeta estes pacotes no novo sistema operativo durante a instalação. Pode ser uma alternativa para ativar a Atualização Dinâmica ou personalizar a imagem do sistema operativo antes da implementação. Tem de ter cuidado com esta abordagem, porque não é possível mudar o nome dos pacotes. Além disso, o conteúdo provém de dois ISOs de multimédia de lançamento separados. A chave é copiar os pacotes FOD e os metadados FOD .cab do ISO FOD para a pasta e o Language Pack específico da arquitetura .cab ficheiros do ISO LPLIP. Tratamos as falhas de InstallLangPacks como fatais e revertemos toda a atualização. A ideia é não deixar o utilizador num estado incorreto, uma vez que as atualizações baseadas em multimédia não migram FOD e idiomas (a menos que a Atualização Dinâmica esteja ativada).
Esta abordagem tem alguns benefícios interessantes. A imagem original do Windows não precisa de ser modificada, possivelmente poupando tempo e scripts.
Opção 6: Instalar conteúdo opcional após a implementação
Esta opção é semelhante à Opção 4 na medida em que personaliza a imagem do sistema operativo com conteúdo mais opcional depois de ser implementada. Os profissionais de TI podem expandir o comportamento da Configuração do Windows ao executar os seus próprios scripts de ação personalizada durante e após uma atualização de funcionalidades. Veja Executar ações personalizadas durante a atualização de funcionalidades para obter detalhes. Com esta abordagem, pode criar uma migração específica do dispositivo de conteúdo opcional ao capturar o conteúdo opcional que está instalado no sistema operativo e, em seguida, guardar esta lista para instalar o mesmo conteúdo opcional no novo sistema operativo. Tal como a Opção 5, alojaria internamente uma partilha de rede que contém a origem dos pacotes de conteúdo opcionais. Em seguida, durante a execução da Configuração no dispositivo, capture a lista de conteúdos opcionais instalados a partir do sistema operativo de origem e guarde. Mais tarde, após a conclusão da Configuração, utilize a lista para instalar o conteúdo opcional, o que deixa o dispositivo do utilizador sem perda de funcionalidade.
Opção 7: Configurar uma origem alternativa para conteúdo opcional
Várias das opções abordam formas de resolver problemas opcionais de migração de conteúdos durante uma atualização no local. Para resolver o segundo ponto de dor de adquirir facilmente conteúdos opcionais no caso iniciado pelo utilizador, pode configurar cada dispositivo utilizando as definições Especificar para instalação opcional de componentes e reparação de componentes Política de Grupo. Esta definição de política especifica as localizações de rede que serão utilizadas para a reparação de danos no sistema operativo e para ativar funcionalidades opcionais que tiveram os respetivos ficheiros de payload removidos. Esta abordagem tem a desvantagem de mais conteúdo a ser alojado na sua rede (além da imagem do sistema operativo que ainda pode estar a implementar em alguns clientes), mas tem a vantagem de adquirir conteúdo na sua rede. Alguns lembretes sobre esta política:
- O caminho do ficheiro para a origem alternativa tem de ser um caminho completamente qualificado; várias localizações podem ser separadas por ponto e vírgula.
- Esta definição não suporta a instalação de pacotes de idiomas a partir de um caminho de ficheiro de origem alternativo, apenas Funcionalidades a Pedido. Se a política estiver configurada para adquirir conteúdo de Windows Update, os pacotes de idiomas serão adquiridos.
- Se esta definição não estiver configurada ou desativada, os ficheiros são transferidos a partir da localização de Windows Update predefinida, por exemplo, Windows Update políticas de cliente ou WSUS.
Para obter mais informações, consulte Configurar uma Origem de Reparação do Windows e Como disponibilizar Funcionalidades a Pedido e pacotes de idiomas quando estiver a utilizar o WSUS ou Configuration Manager.
Mais recursos
Para obter mais informações sobre a Plataforma de Atualização Unificada e as abordagens descritas neste artigo, veja os seguintes recursos:
- Planejar sua implantação do WSUS
- /InstallLangPacks
- /DynamicUpdate
- Configurar uma Origem de Reparação do Windows
- Executar ações personalizadas durante a atualização de funcionalidades
- Unified Update Platform
- Atualizar o suporte de dados de instalação do Windows com pacotes de Atualização Dinâmica
- Visão geral da automação da Instalação do Windows
Scripts de exemplo
As opções 4 e 6 envolvem mais scripts. Os scripts de exemplo para a Opção 4 já existem, por isso vamos ver os scripts de exemplo da Opção 6: Instalar Conteúdo Opcional após a Implementação.
Criar um repositório de conteúdo opcional
Para começar, criamos um repositório de conteúdo opcional e anfitrião numa partilha de rede. Este conteúdo é um subconjunto de conteúdos dos ISOs fod e do pacote de idiomas que são enviados com cada versão. Configuramos este repositório ou repositório apenas com os FODs de que a nossa organização precisa, utilizando DISM /Export. Por exemplo, um superconjunto baseado na criação do inventário de funcionalidades opcionais instaladas em dispositivos existentes. Neste caso, excluemos a funcionalidade Windows Mixed Reality. Além disso, copiamos todos os pacotes de idiomas para a raiz do repositório.
# Declare media for FOD and LPs
$LP_ISO_PATH = "C:\_IMAGE\2004_ISO\CLIENTLANGPACKDVD_OEM_MULTI.iso"
$FOD_ISO_PATH = "C:\_IMAGE\2004_ISO\FOD-PACKAGES_OEM_PT1_amd64fre_MULTI.iso"
# Declare folders
$WORKING_PATH = "C:\_IMAGE\BuildRepo"
$MEDIA_PATH = "C:\_IMAGE\2004_SETUP"
$MAIN_OS_MOUNT = $WORKING_PATH + "\MainOSMount"
$REPO_PATH = $WORKING_PATH + "\Repo"
# Create folders for mounting image optional content repository
if (Test-Path $MAIN_OS_MOUNT) {
Remove-Item -Path $MAIN_OS_MOUNT -Force -Recurse -ErrorAction stop| Out-Null
}
if (Test-Path $REPO_PATH) {
Remove-Item -Path $REPO_PATH -Force -Recurse -ErrorAction stop| Out-Null
}
New-Item -ItemType Directory -Force -Path $MAIN_OS_MOUNT -ErrorAction stop| Out-Null
New-Item -ItemType Directory -Force -Path $REPO_PATH -ErrorAction stop| Out-Null
# Mount the main OS, I'll use this throughout the script
Write-Host "Mounting main OS"
Mount-WindowsImage -ImagePath $MEDIA_PATH"\sources\install.wim" -Index 1 -Path $MAIN_OS_MOUNT -ErrorAction stop| Out-Null
# Mount the LP ISO
Write-Host "Mounting LP ISO"
$LP_ISO_DRIVE_LETTER = (Mount-DiskImage -ImagePath $LP_ISO_PATH -ErrorAction stop | Get-Volume).DriveLetter
# Declare language related cabs
$OS_LP_PATH = $LP_ISO_DRIVE_LETTER + ":\x64\langpacks\" + "*.cab"
# Mount the FOD ISO
Write-Host "Mounting FOD ISO"
$FOD_ISO_DRIVE_LETTER = (Mount-DiskImage -ImagePath $FOD_ISO_PATH -ErrorAction stop | Get-Volume).DriveLetter
$FOD_PATH = $FOD_ISO_DRIVE_LETTER + ":\"
# Export the FODs from the ISO that we are interested in
Write-Host "Exporting FODs to Repo"
DISM /image:$MAIN_OS_MOUNT /export-source /source:$FOD_PATH /target:$REPO_PATH `
/capabilityname:Accessibility.Braille~~~~0.0.1.0 `
/capabilityname:App.StepsRecorder~~~~0.0.1.0 `
/capabilityname:App.WirelessDisplay.Connect~~~~0.0.1.0 `
/capabilityname:Browser.InternetExplorer~~~~0.0.11.0 `
/capabilityname:DirectX.Configuration.Database~~~~0.0.1.0 `
/capabilityname:Language.Basic~~~af-za~0.0.1.0 `
/capabilityname:Language.Basic~~~ar-sa~0.0.1.0 `
/capabilityname:Language.Basic~~~as-in~0.0.1.0 `
/capabilityname:Language.Basic~~~az-latn-az~0.0.1.0 `
/capabilityname:Language.Basic~~~ba-ru~0.0.1.0 `
/capabilityname:Language.Basic~~~be-by~0.0.1.0 `
/capabilityname:Language.Basic~~~bg-bg~0.0.1.0 `
/capabilityname:Language.Basic~~~bn-bd~0.0.1.0 `
/capabilityname:Language.Basic~~~bn-in~0.0.1.0 `
/capabilityname:Language.Basic~~~bs-latn-ba~0.0.1.0 `
/capabilityname:Language.Basic~~~ca-es~0.0.1.0 `
/capabilityname:Language.Basic~~~cs-cz~0.0.1.0 `
/capabilityname:Language.Basic~~~cy-gb~0.0.1.0 `
/capabilityname:Language.Basic~~~da-dk~0.0.1.0 `
/capabilityname:Language.Basic~~~de-ch~0.0.1.0 `
/capabilityname:Language.Basic~~~de-de~0.0.1.0 `
/capabilityname:Language.Basic~~~el-gr~0.0.1.0 `
/capabilityname:Language.Basic~~~en-au~0.0.1.0 `
/capabilityname:Language.Basic~~~en-ca~0.0.1.0 `
/capabilityname:Language.Basic~~~en-gb~0.0.1.0 `
/capabilityname:Language.Basic~~~en-in~0.0.1.0 `
/capabilityname:Language.Basic~~~en-us~0.0.1.0 `
/capabilityname:Language.Basic~~~es-es~0.0.1.0 `
/capabilityname:Language.Basic~~~es-mx~0.0.1.0 `
/capabilityname:Language.Basic~~~es-us~0.0.1.0 `
/capabilityname:Language.Basic~~~et-ee~0.0.1.0 `
/capabilityname:Language.Basic~~~eu-es~0.0.1.0 `
/capabilityname:Language.Basic~~~fa-ir~0.0.1.0 `
/capabilityname:Language.Basic~~~fi-fi~0.0.1.0 `
/capabilityname:Language.Basic~~~fil-ph~0.0.1.0 `
/capabilityname:Language.Basic~~~fr-be~0.0.1.0 `
/capabilityname:Language.Basic~~~fr-ca~0.0.1.0 `
/capabilityname:Language.Basic~~~fr-ch~0.0.1.0 `
/capabilityname:Language.Basic~~~fr-fr~0.0.1.0 `
/capabilityname:Language.Basic~~~ga-ie~0.0.1.0 `
/capabilityname:Language.Basic~~~gd-gb~0.0.1.0 `
/capabilityname:Language.Basic~~~gl-es~0.0.1.0 `
/capabilityname:Language.Basic~~~gu-in~0.0.1.0 `
/capabilityname:Language.Basic~~~ha-latn-ng~0.0.1.0 `
/capabilityname:Language.Basic~~~haw-us~0.0.1.0 `
/capabilityname:Language.Basic~~~he-il~0.0.1.0 `
/capabilityname:Language.Basic~~~hi-in~0.0.1.0 `
/capabilityname:Language.Basic~~~hr-hr~0.0.1.0 `
/capabilityname:Language.Basic~~~hu-hu~0.0.1.0 `
/capabilityname:Language.Basic~~~hy-am~0.0.1.0 `
/capabilityname:Language.Basic~~~id-id~0.0.1.0 `
/capabilityname:Language.Basic~~~ig-ng~0.0.1.0 `
/capabilityname:Language.Basic~~~is-is~0.0.1.0 `
/capabilityname:Language.Basic~~~it-it~0.0.1.0 `
/capabilityname:Language.Basic~~~ja-jp~0.0.1.0 `
/capabilityname:Language.Basic~~~ka-ge~0.0.1.0 `
/capabilityname:Language.Basic~~~kk-kz~0.0.1.0 `
/capabilityname:Language.Basic~~~kl-gl~0.0.1.0 `
/capabilityname:Language.Basic~~~kn-in~0.0.1.0 `
/capabilityname:Language.Basic~~~kok-deva-in~0.0.1.0 `
/capabilityname:Language.Basic~~~ko-kr~0.0.1.0 `
/capabilityname:Language.Basic~~~ky-kg~0.0.1.0 `
/capabilityname:Language.Basic~~~lb-lu~0.0.1.0 `
/capabilityname:Language.Basic~~~lt-lt~0.0.1.0 `
/capabilityname:Language.Basic~~~lv-lv~0.0.1.0 `
/capabilityname:Language.Basic~~~mi-nz~0.0.1.0 `
/capabilityname:Language.Basic~~~mk-mk~0.0.1.0 `
/capabilityname:Language.Basic~~~ml-in~0.0.1.0 `
/capabilityname:Language.Basic~~~mn-mn~0.0.1.0 `
/capabilityname:Language.Basic~~~mr-in~0.0.1.0 `
/capabilityname:Language.Basic~~~ms-bn~0.0.1.0 `
/capabilityname:Language.Basic~~~ms-my~0.0.1.0 `
/capabilityname:Language.Basic~~~mt-mt~0.0.1.0 `
/capabilityname:Language.Basic~~~nb-no~0.0.1.0 `
/capabilityname:Language.Basic~~~ne-np~0.0.1.0 `
/capabilityname:Language.Basic~~~nl-nl~0.0.1.0 `
/capabilityname:Language.Basic~~~nn-no~0.0.1.0 `
/capabilityname:Language.Basic~~~nso-za~0.0.1.0 `
/capabilityname:Language.Basic~~~or-in~0.0.1.0 `
/capabilityname:Language.Basic~~~pa-in~0.0.1.0 `
/capabilityname:Language.Basic~~~pl-pl~0.0.1.0 `
/capabilityname:Language.Basic~~~ps-af~0.0.1.0 `
/capabilityname:Language.Basic~~~pt-br~0.0.1.0 `
/capabilityname:Language.Basic~~~pt-pt~0.0.1.0 `
/capabilityname:Language.Basic~~~rm-ch~0.0.1.0 `
/capabilityname:Language.Basic~~~ro-ro~0.0.1.0 `
/capabilityname:Language.Basic~~~ru-ru~0.0.1.0 `
/capabilityname:Language.Basic~~~rw-rw~0.0.1.0 `
/capabilityname:Language.Basic~~~sah-ru~0.0.1.0 `
/capabilityname:Language.Basic~~~si-lk~0.0.1.0 `
/capabilityname:Language.Basic~~~sk-sk~0.0.1.0 `
/capabilityname:Language.Basic~~~sl-si~0.0.1.0 `
/capabilityname:Language.Basic~~~sq-al~0.0.1.0 `
/capabilityname:Language.Basic~~~sr-cyrl-rs~0.0.1.0 `
/capabilityname:Language.Basic~~~sr-latn-rs~0.0.1.0 `
/capabilityname:Language.Basic~~~sv-se~0.0.1.0 `
/capabilityname:Language.Basic~~~sw-ke~0.0.1.0 `
/capabilityname:Language.Basic~~~ta-in~0.0.1.0 `
/capabilityname:Language.Basic~~~te-in~0.0.1.0 `
/capabilityname:Language.Basic~~~tg-cyrl-tj~0.0.1.0 `
/capabilityname:Language.Basic~~~th-th~0.0.1.0 `
/capabilityname:Language.Basic~~~tk-tm~0.0.1.0 `
/capabilityname:Language.Basic~~~tn-za~0.0.1.0 `
/capabilityname:Language.Basic~~~tr-tr~0.0.1.0 `
/capabilityname:Language.Basic~~~tt-ru~0.0.1.0 `
/capabilityname:Language.Basic~~~ug-cn~0.0.1.0 `
/capabilityname:Language.Basic~~~uk-ua~0.0.1.0 `
/capabilityname:Language.Basic~~~ur-pk~0.0.1.0 `
/capabilityname:Language.Basic~~~uz-latn-uz~0.0.1.0 `
/capabilityname:Language.Basic~~~vi-vn~0.0.1.0 `
/capabilityname:Language.Basic~~~wo-sn~0.0.1.0 `
/capabilityname:Language.Basic~~~xh-za~0.0.1.0 `
/capabilityname:Language.Basic~~~yo-ng~0.0.1.0 `
/capabilityname:Language.Basic~~~zh-cn~0.0.1.0 `
/capabilityname:Language.Basic~~~zh-hk~0.0.1.0 `
/capabilityname:Language.Basic~~~zh-tw~0.0.1.0 `
/capabilityname:Language.Basic~~~zu-za~0.0.1.0 `
/capabilityname:Language.Fonts.Arab~~~und-Arab~0.0.1.0 `
/capabilityname:Language.Fonts.Beng~~~und-Beng~0.0.1.0 `
/capabilityname:Language.Fonts.Cans~~~und-Cans~0.0.1.0 `
/capabilityname:Language.Fonts.Cher~~~und-Cher~0.0.1.0 `
/capabilityname:Language.Fonts.Deva~~~und-Deva~0.0.1.0 `
/capabilityname:Language.Fonts.Ethi~~~und-Ethi~0.0.1.0 `
/capabilityname:Language.Fonts.Gujr~~~und-Gujr~0.0.1.0 `
/capabilityname:Language.Fonts.Guru~~~und-Guru~0.0.1.0 `
/capabilityname:Language.Fonts.Hans~~~und-Hans~0.0.1.0 `
/capabilityname:Language.Fonts.Hant~~~und-Hant~0.0.1.0 `
/capabilityname:Language.Fonts.Hebr~~~und-Hebr~0.0.1.0 `
/capabilityname:Language.Fonts.Jpan~~~und-Jpan~0.0.1.0 `
/capabilityname:Language.Fonts.Khmr~~~und-Khmr~0.0.1.0 `
/capabilityname:Language.Fonts.Knda~~~und-Knda~0.0.1.0 `
/capabilityname:Language.Fonts.Kore~~~und-Kore~0.0.1.0 `
/capabilityname:Language.Fonts.Laoo~~~und-Laoo~0.0.1.0 `
/capabilityname:Language.Fonts.Mlym~~~und-Mlym~0.0.1.0 `
/capabilityname:Language.Fonts.Orya~~~und-Orya~0.0.1.0 `
/capabilityname:Language.Fonts.PanEuropeanSupplementalFonts~~~0.0.1.0 `
/capabilityname:Language.Fonts.Sinh~~~und-Sinh~0.0.1.0 `
/capabilityname:Language.Fonts.Syrc~~~und-Syrc~0.0.1.0 `
/capabilityname:Language.Fonts.Taml~~~und-Taml~0.0.1.0 `
/capabilityname:Language.Fonts.Telu~~~und-Telu~0.0.1.0 `
/capabilityname:Language.Fonts.Thai~~~und-Thai~0.0.1.0 `
/capabilityname:Language.Handwriting~~~af-za~0.0.1.0 `
/capabilityname:Language.Handwriting~~~bs-latn-ba~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ca-es~0.0.1.0 `
/capabilityname:Language.Handwriting~~~cs-cz~0.0.1.0 `
/capabilityname:Language.Handwriting~~~cy-gb~0.0.1.0 `
/capabilityname:Language.Handwriting~~~da-dk~0.0.1.0 `
/capabilityname:Language.Handwriting~~~de-de~0.0.1.0 `
/capabilityname:Language.Handwriting~~~el-gr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~en-gb~0.0.1.0 `
/capabilityname:Language.Handwriting~~~en-us~0.0.1.0 `
/capabilityname:Language.Handwriting~~~es-es~0.0.1.0 `
/capabilityname:Language.Handwriting~~~es-mx~0.0.1.0 `
/capabilityname:Language.Handwriting~~~eu-es~0.0.1.0 `
/capabilityname:Language.Handwriting~~~fi-fi~0.0.1.0 `
/capabilityname:Language.Handwriting~~~fr-fr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ga-ie~0.0.1.0 `
/capabilityname:Language.Handwriting~~~gd-gb~0.0.1.0 `
/capabilityname:Language.Handwriting~~~gl-es~0.0.1.0 `
/capabilityname:Language.Handwriting~~~hi-in~0.0.1.0 `
/capabilityname:Language.Handwriting~~~hr-hr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~id-id~0.0.1.0 `
/capabilityname:Language.Handwriting~~~it-it~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ja-jp~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ko-kr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~lb-lu~0.0.1.0 `
/capabilityname:Language.Handwriting~~~mi-nz~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ms-bn~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ms-my~0.0.1.0 `
/capabilityname:Language.Handwriting~~~nb-no~0.0.1.0 `
/capabilityname:Language.Handwriting~~~nl-nl~0.0.1.0 `
/capabilityname:Language.Handwriting~~~nn-no~0.0.1.0 `
/capabilityname:Language.Handwriting~~~nso-za~0.0.1.0 `
/capabilityname:Language.Handwriting~~~pl-pl~0.0.1.0 `
/capabilityname:Language.Handwriting~~~pt-br~0.0.1.0 `
/capabilityname:Language.Handwriting~~~pt-pt~0.0.1.0 `
/capabilityname:Language.Handwriting~~~rm-ch~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ro-ro~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ru-ru~0.0.1.0 `
/capabilityname:Language.Handwriting~~~rw-rw~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sk-sk~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sl-si~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sq-al~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sr-cyrl-rs~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sr-latn-rs~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sv-se~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sw-ke~0.0.1.0 `
/capabilityname:Language.Handwriting~~~tn-za~0.0.1.0 `
/capabilityname:Language.Handwriting~~~tr-tr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~wo-sn~0.0.1.0 `
/capabilityname:Language.Handwriting~~~xh-za~0.0.1.0 `
/capabilityname:Language.Handwriting~~~zh-cn~0.0.1.0 `
/capabilityname:Language.Handwriting~~~zh-hk~0.0.1.0 `
/capabilityname:Language.Handwriting~~~zh-tw~0.0.1.0 `
/capabilityname:Language.Handwriting~~~zu-za~0.0.1.0 `
/capabilityname:Language.LocaleData~~~zh-tw~0.0.1.0 `
/capabilityname:Language.OCR~~~ar-sa~0.0.1.0 `
/capabilityname:Language.OCR~~~bg-bg~0.0.1.0 `
/capabilityname:Language.OCR~~~bs-latn-ba~0.0.1.0 `
/capabilityname:Language.OCR~~~cs-cz~0.0.1.0 `
/capabilityname:Language.OCR~~~da-dk~0.0.1.0 `
/capabilityname:Language.OCR~~~de-de~0.0.1.0 `
/capabilityname:Language.OCR~~~el-gr~0.0.1.0 `
/capabilityname:Language.OCR~~~en-gb~0.0.1.0 `
/capabilityname:Language.OCR~~~en-us~0.0.1.0 `
/capabilityname:Language.OCR~~~es-es~0.0.1.0 `
/capabilityname:Language.OCR~~~es-mx~0.0.1.0 `
/capabilityname:Language.OCR~~~fi-fi~0.0.1.0 `
/capabilityname:Language.OCR~~~fr-ca~0.0.1.0 `
/capabilityname:Language.OCR~~~fr-fr~0.0.1.0 `
/capabilityname:Language.OCR~~~hr-hr~0.0.1.0 `
/capabilityname:Language.OCR~~~hu-hu~0.0.1.0 `
/capabilityname:Language.OCR~~~it-it~0.0.1.0 `
/capabilityname:Language.OCR~~~ja-jp~0.0.1.0 `
/capabilityname:Language.OCR~~~ko-kr~0.0.1.0 `
/capabilityname:Language.OCR~~~nb-no~0.0.1.0 `
/capabilityname:Language.OCR~~~nl-nl~0.0.1.0 `
/capabilityname:Language.OCR~~~pl-pl~0.0.1.0 `
/capabilityname:Language.OCR~~~pt-br~0.0.1.0 `
/capabilityname:Language.OCR~~~pt-pt~0.0.1.0 `
/capabilityname:Language.OCR~~~ro-ro~0.0.1.0 `
/capabilityname:Language.OCR~~~ru-ru~0.0.1.0 `
/capabilityname:Language.OCR~~~sk-sk~0.0.1.0 `
/capabilityname:Language.OCR~~~sl-si~0.0.1.0 `
/capabilityname:Language.OCR~~~sr-cyrl-rs~0.0.1.0 `
/capabilityname:Language.OCR~~~sr-latn-rs~0.0.1.0 `
/capabilityname:Language.OCR~~~sv-se~0.0.1.0 `
/capabilityname:Language.OCR~~~tr-tr~0.0.1.0 `
/capabilityname:Language.OCR~~~zh-cn~0.0.1.0 `
/capabilityname:Language.OCR~~~zh-hk~0.0.1.0 `
/capabilityname:Language.OCR~~~zh-tw~0.0.1.0 `
/capabilityname:Language.Speech~~~da-dk~0.0.1.0 `
/capabilityname:Language.Speech~~~de-de~0.0.1.0 `
/capabilityname:Language.Speech~~~en-au~0.0.1.0 `
/capabilityname:Language.Speech~~~en-ca~0.0.1.0 `
/capabilityname:Language.Speech~~~en-gb~0.0.1.0 `
/capabilityname:Language.Speech~~~en-in~0.0.1.0 `
/capabilityname:Language.Speech~~~en-us~0.0.1.0 `
/capabilityname:Language.Speech~~~es-es~0.0.1.0 `
/capabilityname:Language.Speech~~~es-mx~0.0.1.0 `
/capabilityname:Language.Speech~~~fr-ca~0.0.1.0 `
/capabilityname:Language.Speech~~~fr-fr~0.0.1.0 `
/capabilityname:Language.Speech~~~it-it~0.0.1.0 `
/capabilityname:Language.Speech~~~ja-jp~0.0.1.0 `
/capabilityname:Language.Speech~~~pt-br~0.0.1.0 `
/capabilityname:Language.Speech~~~zh-cn~0.0.1.0 `
/capabilityname:Language.Speech~~~zh-hk~0.0.1.0 `
/capabilityname:Language.Speech~~~zh-tw~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ar-eg~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ar-sa~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~bg-bg~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ca-es~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~cs-cz~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~da-dk~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~de-at~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~de-ch~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~de-de~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~el-gr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-au~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-ca~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-gb~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-ie~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-in~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-us~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~es-es~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~es-mx~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~fi-fi~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~fr-ca~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~fr-ch~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~fr-fr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~he-il~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~hi-in~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~hr-hr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~hu-hu~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~id-id~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~it-it~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ja-jp~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ko-kr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ms-my~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~nb-no~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~nl-be~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~nl-nl~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~pl-pl~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~pt-br~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~pt-pt~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ro-ro~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ru-ru~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~sk-sk~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~sl-si~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~sv-se~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ta-in~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~th-th~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~tr-tr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~vi-vn~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~zh-cn~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~zh-hk~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~zh-tw~0.0.1.0 `
/capabilityname:MathRecognizer~~~~0.0.1.0 `
/capabilityname:Microsoft.Onecore.StorageManagement~~~~0.0.1.0 `
/capabilityname:Microsoft.WebDriver~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.MSPaint~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.Notepad~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.PowerShell.ISE~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.StorageManagement~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.WordPad~~~~0.0.1.0 `
/capabilityname:Msix.PackagingTool.Driver~~~~0.0.1.0 `
/capabilityname:NetFX3~~ `
/capabilityname:Network.Irda~~~~0.0.1.0 `
/capabilityname:OneCoreUAP.OneSync~~~~0.0.1.0 `
/capabilityname:OpenSSH.Client~~~~0.0.1.0 `
/capabilityname:OpenSSH.Server~~~~0.0.1.0 `
/capabilityname:Print.EnterpriseCloudPrint~~~~0.0.1.0 `
/capabilityname:Print.Fax.Scan~~~~0.0.1.0 `
/capabilityname:Print.Management.Console~~~~0.0.1.0 `
/capabilityname:Print.MopriaCloudService~~~~0.0.1.0 `
/capabilityname:RasCMAK.Client~~~~0.0.1.0 `
/capabilityname:RIP.Listener~~~~0.0.1.0 `
/capabilityname:Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.BitLocker.Recovery.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.CertificateServices.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.DHCP.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.Dns.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.FailoverCluster.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.FileServices.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.IPAM.Client.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.LLDP.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.NetworkController.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.NetworkLoadBalancing.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.RemoteAccess.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.RemoteDesktop.Services.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.ServerManager.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.Shielded.VM.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.StorageMigrationService.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.StorageReplica.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.SystemInsights.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.VolumeActivation.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.WSUS.Tools~~~~0.0.1.0 `
/capabilityname:ServerCore.AppCompatibility~~~~0.0.1.0 `
/capabilityname:SNMP.Client~~~~0.0.1.0 `
/capabilityname:Tools.DeveloperMode.Core~~~~0.0.1.0 `
/capabilityname:Tools.Graphics.DirectX~~~~0.0.1.0 `
/capabilityname:Windows.Client.ShellComponents~~~~0.0.1.0 `
/capabilityname:Windows.Desktop.EMS-SAC.Tools~~~~0.0.1.0 `
/capabilityname:WMI-SNMP-Provider.Client~~~~0.0.1.0 `
/capabilityname:XPS.Viewer~~~~0.0.1.0
# This one is large, lets skip for now
#/capabilityname:Analog.Holographic.Desktop~~~~0.0.1.0 `
# Copy language caps to the repo
Copy-Item -Path $OS_LP_PATH -Destination $REPO_PATH -Force -ErrorAction stop | Out-Null
# Dismount OS image
Dismount-WindowsImage -Path $MAIN_OS_MOUNT -Discard -ErrorAction ignore | Out-Null
# Dismount ISO images
Write-Host "Dismounting ISO images"
Dismount-DiskImage -ImagePath $LP_ISO_PATH -ErrorAction ignore | Out-Null
Dismount-DiskImage -ImagePath $FOD_ISO_PATH -ErrorAction ignore | Out-Null
Guardar conteúdo opcional no sistema operativo de origem
Para guardar o estado de conteúdo opcional no sistema operativo de origem, criamos um script de ação personalizado para executar antes da instalação do sistema operativo. Neste script, guardamos funcionalidades opcionais e recursos de idioma num ficheiro. Também criamos uma cópia local do repositório apenas com os ficheiros necessários com base nos idiomas instalados no sistema operativo de origem. Esta ação limita os ficheiros a copiar.
$OUTPUT_PATH = "C:\TEMP\"
$LOG_PATH = $OUTPUT_PATH + "log.txt"
$OUTPUT_PATH = "C:\TEMP\"
$LOG_PATH = $OUTPUT_PATH + "log.txt"
$LANG_PATH = $OUTPUT_PATH + "sourceLang.txt"
$CAP_PATH = $OUTPUT_PATH + "sourceCapability.txt"
$OSVERSION_PATH = $OUTPUT_PATH + "sourceVersion.txt"
$REPO_PATH = "Z:\Repo\"
$LOCAL_REPO_PATH = $OUTPUT_PATH + "Local_Repo\"
Function Get-TS { return "{0:HH:mm:ss}" -f (Get-Date) }
Function Log
{
param (
[Parameter(Mandatory=$True)]
[string]$MESSAGE
)
$M = "$(Get-TS): PreInstall: $MESSAGE"
Write-Host $M
Add-Content -Path $LOG_PATH -Value $M
}
Function IsLangFile
{
param (
[Parameter(Mandatory=$True)]
[string]$PATH
)
if (($PATH -match '[-_~]ar[-_~]') -or ($PATH -match '[-_~]bg[-_~]') -or ($PATH -match '[-_~]cs[-_~]') -or `
($PATH -match '[-_~]da[-_~]') -or ($PATH -match '[-_~]de[-_~]') -or ($PATH -match '[-_~]el[-_~]') -or `
($PATH -match '[-_~]en[-_~]') -or ($PATH -match '[-_~]es[-_~]') -or ($PATH -match '[-_~]et[-_~]') -or `
($PATH -match '[-_~]fi[-_~]') -or ($PATH -match '[-_~]fr[-_~]') -or ($PATH -match '[-_~]he[-_~]') -or `
($PATH -match '[-_~]hr[-_~]') -or ($PATH -match '[-_~]hu[-_~]') -or ($PATH -match '[-_~]it[-_~]') -or `
($PATH -match '[-_~]ja[-_~]') -or ($PATH -match '[-_~]ko[-_~]') -or ($PATH -match '[-_~]lt[-_~]') -or `
($PATH -match '[-_~]lv[-_~]') -or ($PATH -match '[-_~]nb[-_~]') -or ($PATH -match '[-_~]nl[-_~]') -or `
($PATH -match '[-_~]pl[-_~]') -or ($PATH -match '[-_~]pt[-_~]') -or ($PATH -match '[-_~]ro[-_~]') -or `
($PATH -match '[-_~]ru[-_~]') -or ($PATH -match '[-_~]sk[-_~]') -or ($PATH -match '[-_~]sl[-_~]') -or `
($PATH -match '[-_~]sv[-_~]') -or ($PATH -match '[-_~]th[-_~]') -or ($PATH -match '[-_~]tr[-_~]') -or `
($PATH -match '[-_~]uk[-_~]') -or ($PATH -match '[-_~]zh[-_~]') -or ($PATH -match '[-_~]sr[-_~]')) {
return $True
}
else {
return $False
}
}
# Remove the log
Remove-Item -Path $LOG_PATH -Force -ErrorAction ignore | Out-Null
Log "Starting"
# Remove state files, keep repo if it exists
Remove-Item -Path $LANG_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $CAP_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $OSVERSION_PATH -Force -ErrorAction ignore | Out-Null
# Get OS version, to use later for detecting compat scans versus OS installation
$OSINFO = Get-CimInstance Win32_OperatingSystem
Log "OS Version: $($OSINFO.Version)"
Add-Content -Path $OSVERSION_PATH -Value $OSINFO.Version
# Get installed languages from international settings
$INTL = DISM.exe /Online /Get-Intl /English
# Save only output lines with installed languages
$LANGUAGES = $INTL | Select-String -SimpleMatch 'Installed language(s)'
# Replace with null so we have a simple list of language codes
$LANGUAGES = $LANGUAGES | ForEach-Object {$_.Line.Replace("Installed language(s): ","")}
# Save System Language, save only output line with default system language
$SYSLANG = $INTL | Select-String -SimpleMatch 'Default system UI language'
# Replace with null so we have the language code
$SYSLANG = $SYSLANG | ForEach-Object {$_.Line.Replace("Default system UI language : ","")}
# Save these languages
Log "Default system UI language on source OS: $($SYSLANG)"
ForEach ($ITEM in $LANGUAGES) {
Log "Installed language on source OS: $($ITEM)"
Add-Content -Path $LANG_PATH -Value $ITEM
}
# Get and save installed packages, we'll use this for debugging
$PACKAGES = Get-WindowsPackage -Online
ForEach ($ITEM in $PACKAGES) {
if($ITEM.PackageState -eq "Installed") {
Log "Package $($ITEM.PackageName) is installed"
}
}
# Get and save capabilities
$CAPABILITIES = Get-WindowsCapability -Online
ForEach ($ITEM in $CAPABILITIES) {
if($ITEM.State -eq "Installed") {
Log "Capability $($ITEM.Name) is installed"
Add-Content -Path $CAP_PATH -Value $ITEM.Name
}
}
# Copy a subset of the Repo files locally, all neutral files and the languages needed
$REPO_FILES = Get-ChildItem $REPO_PATH -file -Recurse
ForEach ($FILE in $REPO_FILES) {
$PATH = ($FILE.DirectoryName + "\") -Replace [Regex]::Escape($REPO_PATH), $LOCAL_REPO_PATH
If (!(Test-Path $Path)) {
New-Item -ItemType Directory -Path $PATH -Force | Out-Null
}
If ((IsLangFile $FILE.Name)) {
# Only copy those files where we need the primary languages from the source OS
ForEach ($ITEM in $LANGUAGES) {
if ($FILE.Name -match $Item) {
If (!(Test-Path (Join-Path $Path $File.Name))) {
Copy-Item $FILE.FullName -Destination $PATH -Force
Log "Copied file $($FILE.FullName) to local repository"
}
else {
Log "File $($FILE.Name) already exists in local repository"
}
}
}
} Else {
# Copy all 'neutral files' and those language specific that are not in the core 38
If (!(Test-Path (Join-Path $Path $File.Name))) {
Copy-Item $FILE.FullName -Destination $PATH -Force
Log "Copied file $($FILE.FullName) to local repository"
}
else {
Log "File $($FILE.Name) already exists in local repository"
}
}
}
Log ("Exiting")
Adicionar conteúdo opcional no sistema operativo de destino
Depois de concluída a configuração com êxito, utilizamos success.cmd para obter o estado de conteúdo opcional do sistema operativo de origem e instalar no novo sistema operativo apenas se estiver em falta. Em seguida, aplique a atualização mensal mais recente como um passo final.
$OUTPUT_PATH = "C:\TEMP\"
$LOG_PATH = $OUTPUT_PATH + "log.txt"
$LANG_PATH = $OUTPUT_PATH + "sourceLang.txt"
$CAP_PATH = $OUTPUT_PATH + "sourceCapability.txt"
$OSVERSION_PATH = $OUTPUT_PATH + "sourceVersion.txt"
$LOCAL_REPO_PATH = $OUTPUT_PATH + "Local_Repo\"
$LCU_PATH = $OUTPUT_PATH + "Windows10.0-KB4565503-x64_PSFX.cab"
$PENDING = $false
Function Get-TS { return "{0:HH:mm:ss}" -f (Get-Date) }
Function Log
{
param (
[Parameter(Mandatory=$True)]
[string]$MESSAGE
)
$M = "$(Get-TS): PostInstall: $MESSAGE"
Write-Host $M
Add-Content -Path $LOG_PATH -Value $M
}
Log "Starting"
# Get OS version
$OSINFO = Get-CimInstance Win32_OperatingSystem
Log "OS Version: $($OSINFO.Version)"
# Check for source OS state, just to be sure
if (!(Test-Path $LANG_PATH) -or !(Test-Path $CAP_PATH) -or !(Test-Path $OSVERSION_PATH) ) {
Log "Source OS state is missing."
}
# If this script is executing and the OS version hasn't changed, let's exit out.
else {
# Retrive OS version from source OS
$SOURCE_OSVERSION = Get-Content -Path $OSVERSION_PATH
if ($OSINFO.Version -eq $SOURCE_OSVERSION) {
Log "OS Version hasn't changed."
}
else {
# Retrive language list from source OS
$SOURCE_LANGUAGES = Get-Content -Path $LANG_PATH
# Get installed languages from International Settings
$INTL = DISM.exe /Online /Get-Intl /English
# Save System Language, save only output line with default system language
$SYS_LANG = $INTL | Select-String -SimpleMatch 'Default system UI language'
# Replace with null so we have the language code
$SYS_LANG = $SYS_LANG | ForEach-Object {$_.Line.Replace("Default system UI language : ","")}
# Get and save installed packages, we'll use this for debugging
$PACKAGES = Get-WindowsPackage -Online
ForEach ($ITEM in $PACKAGES) {
if($ITEM.PackageState -eq "Installed") {
Log "Package $($ITEM.PackageName) is installed"
}
}
# Loop through source OS languages, and install if missing on target OS
ForEach ($SOURCE_ITEM in $SOURCE_LANGUAGES) {
if ($SOURCE_ITEM -ne $SYS_LANG) {
# add missing languages except the system language
Log "Adding language Microsoft-Windows-Client-Language-Pack_x64_$($SOURCE_ITEM).cab"
try {
Add-WindowsPackage -Online -PackagePath "$($LOCAL_REPO_PATH)\Microsoft-Windows-Client-Language-Pack_x64_$($SOURCE_ITEM).cab" -ErrorAction stop | Out-Null
}
catch {
Log $_.Exception.Message
}
}
}
# Retrieve capabilities from source OS and target OS
$SOURCE_CAPABILITIES = Get-Content -Path $CAP_PATH
$CAPABILITIES = Get-WindowsCapability -Online
# Loop through source OS capabilities, and install if missing on target OS
ForEach ($SOURCE_ITEM in $SOURCE_CAPABILITIES) {
$INSTALLED = $false
ForEach ($ITEM in $CAPABILITIES) {
if ($ITEM.Name -eq $($SOURCE_ITEM)) {
if ($ITEM.State -eq "Installed") {
$INSTALLED = $true
break
}
}
}
# Add if not already installed
if (!($INSTALLED)) {
Log "Adding capability $SOURCE_ITEM"
try {
Add-WindowsCapability -Online -Name $SOURCE_ITEM -Source $LOCAL_REPO_PATH -ErrorAction stop | Out-Null
}
catch {
Log $_.Exception.Message
}
}
else {
Log "Capability $SOURCE_ITEM is already installed"
}
}
# Add LCU, this is required after adding FODs and languages
Log ("Adding LCU")
Add-WindowsPackage -Online -PackagePath $LCU_PATH -NoRestart
# Get packages, we'll use this for debugging and to see if we need to restart to install
$PACKAGES = Get-WindowsPackage -Online
ForEach ($ITEM in $PACKAGES) {
Log "Package $($ITEM.PackageName) is $($ITEM.PackageState)"
if ($ITEM.PackageState -eq "InstallPending") {
$PENDING = $true
}
}
}
}
# Remove local repository and state files
Remove-Item -Path $LANG_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $CAP_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $OSVERSION_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $LOCAL_REPO_PATH -Force -Recurse -ErrorAction ignore | Out-Null
# Restarting the computer to let setup process to exit cleanly
if ($PENDING) {
Log ("Install pending packages exists, restarting in 10 seconds")
Start-Process -FilePath cmd -ArgumentList "/C shutdown /r /t 10 /f"
}
Log ("Exiting")