Преобразование кода из VBScript в JScript? - PullRequest
1 голос
/ 05 апреля 2011

Как преобразовать следующий код VBScript в JScript, который используется для получения путей профилей пользователей для всех пользователей?

Set oWshNet = CreateObject("Wscript.Network")
sComputer = oWshNet.ComputerName
'For remote computer
'sComputer = "some name or IP"
Const HKLM = &H80000002

sProfileRegBase = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" 
Set oReg = GetObject("WinMgmts:{impersonationLevel=impersonate}!//" _ 
                & sComputer & "/root/default:StdRegProv")
Set oWMI = GetObject("WinMgmts:{impersonationLevel=impersonate}!//" _ 
                & sComputer & "/root/cimv2")
Set colItems = oWMI.ExecQuery _ 
                ("Select Name,SID from Win32_UserAccount WHERE Domain = '" _ 
                & sComputer & "'",,48)
For Each oItem In colItems
  sAddInfo = ""
  Wscript.Echo "User name: " & oItem.Name & sAddInfo
  oReg.GetExpandedStringValue HKLM, sProfileRegBase& "\" & oItem.SID, _ 
                  "ProfileImagePath", sProfilePath
  If IsNull(sProfilePath) Then
    sProfilePath = "(none defined)"
  End If <br>
  Wscript.Echo "Profile path: " & sProfilePath
  Wscript.Echo   ' blank line
Next

Мне частично удалось преобразовать, но я застрял в двух вещах.

  1. Пожалуйста, подтвердите, правильно ли я использую oReg = GetObject("WinMgmts:\\\\.\\root\\default:StdRegProv"); и соответствует ли он тому, который был указан в коде.Если нет, пожалуйста, предложите правильное использование.

  2. Что эквивалентно GetExpandedStringValue в JScript?Если их нет, как лучше проверить, существует ли раздел реестра до получения значения?

Ответы [ 3 ]

1 голос
/ 05 апреля 2011

Вот пример решения: (от http://www.windowsitpro.com/content/content/93402/Listing_05.txt)

// GetSystemPath.js

var HKEY_LOCAL_MACHINE = 0x80000002;
var ENVIRONMENT_SUBKEY = "SYSTEM\\CurrentControlSet\\Control"
  + "\\Session Manager\\Environment";

var computer, regprov, method, inparams, outparams, systempath;

// CALLOUT A
// Step 1: Get an instance of the WMI object.
computer = ".";
regprov = GetObject("winmgmts:{impersonationlevel=impersonate}!//"
  + computer + "/root/default:StdRegProv");
// END CALLOUT A

// CALLOUT B
// Step 2: Create an InParameters object for the method.
method = regprov.Methods_.Item("GetExpandedStringValue");
inparams = method.InParameters.SpawnInstance_();
// END CALLOUT B

// CALLOUT C
// Step 3: Set the InParameters object's properties.
inparams.hDefKey = HKEY_LOCAL_MACHINE;
inparams.sSubKeyName = ENVIRONMENT_SUBKEY;
inparams.sValueName = "Path";
// END CALLOUT C

// CALLOUT D
// Step 4: Call ExecMethod_ to return an OutParameters object.
outparams = regprov.ExecMethod_(method.Name, inparams);
// END CALLOUT D

// CALLOUT E
// Step 5: The OutParameters object contains the method's results.
if (outparams.ReturnValue == 0) {
  systempath = outparams.sValue;
  WScript.Echo(systempath);
}
// END CALLOUT E
1 голос
/ 05 апреля 2011

1) Pl подтверждает, что я использовал oReg = GetObject ("WinMgmts: \. \ Root \ default: StdRegProv");правильно и так же, как тот, который был дан в коде?если нет, пожалуйста, предложите правильное использование?

В этом случае будут работать как прямые, так и обратные (/) и обратные (\).Однако обратную косую черту необходимо будет удвоить, поскольку они являются специальными символами в JScript.

2) Какова аналогичная функция для GetExpandedStringValue в Jscirpt?Если их нет, как лучше проверить, существует ли раздел реестра перед получением значения?

На самом деле, вы можете использовать StdRegProv.GetExpandedStringValue в JScript, даже если этот метод использует outПараметр и JScript изначально не поддерживают out параметры.Хитрость заключается в том, чтобы позвонить через ExecMethod_.См. Написание сценариев WMI в JScript для объяснения и примера.

0 голосов
/ 05 апреля 2011

Любая строка с символом \ должна быть экранирована;

var sProfileRegBase = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList" 

Это включает ваш GetObject() звонок.

GetExpandedStringValue то же самое; это не функция VB, это метод объекта "Wscript.Network", поэтому он доступен для js.

...