Como alterar o teclado padrão para outro usuário

1

No meu trabalho, temos mais de 150 estações de trabalho usando o Windows 7.
O teclado padrão nos computadores está definido como alemão.
Em breve haverá um novo caractere - varrido nessas estações de trabalho que o teclado alemão lê como ß
Por isso, estou procurando a maneira mais fácil de configurar todos os teclados para inglês como padrão.

Os usuários nas estações de trabalho são muito limitados no acesso. Tudo o que podemos usar é uma ferramenta com acesso de administrador para fazer alterações. A ferramenta é executada como a conta de administrador e podemos acessar quase tudo que quisermos dela.

O que eu tentei até agora:

  1. Uma linha de comando + script xml aqui no superusuário.
    O problema é que ele alterará o teclado padrão da conta de administrador, porque a ferramenta é executada como a conta de administrador. Eu também tentei executá-lo como o usuário local, mas por causa das restrições, ele não será executado.

  2. A outra opção que encontrei é modificar o registro em HKEY_USERS\.DEFAULT\Keyboard Layout\Preload e definir 1 para 00000409
    O problema com isso é que não posso executar um arquivo reg como o usuário atual devido às restrições e, como usuário administrador, ele aplicará isso à conta de administrador. Não consigo identificar os outros usuários porque eles aparecem como exemplo S-1-5-21-2013013795-1015563843-1545874412-206927 este código é alterado em diferentes estações de trabalho. Eu não posso usar a seção de carga, porque diz que está atualmente em uso.

Existe outra maneira que eu poderia tentar ou uma solução alternativa para uma das soluções acima para fazê-lo funcionar?
Também seria uma boa solução aplicá-las a todos os usuários de alguma forma.

EDITAR:

Não sei se isso ajuda, mas há uma coisa que é comum em HKEY_USERS : o nome das contas que precisamos alterar sempre termina em [...] - 1003 ou [ ...] - 1004

    
por Divin3 15.12.2015 / 08:04

2 respostas

1

Existem 2 opções aqui: 1. usar psgetsid.exe para identificar a correspondência do nome de usuário e do SID do usuário que você vê em HKEY_USERS e, em seguida, usá-lo no script em lote. No mesmo lote, você pode usar psexec.exe para executar a alteração de registro necessária nos computadores remotos. Você pode passar um arquivo de texto com uma lista dos computadores desses programas.

Usage: psgetsid [\computer[,computer2[,...] | @file] [-u Username [-p Password]]] [account | SID]
     -u         Specifies optional user name for login to
                remote computer.
     -p         Specifies optional password for user name. If you omit this
                you will be prompted to enter a hidden password.
     account    PsGetSid will report the SID for the specified user account
                rather than the computer.
     SID        PsGetSid will report the account for the specified SID.
     computer   Direct PsGetSid to perform the command on the remote
                computer or computers specified. If you omit the computer
                name PsGetSid runs the command on the local system,
                and if you specify a wildcard (\*), PsGetSid runs the
                command on all computers in the current domain.
     @file      PsGetSid will execute the command on each of the computers listed in the file.

2. A segunda opção é executar este script Powershell nos computadores remotos:

New-PSDrive HKU Registry HKEY_USERS
$allusers = Get-ChildItem -Path hku:\ | select -ExpandProperty name
foreach($i in $allusers)
{
    if (($i -like '*S-1-5-21*') -and ($i -notlike '*_Classes*')) {
        "Users found:"
        $i
        Set-ItemProperty -Path "Microsoft.PowerShell.Core\Registry::$i\Keyboard Layout\Preload" -Name 1 -Value 409
        Set-ItemProperty -Path "Microsoft.PowerShell.Core\Registry::$i\Keyboard Layout\Preload" -Name 2 -Value 407
    }
}

Ele examinará todos os SIDs disponíveis no HKEY_USERS e aplicará a configuração a cada um deles se eles atenderem ao filtro.

P.S. Todos os usuários de AD SIDs começam com S-1-5-21, é por isso que eu usei no filtro. Eu também ignorei todas as colmeias com _Classes no final.

    
por 15.12.2015 / 11:31
0

Existem muitas opções disponíveis:

  • Você pode iniciar o powershell.exe com a opção -executionpolicy bypass. Dessa forma, você não precisará definir a política de execução em cada máquina. E.G .: powershell.exe -executionpolicy bypass
  • Você pode usar o controle remoto do PowerShell para se conectar a todas as estações de trabalho e executar o script remotamente. Não há necessidade de psexec. Claro que você precisa ter o controle remoto do PowerShell ativado em todos os clientes.
  • Você pode usar o registro remoto para se conectar ao registro em todos os computadores e alterar as configurações diretamente. Esta é de longe a melhor opção. Eu escrevi uma função do PowerShell que você pode usar:
function Set-DefaultKeyboard
{
    [CmdletBinding()]
    Param
    (
        # Name of the computer
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        [Alias('Name')]
        [string[]]
        $ComputerName,

        [Parameter(Mandatory=$true,
                   Position=1)]
        [string[]]
        $LayoutCode
    )

    Process
    {
        foreach ($Computer in $ComputerName) {

            Write-Verbose "Testing connection to '$Computer'..."
            IF (Test-Connection $Computer -Quiet -Count 1) {

                Write-Verbose 'Computer appears to be online.'
                $State = 'Online'

                #Connect remote registry
                try {
                    Write-Verbose 'Connecting with Remote Registry...'
                    $oReg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('Users', $Computer)
                }
                catch {
                    [pscustomobject]@{
                        ComputerName = $Computer
                        Result = 'Failed to connect.'
                    }
                    continue
                }
                Write-Verbose 'Connection established.'
                $AllUsers = $oReg.GetSubKeyNames() | ?{$_ -like '*S-1-5-21*' -and $_ -notlike '*_Classes*'}
                foreach ($User in $AllUsers)
                {
                    try
                    {
                        $KeyBoards = $oReg.OpenSubKey("$User\Keyboard Layout\Preload",$true)
                        $i = 1
                        foreach ($Code in $LayoutCode)
                        {
                            $FullCode = $Code.PadLeft(8,'0')
                            $KeyBoards.SetValue($i,$FullCode,[Microsoft.Win32.RegistryValueKind]::String)
                            $i++
                        }
                        [pscustomobject]@{
                            ComputerName = $Computer
                            Result = 'OK'
                        }
                    }
                    catch
                    {
                        [pscustomobject]@{
                            ComputerName = $Computer
                            Result = 'Failed to set values.'
                        }
                    }
                }
            }
            else
            {
                [pscustomobject]@{
                    ComputerName = $Computer
                    Result = 'Computer is offline'
                }
                continue
            }
        }
    }
}

Você pode usar a função assim:

\> Set-DefaultKeyboard -ComputerName PC1,PC2,PC3 -LayoutCode 409

\> Get-ADComputer -Filter * | Set-DefaultKeyboard -LayoutCode 409,407
    
por 13.05.2016 / 16:25