早上好。我编写了一个批处理文件,通过audit.csv 文件更新组策略。之前我通过
auditpol
更改了政策,但这些更改并没有持续存在,所以我想出了这个解决方案。
:: Write the correct audit settings to audit.csv
set "auditFile="C:\Windows\System32\GroupPolicy\Machine\Microsoft\Windows NT\Audit\audit.csv""
echo Machine Name,Policy Target,Subcategory,Subcategory GUID,Inclusion Setting,Exclusion Setting,Setting Value > %auditFile%
echo ,System,Audit Credential Validation,{0cce923f-69ae-11d9-bed3-505054503030},Success and Failure,,3 >> %auditFile%
…
它还做了一些其他的事情,但这就是我收到错误的地方。
昨天,像常规批处理脚本文件一样运行它,效果很好。现在我收到
The system cannot find the path specified.
错误。我看过一些有同样问题的帖子,解决方案是运行 cmd /c file.bat
,它现在对我不起作用。创建帖子时,我没想到运行批处理文件会出现此问题。当我昨天测试时,批处理文件工作正常,但是当我转换为 exe(使用 PowerArchiver 和 iexpress)时,我收到了错误。所以我不知道为什么它在 .bat 版本中不起作用,但我想如果我可以解决这个问题,它应该可以修复转换后的 exe。
我的主要问题是为什么我会收到该错误?是因为 echo 命令吗?是否由于我尝试访问的文件而导致错误?是权限问题吗?
使用
Windows 文件资源管理器双击批处理文件时,批处理文件由存储在
cmd.exe
中的 64 位 %SystemRoot%\System32
执行。在这种情况下,目录 %SystemRoot%\System32\GroupPolicy\Machine\Microsoft\Windows NT\Audit
最有可能存在(不在我的 Windows 计算机上)。
但是将批处理文件打包到 32 位可执行文件中,该文件在执行时将其提取到
%TEMP%
或在 %TEMP%
中临时创建的子目录,然后运行 Windows 命令处理器来执行临时提取的批处理文件,32- cmd.exe
中存储的位%SystemRoot%\SysWOW64
由于Windows文件系统重定向器而被执行。
x86 应用程序执行环境中活动的文件系统重定向器将对文件
%SystemRoot%\System32\GroupPolicy\Machine\Microsoft\Windows NT\Audit\audit.csv
的写入访问重定向到 %SystemRoot%\SysWOW64\GroupPolicy\Machine\Microsoft\Windows NT\Audit\audit.csv
,并且在这种情况下,文件 audit.csv
的整个目录树很可能不存在。
解决方案是使用此代码:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Define Windows system folder path and make sure the right path is used
rem if this batch file is executed on 64-bit Windows in 32-bit environment.
set "SystemFolder=%SystemRoot%\System32"
if not "%ProgramFiles(x86)%" == "" if exist %SystemRoot%\Sysnative\cmd.exe set "SystemFolder=%SystemRoot%\Sysnative"
set "AuditFilePath=%SystemFolder%\GroupPolicy\Machine\Microsoft\Windows NT\Audit"
rem Create the directory with suppressing the error message on missing
rem permissions to create this directory or on directory existing already.
md "%AuditFilePath%" 2>nul
if not exist "%AuditFilePath%\" (
echo ERROR: Failed to creeate the directory:
echo %SystemRoot%\System32\GroupPolicy\Machine\Microsoft\Windows NT\Audit
echo The batch file "%~nx0" must be run as administrator.
goto EndBatch
)
rem Write the correct audit settings to file audit.csv.
set "FullAuditFileName=%AuditFilePath%\audit.csv"
(
echo Machine Name,Policy Target,Subcategory,Subcategory GUID,Inclusion Setting,Exclusion Setting,Setting Value
echo ,System,Audit Credential Validation,{0cce923f-69ae-11d9-bed3-505054503030},Success and Failure,,3
) >"%FullAuditFileName%"
rem More commands to execute.
:EndBatch
endlocal
此批处理文件还会创建文件
audit.csv
,其中包含两个 CSV 行,且两行末尾均没有尾随空格。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
call /?
... 解释 %~nx0
... 批处理文件的名称+扩展名echo /?
endlocal /?
goto /?
if /?
md /?
rem /?
set /?
setlocal /?
另请参阅: