Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Windows > Установить PATH для Administrator


Автор: tishaishii 10.3.2007, 16:49
Надо программно изменить PATH для самого главного пользователя универчально в WinXP\2003\98\Vista.

Автор: Kostyaxp 12.3.2007, 18:28
В смысле поменять местоположение папки с аккаунтом админа? Уневирсально не выйдет (хотя бы потому что по-умолчанию путь для их хранения разный).

Автор: tishaishii 16.3.2007, 19:36
Ну, чтобы после перезагрузки после команды "set PATH", я видел, то же, что установил перед перезагрузкой без дополнительных телодвижений.

Ну в 98м я для этого меняю autoexec.bat, в XP, 2000, 2003, ... меняю в реестре, а надо как-то программно найти общее решение. Делаю инсталляшку своей АИС, надо. Другие же программы делают.

Автор: Tectoder 16.3.2007, 20:21
Цитата(MSDN)

The user can add or modify system environment variables using the Control Panel. To programmatically add or modify system environment variables, add them to the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment registry key, then broadcast a WM_SETTINGCHANGE message. This allows applications, such as the shell, to pick up your updates. Note that environment variables listed in this key are limited to 1024 characters.
Исходя из данной цитаты  я могу предположить, что данный метод будет в равной степени работать для всех существющих версий windows

Автор: tishaishii 17.3.2007, 20:00
Посмотрим

Добавлено @ 20:03 
Не уже ли, если поменять в реестре 95\98 поменять PATH, то и в autoexec.bat изменится?

Автор: tishaishii 18.3.2007, 10:06
В 98м пути HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment не существует.

Автор: tishaishii 18.3.2007, 11:48
Короче, раз ни кто ни чего не знает, пришлось самому справляться:
[code=perl]use IO::Handle;
use Win32;
use Win32::Registry;

$|=1;

sub registryValue {
    my($path, $rh, $result)=shift;
    ${'::'.$path}->Open(shift, $rh) && $rh->QueryValueEx(shift, undef, $result);
    +$result
}

sub addPath {
    my($str, $paths, $i)=(shift, shift, shift);
    $paths->{$_}=++$$i foreach
        grep /\S/, map{s{^"(.*?)"$}{$1}i;+exists $paths->{+uc} ? uc : $_}split/\s*;\s*/, $str;
}

sub setPath {
    my($path, $CRLF, $i)=(shift, "\r\n");
    if((&Win32::GetOSVersion)[4]<2) {
        my$file=(($ENV{WINDIR} || $ENV{WINBOOTDIR})=~m{^([A-Z]:)}i)[0].'\AUTOEXEC.BAT';
        open my$fh, '<'.$file;binmode $fh;my@in=<$fh>;close $fh;
        open my$fh, '>'.$file;binmode $fh;
        foreach(@in) {
            if(/^\s*SET\s+PATH\s*=\s*(.*?)\s*$/i) {
                &addPath($1, $path, \$i)
            } else {
                $fh->print(/^\s*(.*?)\s*$/?$1:$_, $CRLF)
            }
        }
        $fh->print('SET PATH=', join(';', map{s{\\?$}{}g;'"'.$_.'"'}
                    sort{$path->{$a}<=>$path->{$b}}keys %$path), $CRLF);
        close $fh;
    } else {
        my($drv, $dir, $node, $rh)=(
            'HKEY_LOCAL_MACHINE', 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'PATH'
        );
        &addPath(&registryValue($drv, $dir, $node), $path, \$i);
        ${+'::'.$drv}->Open($dir, $rh);
        $rh->SetValueEx(
            $node, undef, REG_SZ,
            join(';', map{s{\\?$}{}g;'"'.$_.'"'}sort{$path->{$a}<=>$path->{$b}}keys %$p

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)