【问题标题】:Converting the code from vbscript to Jscript?将代码从 vbscript 转换为 Jscript?
【发布时间】:2011-04-05 14:25:05
【问题描述】:

如何将以下 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. JScript 中 GetExpandedStringValue 的等价物是什么?如果没有,在获取值之前验证注册表项是否存在的更好方法是什么?

【问题讨论】:

    标签: javascript vbscript wmi user-profile


    【解决方案1】:

    这是一个示例解决方案:(来自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
    

    【讨论】:

    • 谢谢,你也为我节省了很多时间!
    【解决方案2】:

    1) 请确认我对 oReg = GetObject("WinMgmts:\.\root\default:StdRegProv"); 的用法是正确的并且与代码中给出的相同吗?如果不是,请建议正确的用法?

    在这种情况下,正斜杠 (/) 和反斜杠 (\) 都可以使用。但是,反斜杠需要加倍,因为它们是 JScript 中的特殊字符。

    2) Jscirpt 中 GetExpandedStringValue 的类似功能是什么?如果没有,在获取值之前验证注册表项是否存在的更好方法是什么?

    实际上,您可以在 JScript 中使用 StdRegProv.GetExpandedStringValue,即使此方法使用 out 参数并且 JScript 本身不支持 out 参数。诀窍是通过ExecMethod_ 调用它。有关说明和示例,请参阅 Writing WMI Scripts in JScript

    【讨论】:

    • 感谢 Helen 的建议。它有帮助。
    【解决方案3】:

    任何带有\字符的字符串都需要转义;

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

    这包括您的GetObject() 电话。

    GetExpandedStringValue 是一样的;它不是 VB 函数,它是“Wscript.Network”对象的方法,因此可用于 js。

    【讨论】:

    • 哎呀!你看到的\是因为我在这里编辑不好。我使用了 GetExpandedStringValue,但它为 sProfilePath 返回 null,尽管它存在。我将该函数用作 oReg.GetExpandedStringValue(HKLM, sProfileRegBase + "\\" + objEnum.SID, "ProfileImagePath", sProfilePath);其中 objEnum 是查询的集合项的枚举器对象 oWMI.ExecQuery("Select Name,SID from Win32_UserAccount");
    猜你喜欢
    • 2015-01-10
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2017-07-11
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    相关资源
    最近更新 更多