Имя: Пароль:
IT
Админ
Как получить ProductId из реестра сервера 2008?
0 GreyK
 
11.09.12
18:54
Работал вот такой код на ХР:
WshShell = CreateObject("WScript.Shell");
ProductId=СтрЗаменить(WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ProductId"),"-","");

Но Server 2008 не хочет читать ProductId примерно таким-же скриптаом из ветки:
WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Registration")

Есть возможность обойти эту фичу S2008?
1 smaharbA
 
11.09.12
18:56
это не продуктид
2 prog2012
 
11.09.12
18:57
кмсактиватор?
3 smaharbA
 
11.09.12
19:02
Windows NT
4 GreyK
 
11.09.12
19:08
(3) Оттудда тоже не читается, какая-то защита срабатывает.
5 GreyK
 
11.09.12
19:12
(2) Нужно стандартными средстави получить уникальный код винды.
6 smaharbA
 
11.09.12
22:17
(5) не так получают код
версия х64 ?
7 GreyK
 
12.09.12
11:16
(6) Да.
8 GreyK
 
12.09.12
18:14
Кто может подсказать по ошибке в модуле:

   WshShell = CreateObject("WScript.Shell");
   Попытка
       ProductId=СтрЗаменить(WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ProductId"),"-","");
   Исключение
       WbemScripting = CreateObject("WbemScripting.SWbemNamedValueSet");
       WbemScripting.Add("__ProviderArchitecture", 64);
       //WbemScripting.Add("__RequiredArchitecture", 1);
       locator = CreateObject("Wbemscripting.SWbemLocator");
       oReg = Locator.ConnectServer("", "root\default", "", "", , , , WbemScripting).Get("StdRegProv");
       
       oInParams = oReg.Methods_("GetStringValue").InParameters;
       oInParams.hDefKey = "HKEY_LOCAL_MACHINE";
       oInParams.sSubKeyName = "\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion";
       oInParams.sValueName = "ProductId";
       
       oOutParams = oReg.ExecMethod_("GetStringValue", oInParams, , WbemScripting);
       
       ProductId=СтрЗаменить(oOutParams.sValue,"-","");
   КонецПопытки;


Текст ошибки:
"oReg = Locator.ConnectServer("", "root\default", "", "", , , , WbemScripting).Get("StdRegProv");
{Глобальный модуль(652)}: SWbemLocator: Invalid parameter"
9 smaharbA
 
12.09.12
18:55
Тебе нужен ключь или ид ?
10 smaharbA
 
12.09.12
18:57
а так, достаточно

oReg = Locator.ConnectServer(".", "root\default", "", "").Get("StdRegProv");
11 smaharbA
 
12.09.12
18:57
вернее

oReg = Locator.ConnectServer("", "root\default").Get("StdRegProv");
12 GreyK
 
12.09.12
19:04
(9) Нужен ИД.
13 smaharbA
 
12.09.12
19:19

Функция ВыполнитьМетод(Компьютер=".",Корень,Ветка,Значение="",Метод)
   Локатор=СоздатьОбъект("Wbemscripting.SWbemLocator");
   Реестр=Локатор.ConnectServer(Компьютер,"root/default").Get("StdRegProv");
   ОбъектМетод=Реестр.Methods_.Item(Метод);
   Параметры= ОбъектМетод.inParameters.SpawnInstance_();
   Параметры.hDefKey  = Корень;
   Параметры.sSubKeyName = Ветка;
   Если ПустоеЗначение(Значение)=0 Тогда
       Параметры.sValueName  = Значение;
   КонецЕсли;
   Возврат Реестр.ExecMethod_(ОбъектМетод.Name, Параметры);
КонецФункции    // ПолучитьЗначение

Функция ПолучитьСубКлючи(Компьютер=".",Корень=2147483649,Ветка="Software\1C\1Cv7\7.7\titles\")
   ТЗ=СоздатьОбъект("ТаблицаЗначений");
   ТЗ.НоваяКолонка("Ключ");
   ТЗ.НоваяКолонка("Значение");
   СубКлючи=ВыполнитьМетод(Компьютер,Корень,Ветка,,"EnumValues");
   к=0;
   Пока к<>"Все" Цикл
       Попытка
           Стр=СубКлючи.sNames(к);
           ТЗ.НоваяСтрока();
           ТЗ.Ключ=Стр;
           ТЗ.Значение=ВыполнитьМетод(Компьютер,Корень,Ветка,Стр,"GetStringValue").Properties_("sValue").Value;
           к=к+1;
       Исключение
           к="Все";
       КонецПопытки;
   КонецЦикла;
   Возврат ТЗ;
КонецФункции    //

//*******************************************
Процедура Сформировать()
   ПолучитьСубКлючи(".","2147483650","Software\Microsoft\Windows NT\CurrentVersion\").ВыбратьСтроку();
КонецПроцедуры
14 smaharbA
 
12.09.12
19:20
многобайтовые значения так же просто получить, можно сразу определять тип значения и преобразовывать в строку или в список значений
15 GreyK
 
12.09.12
19:32
(13) Спасибо!
16 smaharbA
 
12.09.12
19:45
(15) можно получить и ключь виндуза и офиса
17 Jaap Vduul
 
12.09.12
19:48
select SerialNumber from Win32_OperatingSystem
18 GreyK
 
12.09.12
19:49
(16) Это в мою зажачу не входит, нужно только узнать ту операционку которая может выполнять процедуру.
С праздником!
19 smaharbA
 
12.09.12
20:13
(17) можно и так автору, но тогда нужна будет обертка
20 GreyK
 
13.09.12
06:11
Итого:

scrptCtrl=createobject("MSScriptControl.ScriptControl");
scrptCtrl.language="vbscript";
scrptCtrl.addcode("Function GeProductID()
|Const HKLM = &h80000002
|Set objCtx = CreateObject(""WbemScripting.SWbemNamedValueSet"")
|objCtx.Add ""__ProviderArchitecture"", 64
|objCtx.Add ""__RequiredArchitecture"", TRUE
|Set objLocator = CreateObject(""Wbemscripting.SWbemLocator"")
|Set objServices = objLocator.ConnectServer("""",""root\default"","""","""",,,,objCtx)
|Set objStdRegProv = objServices.Get(""StdRegProv"")
|Set Inparams = objStdRegProv.Methods_(""GetStringValue"").Inparameters
|Inparams.Hdefkey = HKLM
|Inparams.Ssubkeyname = ""Software\Microsoft\Windows NT\CurrentVersion\""
|Inparams.Svaluename = ""ProductId""
|GeProductID = objStdRegProv.ExecMethod_(""GetStringValue"", Inparams,,objCtx).SValue
|End Function");
ProductId = scrptCtrl.run("GeProductID");
21 smaharbA
 
13.09.12
06:26
(20) а нафига тут обертка ?
22 GreyK
 
13.09.12
06:43
(21) Надоело бороться с утановкой этих двух параметров :)
|objCtx.Add ""__ProviderArchitecture"", 64
|objCtx.Add ""__RequiredArchitecture"", TRUE
23 smaharbA
 
13.09.12
06:45
ясно, интеджер и булево
24 smaharbA
 
13.09.12
06:45
да не всегда могут быть переданы из 77
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.