Предоставление не администраторам возможности использовать измененный PATH - PullRequest
0 голосов
/ 08 января 2020

Приведенный ниже код PowerShell успешно изменяет переменную PATH, когда она вызывается из экземпляра PowerShell, который запускается от имени администратора . И в командной строке Windows CMD также работает , поскольку администратор также может использовать обновленную PATH. Но недавно обновленный PATH НЕ ДОСТУПЕН для экземпляров PowerShell с правами обычного пользователя или командной строки Windows CMD.

Какие конкретные c изменения необходимо внести в приведенный ниже код PowerShell, чтобы обновленное значение $newPath переменной PATH было доступно для всех командных строк и экземпляров PowerShell?

    $newpath = "$oldpath;$pathItem"
    Write-Host "newpath is: $newpath"
    #Set the new version as the replacement PATH permanently, but not within this session
    Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath
    #Set the new version as the replacement PATH within this session
    $env:path = $newPath

Отдельно, когда я пытаюсь запустить приведенный выше код как пользователь без прав администратора в PowerShell, следующая строка кода выдает ошибку разрешений и завершается ошибкой:

Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath

1 Ответ

1 голос
/ 09 января 2020

Нет непривилегированного места, где вы могли бы установить переменную среды на уровне компьютера, кроме ослабления разрешений для этого раздела реестра (вы действительно не должны этого делать).

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

[Environment]::SetEnvironmentVariable( 'VARIABLE_NAME', 'VALUE', [EnvironmentVariableTarget]::User )

или если вы заботитесь только о переменной среды, используемой в PowerShell, вы можете обновить один из профилей PowerShell , чтобы установить переменная среды уровня процесса:

$env:VARIABLE_NAME = 'VALUE'

Последний метод имеет два значения:

  1. Вам все еще нужно иметь привилегию для изменения профилей в $PSHOME.
  2. Переменная уровня процесса будет доступна только в сеансах PowerShell, и только если powershell.exe не вызывается с параметром -NoProfile.
...