4 votes

Variables d'environnement Windows et édition manuelle du Registre - problème de valeurs incorrectes/non définies

Ouvrez regedit.exe, accédez à HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment. Créez deux variables d'environnement :

Nom    Type            Données
-----  --------------  -----------
zbar   REG_SZ          water
zfoo   REG_EXPAND_SZ   %zbar%

Ouvrez un nouvel cmd.exe, powershell.exe ou autre. Ces variables sont manquantes. Faites une déconnexion, puis reconnectez-vous. Dans la fenêtre de cmd.exe, tapez echo %zbar% - water s'affiche. Tapez echo %zfoo% et %zbar% s'affiche, mais je m'attends à voir la valeur étendue - water.

Et maintenant. Ouvrez la boîte de dialogue des Variables d'Environnement de Windows. Modifiez ou créez n'importe quelle variable (par exemple zzz=zzz). Réouvrez cmd.exe et tapez echo %zfoo% - maintenant vous voyez water !

En réalité, je crée ces variables avec un script PowerShell. Mais tout ce que ce script fait est des manipulations de registre décrites.

Questions :

  1. Comment forcer la variable zfoo à avoir une valeur correcte sans ce tour de magie avec l'ouverture de la boîte de dialogue des Variables d'Environnement de Windows et la modification de certaines variables ? Peut-être devrais-je appeler une API, quelque chose comme [Microsoft.Win32.Registry]::Refresh() ?
  2. Est-il possible de rendre ces variables visibles pour les utilisateurs sans avoir besoin des opérations de Déconnexion/Reconnexion ? Si je modifie les variables d'environnement au niveau de l'utilisateur (également dans le registre), elles sont immédiatement disponibles, mais au niveau global, elles ne le sont pas.

Merci.

9voto

teki Points 1

Vous devez diffuser le Message WM_SETTINGCHANGE.

Rappelez-vous : Vous ne définissez pas réellement des variables d'environnement de quelque forme que ce soit lorsque vous modifiez le registre. Les variables d'environnement font partie de l'espace mémoire de chaque processus individuel, chaque processus ayant son propre ensemble. Elles ne résident pas dans le registre. Vous modifiez un modèle. Vous devez persuader les programmes qui définissent des variables d'environnement réelles de relire le modèle et de définir leurs environnements en conséquence. Vous le faites en diffusant un message Windows qui informe les parties intéressées que le modèle dans le registre a changé. Microsoft Windows Explorer est l'une de ces parties intéressées, et modifie ses propres variables d'environnement chaque fois qu'il entend que le modèle a changé. Ces modifications sont ensuite héritées de manière normale par tout nouveau processus que Explorer engendre.

0voto

Zombo Points 1119

Vous pouvez utiliser SETX, il diffusera WM_SETTINGCHANGE après avoir défini la variable:

SETX VAR VALEUR /M

Ou, si vous insistez pour entrer les variables dans le registre, vous pouvez utiliser SETX définir une variable qui existe déjà, afin de diffuser le changement de registre:

SETX OS %OS% /M

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X