是否有人熟悉可以设置为在启动时运行的脚本,该脚本将报告机器中安装的物理内存的状态?
我有一些 Windows XP 笔记本电脑,正在处理 RAM 被盗的问题。当用户登录时,如果物理内存小于预设值(4GB),我希望他们收到警报。更好的办法是,将这一变化记录在只有管理员帐户才能访问的日志文件中。
答案1
有一些 vbscript 命令可以返回系统内存量。使用这个命令写入文本或日志文件,并将其与之前的数量进行比较,如果不匹配则返回错误。
由于它返回系统内存的整数,您甚至可以设置一个修正因子来最大限度地减少错误,比如说 +/-30。
您还可以使用它来满足您的安全报告偏好,方法是将内存值以及日期和时间附加到安全文件夹中的文件中,然后使用脚本定期轮询笔记本电脑并报告任何值发生变化的地方以及记录更改的日期。这样您就可以看到第一次记录差异的时间,从而更好地跟踪问题。
更新:Sysinternals(现归 MS 所有)有一个实用程序 PSINFO,它可远程报告各种系统信息值,类似于上面的脚本。但它报告的不仅仅是内存。让它运行并在启动时报告,笔记本电脑上不需要脚本。然后,您只需要编写一个输出收集和解析脚本,您就可以检查多个系统值的差异。
答案2
更准确的方法是使用容量的財產Win32_物理内存来自 WMI,而不是使用总物理内存的財產Win32_计算机系统。 话虽如此...
为了提醒用户,您可能需要某种弹出消息。下面的 VBScript 可用作用户登录脚本,可以在域的 GPO 中或使用本地组策略编辑器 ( gpedit.msc
)。该脚本应使用扩展名保存.vbs
。
Option Explicit
Const TargetGBMemory = 4
Dim wmi
Dim physicalMemory
Dim mem
Dim resultsReturned
Dim totalMem
Set wmi = GetObject("winmgmts:\root\cimv2")
Set physicalMemory = wmi.ExecQuery ("SELECT Capacity FROM Win32_PhysicalMemory")
resultsReturned = False
On Error Resume Next
Err.Clear
mem = physicalMemory.Count
resultsReturned = CBool(Err.Number = 0)
Err.Clear
On Error Goto 0
totalMem = 0
If resultsReturned Then
For Each mem In physicalMemory
If Not IsNull(mem.Capacity) Then
totalMem = CDbl(mem.Capacity)
End If
Next
End If
Set physicalMemory = Nothing
Set wmi = Nothing
If ((totalMem / (2 ^ 30)) < TargetGBMemory) Then
WScript.Echo "Something happened to your memory. You only have", FormatNumber(totalMem / (2 ^ 30)), "GB."
End If
对于日志文件的想法,您可能不希望出现任何弹出窗口。只需写入文件并保持安静即可。您可以以相同的方式使用下面的脚本,但您希望它作为域或本地组策略中的机器启动脚本。该脚本写入"memory_log.txt"
系统文件夹中的一个名为的文件。默认情况下,此区域仅可由管理员写入。用户将能够查看和读取日志文件,但无法删除或修改它。该脚本应使用扩展名保存.wsf
。
<package>
<job>
<object id="fso" progid="Scripting.FileSystemObject" />
<reference object="Scripting.FileSystemObject" />
<script language="VBScript">
Option Explicit
Const TargetGBMemory = 4
Dim wmi
Dim physicalMemory
Dim mem
Dim resultsReturned
Dim totalMem
Set wmi = GetObject("winmgmts:\root\cimv2")
Set physicalMemory = wmi.ExecQuery ("SELECT Capacity FROM Win32_PhysicalMemory")
resultsReturned = False
On Error Resume Next
Err.Clear
mem = physicalMemory.Count
resultsReturned = CBool(Err.Number = 0)
Err.Clear
On Error Goto 0
totalMem = 0
If resultsReturned Then
For Each mem In physicalMemory
If Not IsNull(mem.Capacity) Then
totalMem = CDbl(mem.Capacity)
End If
Next
End If
Set physicalMemory = Nothing
Set wmi = Nothing
If ((totalMem / (2 ^ 30)) < TargetGBMemory) Then
Dim ts
Set ts = fso.OpenTextFile (fso.BuildPath (fso.GetSpecialFolder(SystemFolder), "memory_log.txt"), ForAppending, True)
ts.Write Now
ts.Write vbTab
ts.WriteLine "Something happened to your memory. You only have " & FormatNumber(totalMem / (2 ^ 30)) & " GB."
ts.Close
Set ts = Nothing
End If
</script>
</job>
</package>