2012-04-04 94 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