2012-04-04 141 views
1

我已经撞了我的头撞墙了几天,现在无法解决我的代码有什么问题。我相信它非常简单,但看不到它。我试图返回登录到机器的用户列表和时间。由于环境被锁定,我必须阅读注册表。从函数返回变量vbs

Option Explicit 
Const HKEY_LOCAL_MACHINE = &H80000002 

Dim oNet, WMI, strComputer, tz, os, objRegistry, strKeyPath, strSubPath, strValueName, strValue, arrSubkeys, objSubKey, strSID, strUser, objReg, lngHighValue, lngLowValue, Return, strReturn, NanoSecs, DT 
Set oNet = CreateObject("WScript.Network") 
Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
strComputer = oNet.Computername 

tz = 0 
For Each os In GetObject("winmgmts:").InstancesOf ("Win32_OperatingSystem") 
    tz = os.CurrentTimeZone 
    Exit For 
Next 

'Set objRegEx = CreateObject("VBScript.RegExp") 
'objRegEx.Global = True 
'objRegEx.IgnoreCase = True 
'objRegEx.Pattern = "default|all users|administrator|localservice|networkservice|ueit-admn-[0-9]|3rd-admn-[0-9]|systemprofile" 

Set objRegistry=GetObject("winmgmts:\\" & _ 
    strComputer & "\root\default:StdRegProv") 

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" 
objRegistry.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubkeys 

For Each objSubkey In arrSubkeys 
    strValueName = "ProfileImagePath" 
    strSID = objSubKey 
    strSubPath = strKeyPath & "\" & objSubkey 
    objRegistry.GetExpandedStringValue HKEY_LOCAL_MACHINE,strSubPath,strValueName,strValue 
    'strUser = Replace(strValue,"C:\Documents and Settings\","") 
    'Set colMatches = objRegEx.Execute(strUser) 
    'If colMatches.Count < 1 Then 
    Call ProfileTime(strSID) 
    'WScript.echo ProfileTime 
    'End If 
Next 

Function ProfileTime(strSID) 

Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv" ) 
strKeyPath = "SOFTWARE\MICROSOFT\Windows NT\CurrentVersion\ProfileList\" & strSID 

strValueName = "ProfileLoadTimeHigh" 
Return = objReg.GetDWORDValue(HKEY_LOCAL_MACHINE,strKeyPath,strValueName,lngHighValue) 
strValueName = "ProfileLoadTimeLow" 
Return = objReg.GetDWORDValue(HKEY_LOCAL_MACHINE,strKeyPath,strValueName,lngLowValue) 
If typename(lngHighValue) <> "Null" then 
    NanoSecs = (lngHighValue * 2^32 + lngLowValue) 
    '' /* Returns time in Workstation Timezone */ 
    DT = #1/1/1601# + (NanoSecs/600000000/1440) + (tz/1440) 
    Set ProfileTime = CDate(DT) 
    End If 
End Function 

捉迷藏以上的回报

profile.vbs(36, 5) Microsoft VBScript runtime error: Wrong number of arguments or invalid property assignment: 'ProfileTime' 

位失去了的那一刻

+0

您上面的代码没有36行。请发布您的整个脚本,并指出哪一个是行号36. – Nilpo 2012-04-05 12:45:40

回答

3
  1. 摆脱on error resume next的,直到你的错误得到解决。
  2. 使用Option Explicit并声明所有变量。你会看到你有一些范围问题(例如strReturn)
  3. 试图找出VBScript中的函数如何返回它的值。提示,它不是Return = "my return value"
  4. 需要调用一个函数,所以使用Call ProfileTime(objsubkey)。否则,它可以作为一个子处理,然后你将它作为ProfileTime objsubkey。使用ProfileTime(objsubkey)表示“在将objsubkey投入函数之前评估它”。看看this blog article它是如何工作的。

这些步骤会让你的代码变得更清晰,给你提示出了什么问题。当发生错误时(=在下一次错误恢复时)并且期望它正常工作时,您无法通过查看其他方式来创建代码。也不尊重你的员工,不要把他们放在正确的贷款清单上(=明确的选项,声明和范围界定)将使他们对你不服从。

+0

感谢指针队友。我已经删除了错误,并定义了我的所有变量。应该返回函数的值作为函数的名称,ProfileTime,但现在我得到“错误的参数或属性分配的数量”我试过使用SET将值分配给ProfileTime,但我得到相同的错误。我如何返回值并避免此错误? – chemist 2012-04-04 13:49:31

+0

更新您的原始帖子。 – 2012-04-04 16:03:42

+1

CData返回一个原语,而不是一个对象,所以你不必“设置”ProfileTime,你可以像所有其他原语一样指定它。 – AutomatedChaos 2012-04-05 06:26:51