Batch file 在GPO中禁用注册表编辑工具时使用注册表查询?MS Office版本查找

Batch file 在GPO中禁用注册表编辑工具时使用注册表查询?MS Office版本查找,batch-file,ms-office,gpo,Batch File,Ms Office,Gpo,大家好 因此,我编写了一个简单的.bat文件,我打算在用户启动时调用它来获取MS Office版本。对管理员来说测试很好,但不幸的是,对标准用户来说并非如此。我怀疑这是因为我们有: 阻止访问注册表编辑工具 GPO中的设置,尽管禁用regedit以运行silenty设置为“否” 因此,我的问题是a)这可能是我的脚本无法工作的原因,b)如果是,是否有regedit替代方案。试着保持它的简洁 代码如下: @echo off reg query HKEY_CLASSES_ROOT\Access.App

大家好

因此,我编写了一个简单的.bat文件,我打算在用户启动时调用它来获取MS Office版本。对管理员来说测试很好,但不幸的是,对标准用户来说并非如此。我怀疑这是因为我们有: 阻止访问注册表编辑工具 GPO中的设置,尽管禁用regedit以运行silenty设置为“否”

因此,我的问题是a)这可能是我的脚本无法工作的原因,b)如果是,是否有regedit替代方案。试着保持它的简洁

代码如下:

@echo off

reg query HKEY_CLASSES_ROOT\Access.Application\CurVer
if errorlevel 1 goto five

for /f "tokens=3" %%i in ('reg query HKEY_CLASSES_ROOT\Access.Application\CurVer') do (
  if %%i equ Access.Application.15 goto one
  if %%i equ Access.Application.14 goto two
  if %%i equ Access.Application.12 goto three
  if %%i equ Access.Application.11 goto four
  goto five
)

:one REM 2013 Pro
echo %computername%,Office 2013 Pro" >>\\SERVERNAME\bslogs$\officeVersions.csv
exit
:two REM 2010 Pro
echo %computername%,Office 2010 Pro >>\\SERVERNAME\bslogs$\officeVersions.csv
exit
:three REM 2007 Pro
echo %computername%,Office 2007 Pro" >>\\SERVERNAME\bslogs$\officeVersions.csv
exit
:four REM 2003 Pro
echo %computername%,Office 2003 Pro" >>\\SERVERNAME\bslogs$\officeVersions.csv
exit

:five REM Not Pro Verion
reg query HKEY_CLASSES_ROOT\Word.Application\CurVer
if errorlevel 1 goto ten

for /f "tokens=3" %%i in ('reg query HKEY_CLASSES_ROOT\Word.Application\CurVer') do (
  if %%i equ Word.Application.15 goto six
  if %%i equ Word.Application.14 goto seven
  if %%i equ Word.Application.12 goto eight
  if %%i equ Word.Application.11 goto nine
  goto ten
)

:six REM 2013 STD
echo %computername%,Office 2013 Std" >>\\SERVERNAME\bslogs$\officeVersions.csv
exit
:seven REM 2010 STD
echo %computername%,Office 2010 Std" >>\\SERVERNAME\bslogs$\officeVersions.csv
exit
:eight REM 2007 STD
echo %computername%,Office 2007 Std" >>\\SERVERNAME\bslogs$\officeVersions.csv
exit
:nine REM 2003 STD
echo %computername%,Office 2003 Std" >>\\SERVERNAME\bslogs$\officeVersions.csv
exit

:ten REM no idea
echo %computername%,????" >>\\SERVERNAME\bslogs$\officeVersions.csv exit
非常感谢,, 马丁

a) 这就是我的脚本不起作用的可能原因吗

我不知道。听起来似乎有道理

b) 如果是,是否有regedit替代方案

您可以使用WMI和查询注册表值

试着保持它的简洁

对不起。这既不好也不简单

过去,我不得不使用WMI查询模拟
reg.exe
来查询远程注册表。我拼凑了一个
:getRegValue
函数,它可以自动完成大部分工作。运行这个程序,看看它是否符合您的想法

