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

2 ответа2

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 и применит настройки для каждого из них, если они соответствуют фильтру.

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .