1

Тема: JS:WMI работа с реестром

По материалам статьи: "Рецепты WMI: работа с реестром Windows" попытался написать маленький скрипт, проверяющий, можно ли изменять значения раздела реестра. Проверял и на локальной и на удалённой машине. В обоих случаях ошибка:
"Метод "CheckAccess" отработал НЕ корректно. Код возврата = 2".
в HKCU мной предварительно создан раздел "my" в котором создан параметр "my_param" типа REG_DWORD, со значением FF.

Подскажите где ошибка...

KEY_SET_VALUE = 0x2;                
HKEY_CURRENT_USER = 0x80000001;

strLoc = ".";                            // для локального компьютера
strNet = "192.168.7.2";                // для компьютера в сети
strName = "root\\default:StdRegProv";     // строка для связи с классом StdRegProv пространства имён \\root\default

bGranted = "";                            // установка значения bGranted на самом деле не знаю как его определить

SWbemServices = GetObject("WinMgmts:{impersonationLevel=Impersonate, authenticationLevel=pktPrivacy}!\\\\" + strNet + "\\" + strName);
                                      // связь с классом

ret = SWbemServices.CheckAccess(HKEY_CURRENT_USER, "my\\my_param", KEY_SET_VALUE, bGranted);

if(ret == 0)
    {
    WScript.Echo("Метод \"CheckAccess\" отработал корректно");
    if(bGranted == true)
        {
        WScript.Echo("Значения раздела МОЖНО изменять, устанавливать или удалять");
        }
    else
        {
        WScript.Echo("Значения раздела НЕЛЬЗЯ изменять, устанавливать или удалять");
        }
    }
else
    {
    WScript.Echo("Метод \"CheckAccess\" отработал НЕ корректно.\nКод возврата = " + ret);
    }

2

Re: JS:WMI работа с реестром

Подскажите где ошибка...

Не факт, но… JScript не поддерживает передачу параметров по ссылке. Соответственно, не может вернуть изменённое значение параметра. Попробуйте использовать такой подход: JScript: вызов методов WMI с выходными параметрами.

3

Re: JS:WMI работа с реестром

alexii пишет:

Не факт, но… JScript не поддерживает передачу параметров по ссылке. Соответственно, не может вернуть изменённое значение параметра. Попробуйте использовать такой подход: JScript: вызов методов WMI с выходными параметрами.

Не очень разобрался в Вашей ссылке, но скопировал из статьи "Рецепты WMI: работа с реестром Windows" готовый код на vbs, заменив в нём свои значения:

On Error Resume Next
const HKEY_CURRENT_USER = &H80000001
const KEY_CREATE_SUB_KEY = &H4
'подключение к WMI
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
If Err.Number <> 0 Then
    WScript.Echo Err.Number & ": " & Err.Description
    WScript.Quit
End If
'проверка прав на создание подразделов
intRes = objReg.CheckAccess(HKEY_CURRENT_USER, "my\my_param", KEY_CREATE_SUB_KEY, bGranted)
If intRes <> 0 Then
    WScript.Echo intRes & ": не удалась проверка прав на создание подразделов ""HKEY_CURRENT_USER\my\my_param"""
    WScript.Quit
End If
'вывод сообщений
If bGranted Then
    WScript.Echo "Право на создание подразделов в ""HKEY_CURRENT_USER\my\my_param"" есть."
Else
    WScript.Echo "Права на создание подразделов в ""HKEY_CURRENT_USER\my\my_param"" нет."
End If

После отработки сообшение:
2: не удалась проверка прав на создание подразделов "HKEY_CURRENT_USER\my\my_param"

т.е. тоже что и у меня на JS было

4

Re: JS:WMI работа с реестром

Пробовал, как советовали, с исп. метода ExecMethod_

strLoc = ".";                            // для локального компьютера
strNet = "192.168.7.2";                // для компьютера в сети
strName = "root\\default:StdRegProv";     // строка для связи с классом StdRegProv пространства имён \\root\default


SWbemServices = GetObject("WinMgmts:{impersonationLevel=Impersonate, authenticationLevel=pktPrivacy}!\\\\" + strNet + "\\" + strName);
                                       // ссылка на связь с классом StdRegProv в пространстве "root\\default"


objwbemInParams = SWbemServices.Methods_("CheckAccess").InParameters.SpawnInstance_();
                                    // получение объекта, содержащего входные параметры 
                                    // метода "CheckAccess" класса "StdRegProv"

