Как изменить клавиатуру по умолчанию для другого пользователя

1

На моей работе более 150 рабочих станций, использующих Windows 7.
Клавиатура по умолчанию на компьютерах установлена ​​на немецкий язык.
Скоро появится новый персонаж - отсканировал на этих рабочих станциях, что немецкая клавиатура читается как ß
Поэтому я ищу самый простой способ установить каждую клавиатуру на английский по умолчанию.

Пользователи на рабочих станциях очень ограничены в доступе. Все, что мы можем использовать, это инструмент с правами администратора для внесения изменений. Инструмент работает как учетная запись администратора, и мы можем получить к нему практически все, что захотим.

Что я пробовал до сих пор:

  1. Командная строка + XML-скрипт Вот на суперпользователя.
    Проблема в том, что он изменит стандартную клавиатуру учетной записи администратора, потому что инструмент запускается как учетная запись администратора. Я также пытался запустить его как локальный пользователь, но из-за ограничений он не запускается.

  2. Другой вариант, который я нашел, это изменить реестр в
    HKEY_USERS\.DEFAULT\Keyboard Layout\Preload и установить 1 в 00000409
    Проблема в том, что я не могу запустить reg файл как текущий пользователь из-за ограничений, и как пользователь-администратор применяет это к учетной записи администратора. Я не могу идентифицировать других пользователей, потому что они появляются в качестве примера S-1-5-21-2013013795-1015563843-1545874412-206927 этот код изменяется на разных рабочих станциях. Я не могу использовать куст куста, потому что он говорит, что он в настоящее время используется.

Есть ли другой способ, которым я мог бы попытаться или обойти одно из решений выше, чтобы оно заработало?
Также было бы хорошим решением применить их ко всем пользователям.

РЕДАКТИРОВАТЬ:

Я не знаю, помогает ли это, но есть одна вещь, которая часто встречается в HKEY_USERS: имя учетной записи, которую мы должны изменить, всегда заканчивается на [...] - 1003 или же [...]- 1004

Divin3
источник

Ответы:

1

Здесь есть 2 варианта: 1. использовать psgetsid.exe чтобы определить соответствие имени пользователя и SID пользователя, которое вы видите в HKEY_USERS, а затем использовать его в пакетном скрипте. В той же партии вы можете использовать psexec.exe выполнить необходимые изменения реестра на удаленных компьютерах. Вы можете передать текстовый файл со списком компьютеров этих программ.

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. Второй вариант - выполнить скрипт Powershell на удаленных компьютерах:

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
    }
}

Он просканирует все доступные идентификаторы безопасности в HKEY_USERS и применит настройки к каждому из них, если они соответствуют фильтру.

Постскриптум Все идентификаторы безопасности пользователей AD начинаются с S-1-5-21, поэтому я использовал его в фильтре. Я также проигнорировал все ульи с _Classes в конце.

Hardoman
источник
Пробовал второй, он работал только после запуска скрипта вручную из powershell.exe и работает Set-ExecutionPolicy RemoteSigned первый. Есть ли более быстрый способ заставить его работать?
Divin3
@ Divin3 Конечно, сначала нужно настроить политику powershell в Windows, чтобы всегда запускать сценарии ps независимо от того, подписаны они или нет для решения, описанного выше. Я думал, что это уже сделано на вашем компьютере :)
Hardoman
@ Divin3 ПРИМЕЧАНИЕ. Чтобы изменить политику выполнения для области по умолчанию (LocalMachine), запустите Windows PowerShell с параметром «Запуск от имени администратора». Вам нужно сделать это только один раз.
Hardoman
Поэтому мне нужно запустить powershell.exe и включить powershell более 150 раз, чем запускать скрипт? Это было бы больно.
Divin3
@ Divin3 Нет, если вы запустите Set-ExecutionPolicy от имени администратора, политика будет установлена ​​для всех пользователей на одном ПК. Но, конечно, вам нужно сделать это на каждом ПК хотя бы один раз. Вы можете сделать это, используя psexec.exe, используя список с именами ПК, как я приказываю.
Hardoman
0

Есть много вариантов:

  • Вы можете запустить powershell.exe с опцией -executionpolicy bypass. Таким образом, вам не нужно будет устанавливать политику выполнения на каждой машине. Е.Г .: powershell.exe - выполнение политики обхода
  • Вы можете использовать PowerShell remoting для подключения к каждой рабочей станции и удаленного запуска сценария. Нет необходимости в psexec. Конечно, вам нужно включить удаленное взаимодействие PowerShell на всех клиентах.
  • Вы можете использовать удаленный реестр для подключения к реестру на всех компьютерах и непосредственного изменения настроек. Это, безусловно, лучший вариант. Я написал функцию PowerShell, которую вы можете использовать:
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
            }
        }
    }
}

Вы можете использовать функцию следующим образом:

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

\> Get-ADComputer -Filter * | Set-DefaultKeyboard -LayoutCode 409,407
Michaja van der Zouwen
источник