8

我需要对 300 多台既不在同一网络上,也不归同一公司所有的计算机进行软件审计。

是否有一个命令或小程序(无需安装即可运行),我可以通过电子邮件发送给最终用户运行以输出 MS Windows 和 MS Office 版本?

4

6 回答 6

18

获取当前 Windows 版本和 Microsoft Office 版本的一种可能方法是使用命令行查询系统注册表项。

要使用 System registry 获取 windows 版本,请使用以下命令:

reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion" /v "ProductName"

这将给出一个输出,可以对其进行解析以获取当前的 Windows 版本/名称。

要获取当前的 office 版本,请使用:

reg query "HKEY_CLASSES_ROOT\Word.Application\CurVer"

此命令的输出以数字格式(例如 14、15 等)给出 office 版本。

解析输出以获取版本号并与现有 Microsoft Office 版本列表匹配以获取已安装版本的名称:

Office 97   -  7.0
Office 98   -  8.0
Office 2000 -  9.0
Office XP   - 10.0
Office 2003 - 11.0
Office 2007 - 12.0
Office 2010 - 14.0 
Office 2013 - 15.0
Office 2016 - 16.0

希望这可以帮助!!

于 2013-09-16T05:09:11.600 回答
2
@echo off
setlocal enableDelayedExpansion
for /f "tokens=2 delims==" %%O in ('ftype ^|findstr /r /I "\\OFFICE[0-9]*" 2^>nul') do (
    set "verp=%%~O"
    goto :end_for
)
:end_for

for %%P in (%verp%) do (
    set "off_path=%%~dpP"
    for %%V in ("!off_path:~0,-1!") do (

     set "office_version=%%~nV"
     goto :end_for2
    )
)
:end_for2
echo %office_version%
endlocal

不需要管理员权限,适用于 Windows XP 及更高版本

于 2013-09-16T05:17:28.160 回答
1

要在 Windows 10 下获取 office 版本,这是相当优雅的:

for /F "tokens=3 delims=." %%O in ('reg query HKEY_CLASSES_ROOT\Word.Application\CurVer') do set _officeVer=%%O

不需要管理员权限,也适用于 xp 及更高版本

于 2018-05-22T13:01:57.403 回答
0

我用它来抓取版本 2003、2007、2010 和 2013。

@echo off
setlocal enabledelayedexpansion

for /f "tokens=3 delims=." %%a in ('reg query "HKEY_CLASSES_ROOT\Word.Application\CurVer"') do set reg=%%a

set /a i=0
for %%b in (11 12 14 15) do (
  if %%b == %reg% goto setver
  set /a i+=1
)

:setver
set /a n=0
for %%c in (2003 2007 2010 2013) do (
  if !n! == !i! set ver=%%c && goto endloop
  set /a n+=1
)

:endloop
echo Microsoft Version: %ver%
echo.
endlocal

:end
pause
于 2015-07-14T07:57:10.963 回答
0

我不是来检测 Windows 版本的,我觉得其他答案已经很好地涵盖了这一点,应该是一个单独的问题。但是,Office 是 IMO 的绝招。这是我检测 MS Office 版本和 Arch 的方法。

注意:这几乎没有在两个 x32 位不同的安装上进行测试,但“应该”全部捕获。

@ECHO OFF
CLS
setlocal enableextensions enabledelayedexpansion
::FreeSoftwareServers.com

set key="*0FF1CE*"
set threesixtyfivekey="O365*"
set keypath=

set arrsize=1
set arg[0]="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
set arg[1]="HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
for /l %%n in (0,1,%arrsize%) do (
 FOR /F "tokens=* USEBACKQ" %%N IN (`REG QUERY !arg[%%n]! /f %threesixtyfivekey% /k 2^>nul`) DO (
  ECHO "%%N" | FIND /I "HKEY">Nul && (
   If %%n == 0 (
    set arch=x32
   ) ELSE (
     set arch=x64
   )
   set keypath=%%N
   goto keypathFound
  ) 
 )
 FOR /F "tokens=* USEBACKQ" %%N IN (`REG QUERY !arg[%%n]! /f %key% /k 2^>nul`) DO (
  ECHO "%%N" | FIND /I "HKEY">Nul && ( 
   If %%n == 0 (
    set arch=x32
   ) ELSE (
     set arch=x64
   ) 
   set keypath=%%N
   goto keypathFound
  ) 
 )
)
GoTo end

:keypathFound
FOR /F "skip=2 tokens=1,2* USEBACKQ" %%N IN (`reg query "%keypath%" /t REG_SZ  /v "DisplayName"`) DO (
 IF /I "%%N" == "DisplayName" (
  SET OVer=%%P%~1
  GoTo Found
 )
)

:Found
for /f "tokens=1-20 delims=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$&*()-= " %%a in ("%OVer%") do (
   IF %%a == 64 (
     set ONum=%%b
     GoTo varset
   )
   IF %%a == 32 (
     set ONum=%%b
     GoTo varset
   )
   set ONum=%%a
)

:varset
  Echo Office Number: %ONum%
  ECHO Office Display Name:  %OVer%
  ECHO Software Architecture:  %arch%
  PAUSE
:End
于 2021-09-02T23:08:30.127 回答
0

还有 1 个使用 npocmaka 的代码,但添加了一个地图以使其更加用户友好:

@echo off
setlocal

call :GetOfficeVer
endlocal
exit /b

:GetOfficeVer
::@echo off
setlocal enableDelayedExpansion
for /f "tokens=2 delims==" %%O in (
    'ftype ^|findstr /r /I "\\OFFICE[0-9]*" 2^>nul') do (
        set "verp=%%~O"
        goto :end_for
)
:end_for

for %%P in (%verp%) do (
        set "off_path=%%~dpP"
        for %%V in ("!off_path:~-3,2!") do (
            set "off_ver=%%~nV"
            call :Map !off_ver! && exit /b
        )
)
:Map
set "v=%1"
set "map=11-2003;12-2007;14-2010;15-2013"
call set v=%%map:*%v%-=%%
set v=%v:;=&rem.%
echo Microsoft Office Version: %v%
endlocal
exit /b
于 2015-08-20T19:25:15.430 回答