【发布时间】:2009-07-15 14:28:28
【问题描述】:
如何找到 64 位 windows 2003 服务器上的 CPU 数量? thread 中的答案无效。使用 Win32_ComputerSystem.NumberOfProcessors 不会返回任何结果。
如果可能的话,我更喜欢使用 WMI 的方法。我有一个脚本,它已经包含了我需要从获取磁盘信息中获取此信息的所有机器。
谢谢
【问题讨论】:
如何找到 64 位 windows 2003 服务器上的 CPU 数量? thread 中的答案无效。使用 Win32_ComputerSystem.NumberOfProcessors 不会返回任何结果。
如果可能的话,我更喜欢使用 WMI 的方法。我有一个脚本,它已经包含了我需要从获取磁盘信息中获取此信息的所有机器。
谢谢
【问题讨论】:
试试 Win32_Processor 怎么样
strComputer = "."
Set objWMIService = GetObject("winmgmts:"{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
【讨论】:
关闭。这是我使用的脚本:
import wmi
servers = ['XXX','YYY']
for servername in servers:
connection = wmi.connect_server (server=servername)
c = wmi.WMI (wmi=connection)
print servername
for proc in c.Win32_Processor():
print proc.name
print
输出是:
XXX
Intel(R) Pentium(R) III Xeon 处理器
Intel(R) Pentium(R) III Xeon 处理器
Intel(R) Pentium(R) III Xeon 处理器
Intel(R) Pentium(R) III Xeon 处理器
Intel(R) Pentium(R) III Xeon 处理器
Intel(R) Pentium(R) III Xeon 处理器
Intel(R) Pentium(R) III Xeon 处理器
Intel(R) Pentium(R) III Xeon 处理器
年年
Intel(R) Pentium(R) III Xeon 处理器
Intel(R) Pentium(R) III Xeon 处理器
Intel(R) Pentium(R) III Xeon 处理器
Intel(R) Pentium(R) III Xeon 处理器
Intel(R) Pentium(R) III Xeon 处理器
Intel(R) Pentium(R) III Xeon 处理器
Intel(R) Pentium(R) III Xeon 处理器
Intel(R) Pentium(R) III Xeon 处理器
我应该只看到每个服务器的两个处理器。
【讨论】:
这将起作用:
ManagementObjectSearcher mgmtObjects = new ManagementObjectSearcher("Select * from Win32_ComputerSystem");
foreach (var item in mgmtObjects.Get())
{
Console.WriteLine("NumberOfProcessors:" + item.Properties["NumberOfProcessors"].Value);
Console.WriteLine("NumberOfLogicalProcessors:" + item.Properties["NumberOfLogicalProcessors"].Value);
}
【讨论】:
您可以通过 WMI 查询来执行此操作。以下脚本将每个逻辑 CPU 的 SocketDesignation 名称放在 csv 文件中服务器列表的数据库表中。填充表后,运行以下查询将为您提供物理和逻辑处理器的计数:
select servername, COUNT(cpuname) 'LogicalCPUCount', COUNT(distinct cpuname) 'PhysicalCPUCount'
from tmp_cpu
group by servername
***** WMI 脚本 - 您需要在运行前调整连接并创建 tmp_cpu 表 *****
$query = "delete sqlserverinventory.dbo.tmp_cpu"
Invoke-Sqlcmd -Query $query -ServerInstance "xxxxxxxx"
Invoke-Sqlcmd -Query "select servername from sqlserverinventory.dbo.server where servername in (select servername from sqlserverinventory.dbo.vw_Instance_Autoload);" -ServerInstance "xxxxxxxx" | out-file -filepath "v:\scripts\server_list.csv"
(Get-Content v:\scripts\server_list.csv) | where {$_.readcount -gt 3} | Set-Content v:\scripts\server_list.csv
$servers = Get-Content "V:\scripts\server_list.csv"
## $servers = Invoke-Sqlcmd -Query "select servername from sqlserverinventory.dbo.vw_Instance_Autoload;" -ServerInstance "xxxxxxxx"
foreach ($server in $servers){
$server = $server.Trim()
$SQLServices = Get-WmiObject -ComputerName $server -Namespace "root\CIMV2" -query "SELECT SocketDesignation FROM Win32_Processor where CPUStatus=1 or CPUStatus=4"
forEach ($SQLService in $SQLServices) {
$PhysicalCPU = $SQLService.SocketDesignation
$insert_query = "INSERT INTO sqlserverinventory.dbo.tmp_cpu (ServerName,CPUName) VALUES('$server','$PhysicalCPU')"
## "sql - $insert_query"
Invoke-Sqlcmd -Query $insert_query -ServerInstance "xxxxxxxx"
}
}
【讨论】: