Establecer la variable de entorno de usuario de Powershell ejecutándose como SISTEMA

4

Antecedentes (SO: Windows 10):

  • Tengo un script de Powershell que se ejecuta (en segundo plano) como SYSTEM

  • A través del script de Powershell, necesito configurar las variables de entorno de la máquina y del usuario conectado

  • Las variables de la máquina se establecen usando [Environment]::SetEnvironmentVariable('NAME', 'Value', 'Machine')y funcionan como se esperaba

  • Las variables de usuario establecidas con [Environment]::SetEnvironmentVariable('NAME1', 'Value1', 'User')no funcionan para las cuentas de usuario final, ya que el proceso se ejecuta como SYSTEM

  • La ejecución del script de Powershell necesita al menos un usuario que haya iniciado sesión y esto funciona bien

Puedo encontrar al usuario que inició sesión con: $current_user = (Get-WmiObject -Class Win32_ComputerSystem).UserName.Split('\')[1]

Intenté usar la actualización del Registro para configurar las Variables de usuario registradas, pero esto no funciona como se esperaba: Set-ItemProperty -Path 'HKCU:\Environment' -Name 'NAME2' -Value 'Value2' -Force

¿Cómo puedo configurar la variable de entorno de usuario que ha iniciado sesión desde el script de PowerShell que se ejecuta como SISTEMA?

2
  • 1
    Busque "Powershell hacerse pasar por usuario", que podría encaminarlo.
    zett42
    29/03/20 a las 10:18
  • No creo que necesite suplantar, solo necesita cargar el subárbol del usuario en el registro actual, ver por ejemplo: El comando Powershell REG LOAD no funciona . ¡Asegúrate de DESCARGAR también la colmena cuando hayas terminado! Para solucionar problemas en la cuenta SYSTEM, consulte esta respuesta . También tenga en cuenta que probablemente tenga que volver a cargar su sesión de usuario para aplicar los cambios que realizó.
    iRon
    29/03/20 a las 11:44
3

Para establecer un valor de registro para el usuario que ha iniciado sesión actualmente (que no es el que ejecuta el código), debe encontrar el SID del usuario.

Prueba esto:

# get the domain and username for the currently logged on user
$domain, $userName = (Get-WmiObject -Class Win32_ComputerSystem).UserName -split '\\', 2
# next, get the SID for that current user
$user = [System.Security.Principal.NTAccount]::new($domain, $userName)
$sid  = $user.Translate([System.Security.Principal.SecurityIdentifier]).Value

# set the registry value for this user.
Set-ItemProperty -Path "Registry::HKEY_USERS\$sid\Environment" -Name 'NAME2' -Value 'Value2' -Type String

# See: https://docs.microsoft.com/en-us/dotnet/api/microsoft.win32.registryvaluekind?redirectedfrom=MSDN
# for other RegistryValueKind values for parameter Type
3

Para los scripts de solución de problemas que se ejecutan en la cuenta SYSTEM, recomiendo usar PSExec , consulte: esta respuesta .
Si el subárbol de registro de su usuario aún no está cargado, debe cargarlo ( y descargarlo cuando haya terminado), consulte: El comando Powershell REG LOAD no funciona .

Para encontrar la colmena del usuario (la ruta se identifica mediante el SID del usuario) y establecer la variable de entorno:

$UserHive = Get-ChildItem -Path 'Registry::\HKEY_USERS' |
    Where-Object {(Test-Path "Registry::$_\Volatile Environment") -and (Get-ItemProperty "Registry::$_\Volatile Environment").USERNAME -eq $Username}

Set-ItemProperty -Path "Registry::$UserHive\Environment" -Name 'NAME2' -Value 'Value3' -Force