Как мне установить системную переменную Win32 в Perl? - PullRequest
2 голосов
/ 01 октября 2010

Я хочу иметь возможность установить системную переменную окружения в Perl, и я написал следующий скрипт (вдохновленный этой идеей ) для достижения этой цели:

use Win32;
use Win32::API;
use Win32::OLE qw( in );

my $machine = ".";
my $WMIServices = Win32::OLE->GetObject ( "winmgmts:{impersonationLevel=impersonate,(security)}//$machine/root/cimv2" ) || die;

my $objVariable = $WMIServices->Get("Win32_Environment")->SpawnInstance_;
$objVariable->{Name}="NewOSType";
$objVariable->{UserName} = "<System>";
$objVariable->{VariableValue} = "LAMBDA";
$objVariable->Put_;

Однако я не эксперт в Perl, и я хотел бы знать, что эксперты думают об этом коде. Это лучший способ сделать это?

1 Ответ

4 голосов
/ 01 октября 2010

Другой возможный подход:

use strict;
use warnings;
use Win32::TieRegistry qw[:KEY_];
use Win32::API;
use constant HWND_BROADCAST => -1;
use constant WM_SETTINGCHANGE => 0x1a;

my $hklm_env = Win32::TieRegistry->new(
    'HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Environment', 
    { Access => KEY_READ() | KEY_WRITE(), Delimiter => '/' }
); # returns undef if SYSTEM ENV not writable

my $hkcu_env = Win32::TieRegistry->new(
    'HKEY_CURRENT_USER/Environment', 
    { Access => KEY_READ() | KEY_WRITE(), Delimiter => '/' }
);

# if SYSTEM ENV not writable try USER ENV
my $e = defined($hklm_env) ? $hklm_env : $hkcu_env;

if(defined $e) {
  $e->SetValue('Variable', 'Value');  
}
else {
  warn "Cannot open neither SYSTEM ENV nor USER ENV registry for Read+Write";
}

my $SendMessage = new Win32::API("user32", "SendMessage", 'NNNP', 'N') or die "Couldn't create SendMessage: $!\n";
my $RetVal = $SendMessage->Call(HWND_BROADCAST,WM_SETTINGCHANGE,0,'Environment');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...