// попытка определить входные параметры для применения метода "ExecMethod_"

objwbemInParams.hDefKey = HKEY_CURRENT_USER;
objwbemInParams.sSubKeyName = "my\\my_param";

//objwbemInParams.lRequired = KEY_SET_VALUE;                 // выдаёт ошибку, что метод объектом не поддерживается
//objwbemInParams.bGranted = "";                                     // выдаёт ошибку, что метод объектом не поддерживается

objOutParams = SWbemServices.ExecMethod_("CheckAccess", objwbemInParams);    // запуск 


if(objOutParams.ReturnValue == 0)
    {
        WScript.echo("Метод \"CheckAccess\" исполнен успешно.");
    }
else
    {
        if(objOutParams.ReturnValue == null)
        {
            WScript.echo("Не удалось исполнить метод \"CheckAccess\"");
        }
        else
        {
        WScript.echo("Метод \"CheckAccess\" исполнен с ошибкой =  " + (objOutParams.ReturnValue));
        }
    }

В итоге результат: Метод "CheckAccess" исполнен с ошибкой = 2

5

Re: JS:WMI работа с реестром

Option Explicit

Const HKEY_CURRENT_USER  = &H80000001
Const KEY_CREATE_SUB_KEY = &H4

Dim objSWbemObjectEx
Dim boolGranted


Set objSWbemObjectEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

If objSWbemObjectEx.CheckAccess(HKEY_CURRENT_USER, "my\my_param", KEY_CREATE_SUB_KEY, boolGranted) = 0 Then
    If boolGranted Then
        WScript.Echo "Право на создание подразделов в ""HKEY_CURRENT_USER\my\my_param"" есть."
    Else
        WScript.Echo "Права на создание подразделов в ""HKEY_CURRENT_USER\my\my_param"" нет."
    End If
Else
    WScript.Echo intRes & ": не удалась проверка прав на создание подразделов ""HKEY_CURRENT_USER\my\my_param"""
End If

Set objSWbemObjectEx = Nothing

WScript.Quit 0
Право на создание подразделов в "HKEY_CURRENT_USER\my\my_param" есть.

Что я делаю не так?

6 (изменено: im2002, 2012-11-18 17:36:49)

Re: JS:WMI работа с реестром

разобрался...
у меня my_param это был параметр типа DWORD, а не раздел, как я и писал в первом посте....
в этом всё дело, если это подраздел в разделе my, то всё работает. Спасибо всем

7

Re: JS:WMI работа с реестром

im2002, ну, да — разрешения в реестре назначаются на уровне разделов в целом, а не отдельных параметров.

8 (изменено: im2002, 2012-11-21 14:50:24)

Re: JS:WMI работа с реестром

Наконец-то получилось, то что хотел!!!

strLoc = ".";                    
strName = "root\\default:StdRegProv";         
SWbemServices = GetObject("WinMgmts:{impersonationLevel=Impersonate, authenticationLevel=pktPrivacy}!\\\\" + strLoc + "\\" + strName);
objwbemInParams = SWbemServices.Methods_("CheckAccess").InParameters.SpawnInstance_();
                                    
// попытка определить входные параметры для применения метода "ExecMethod_"

objwbemInParams.hDefKey = HKEY_CURRENT_USER;
objwbemInParams.sSubKeyName = "my\\my_param";
//objwbemInParams.lRequired = KEY_CREATE_SUB_KEY;            [b]// выдаёт ошибку, что метод не поддерживается, единственно, что непонятно[/b]

objOutParams = SWbemServices.ExecMethod_("CheckAccess", objwbemInParams);    
                                    
if(objOutParams.ReturnValue == 0)
    {
       WScript.echo("Метод \"CheckAccess\" исполнен успешно.");
    try
        {
        if(objOutParams.bGranted == true)
                     {
              WScript.Echo("Редактирование разрешено");
                     }
                else
                    {
                     WScript.Echo("Редактирование НЕ разрешено");
                    }
        }
    catch(e)
        {
        WScript.Echo("Ошибка определения выходного параметра");
        }
    }
else
    {
        if(objOutParams.ReturnValue == null)
        {
            WScript.echo("Не удалось исполнить метод \"CheckAccess\"");
        }
        else
        {
        WScript.echo("Метод \"CheckAccess\" исполнен с ошибкой =  " + (objOutParams.ReturnValue));
        }
    }