@echo关闭
setlocal
调用:getRegValue访问器HKCR\Access.Application\CurVer\
回显结果:%accessVer%
调用:getRegValue shell“HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\shell”
回显结果:%shell%
后藤:EOF
:getRegValue
延迟扩展
rem//常数
设置“配置单元[HKCR]=&H8000000”
设置“配置单元[HKCU]=&H80000001”
设置“配置单元[HKLM]=&H8000002”
设置“蜂巢[HKU]=&H8000003”
设置“配置单元[HKCC]=&H8000005”
设置“类型[1]=GetStringValue”
设置“类型[2]=GetExpandedStringValue”
设置“类型[3]=GetBinaryValue”
设置“类型[4]=GetDWORDValue”
设置“类型[7]=GetMultiStringValue”
设置“类型[11]=GetQWORDValue”
设置“wmic=wmic/namespace:\\root\default class stdregprov call”
rem//2分裂成蜂巢、路径、叶
设置“regpath=%~2”
如果“%regpath:~-1%”=“\”设置“regpath=%regpath%(默认值)”
设置配置单元=%regpath:\=&rem;%
设置“regpath=!regpath:%hive%\=!”
设置“叶=%regpath%”
:叶
设置“叶=%leaf:\=%”
如果不是“%leaf%”==“%leaf:\=%”转到leaf
设置“regpath=!regpath:\%leaf%=!”
设置“配置单元=!配置单元[%hive%]!”
rem//获取叶的数据类型(默认值:字符串)
设置“方法=%type[1]”
对于%%I in(名称类型nameidx),请设置“%%I=”
2> 努尔(
对于/f“tokens=2 delims={}”%%I in(
“%wmic%EnumValues hDefKey^=“%hive%”sSubkeyName^=“%regpath:\=\\%”^
^|查找“={”
)做(
如果未定义名称(设置“名称=%%I”),则设置“类型=%%I”
)
)
如果定义了名称(
对于(名称类型)中的%%n,请执行以下操作(
设置idx=0
对于%%I英寸(!%%n!),请执行以下操作(
如果定义了nameidx(
if!idx!eq!nameidx!set“method=!type[%%~I]!”
)否则,如果/i“%%~i”==%leaf%”(
设置“nameidx=!idx!”
)
设置/a idx+=1
)
)
)
如果/i“%leaf%”==(默认)“设置”leaf=“
rem//获取叶的数据值
2> 努尔(
对于/f“delims=”%%I in(
“%wmic%%方法%hDefKey^=“%hive%”sSubkeyName^=“%regpath:\=\\%”^
sValueName^=“%leaf%”^ | findstr“[su]值”
)做(
对于%%#in(%%I),请设置“ret=%%~#”
)
)
endlocal&设置“%~1=%ret%”和转到:EOF
作为另一个值得思考的问题,
wmic.exe
支持以下语法的远程查询:

wmic/node:remotePC/user:domain\remoteAdmin/password:password动词。。。
您可以使用远程开关批量查询所有计算机,而不是让每个用户在登录时运行脚本


一部分是作为学术练习,另一部分是为了阻止任何人认为“你应该使用PowerShell”,我重写了
:getRegValue
函数以调用PowerShell混合代码。不幸的是,通过WMI与PowerShell查询注册表仍然很复杂。虽然字符串操作和对象检索更容易,但稍微经济一些的代码并不能完全证明增加的执行时间是合理的


$hiveConst=@{
“香港华润”=2147483648
“香港大学”=2147483649
“HKLM”=2147483650
“香港大学”=2147483651
“香港文化中心”=2147483653
}
# http://www.vistax64.com/powershell/10160-powershell-remote-registry-access-via-wmi.html
$reg=gwmi-List-Namespace root\default |?{$\u.Name-eq“StdRegProv”}
#将$env:regpath拆分为$hive、$regpath、$leaf
$regpath=$env:regpath-split“\\”
$hive=$hiveConst[$regpath[0]]
$leaf=$regpath[$regpath.length-1]
如果($leaf){
$regpath=$regpath[1..($regpath.length-2)]-连接“\”
}否则{
$regpath=$regpath[1..($regpath.length-1)]-连接“\”
}
如果($leaf-match“^\(默认值\)$”{$leaf=”“}
#获取叶的数据类型(默认值:字符串)
$method=1
$res=$reg.EnumValues($hive,$regpath)
对于($i=0;$i-lt$res.sNames.length;$i++){
如果($res.sNames[$i]-eq$leaf){
$method=$res.Types[$i]
}
}
#获取叶的数据值
开关($方法){
1{$reg.GetStringValue($hive,$regpath,$leaf).s值;break}
2{$reg.GetExpandedStringValue($hive,$regpath,$leaf).sValue;break}
3{$reg.GetBinaryValue($hive,$regpath,$leaf).uvvalue;break}
4{$reg.GetDWORDValue($hive,$regpath,$leaf).uvvalue;break}
7{$reg.GetMultiStringValue($hive,$regpath,$leaf).svvalue;break}
11{$reg.GetQWORDValue($hive,$regpath,$leaf).uvvalue;break}
}

只是因为我觉得这是一个挑战,所以这次我决定尝试使用JScript混合代码的第三个版本。信不信由你,这是三种方法中速度最快的

@如果(@code节==@Batch)@那么
@echo off和setlocal
调用:getRegValue访问器HKCR\Access.Application\CurVer\
回显结果:%accessVer%
调用:getRegValue shell“HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\shell”
回显结果:%shell%
后藤:EOF
:getRegValue
对于/f“delims=“%%I in('cscript/nologo/e:JScript“%~f0”“%~2“),请设置“%~1=%%~I”
后藤:EOF
@结束//结束批处理/开始JScript混合代码
功能注册(标准方法,objP