2011-04-05 63 views
1

如何将以下VBScript代码转换为用于获取所有用户的用户配置文件路径的JScript?将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 

我部分成功地转换,但坚持2件事。

  1. 请确认我的oReg = GetObject("WinMgmts:\\\\.\\root\\default:StdRegProv");用法是否正确,是否是相同是在代码中给出的一个。如果不是,请提出正确的用法。

  2. JScript中的GetExpandedStringValue的等效项是什么?如果没有,在获取该值之前验证注册表项是否存在的更好方法是什么?

回答

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 
+0

非常棒..非常感谢 – svv 2011-04-05 15:19:32

+0

谢谢,你也为我节省了很多时间! – GrandmasterB 2012-07-04 06:59:09

0

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

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

这包括您的GetObject()调用。

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

+0

哎呀!你看到这是因为我在这里编辑不好。我使用GetExpandedStringValue,但它为sProfilePath返回null,尽管它存在..我使用函数作为oReg.GetExpandedStringValue(HKLM,sProfileRegBase +“\\”+ objEnum.SID,“ProfileImagePath”,sProfilePath); objEnum是查询集合项的枚举器对象oWMI.ExecQuery(“Select Name,SID from Win32_UserAccount”); – svv 2011-04-05 14:49:41

1

1)PL确认是我OREG = GetObject的的使用( “WinMgmts:\ \根\默认:的StdRegProv”);是正确的并且与代码中给出的一样?如果不是,请提出正确的用法?

两个正斜杠(/)和反斜线(\)将在这种情况下工作。然而,反斜杠需要加倍,因为它们是JScript中的特殊字符。

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

其实,你可以在JScript中使用StdRegProv.GetExpandedStringValue,即使这种方法使用out参数和JScript本身不支持out参数。诀窍是通过ExecMethod_来致电。有关说明和示例,请参见Writing WMI Scripts in JScript

+0

感谢您的建议海伦..它的帮助。 – svv 2011-04-05 15:20:06