1

私はここ数日壁に頭をぶつけてきましたが、コードのどこが悪いのか理解できません。かなりシンプルだと思いますが、見えません。マシンにログオンしたユーザーと時刻のリストを返そうとしています。環境がロックダウンされているため、レジストリを読み取る必要がありました。

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'

ビットは瞬間を失った

4

1 に答える 1

3
  1. バグon error resume nextが解決されるまで、を削除してください。
  2. すべての変数を使用Option Explicitして宣言します。スコープの問題がいくつかあることがわかります (たとえば、strReturn を使用)。
  3. VBScript の関数がどのように値を返すかを調べてみてください。ヒント、そうではありませんReturn = "my return value"
  4. 関数を呼び出す必要があるため、 を使用しますCall ProfileTime(objsubkey)。それ以外の場合は、Sub として処理できますProfileTime objsubkey。使用ProfileTime(objsubkey)するということは、「関数にスローする前に objsubkey を評価する」ことを意味します。それがどのように機能するかは、このブログ記事をご覧ください。

これらの手順により、コードがよりクリーンになり、何が問題なのかのヒントが得られます。エラーが発生したとき (=On error resume next) に別の方法を見て、正しく動作することを期待してコードを作成することはできません。また、労働者を適切な貸し出しリスト (=明示的なオプション、宣言と範囲指定) に載せないことで労働者を尊重しないと、労働者はあなたに従属しなくなります。

于 2012-04-04T11:55:17.757 に答える