1

如果我使用“gpresult /r /scope user”,我不需要针对不同 gpo 的特定规则,我可以查看哪些 GPO(安全组)处于活动状态。现在如何将其中一些活动 GPO 过滤到我的批处理文件中?这是我的 gpresult 结果的一部分:

De gebruiker is lid van de volgende beveiligingsgroepen
      Domain Users
      Iedereen
      SophosAdministrator
      SophosUser
      BUILTIN\Administrators
      Gebruikers
      INTERACTIEF
      AANMELDEN OP DE CONSOLE
      Geverifieerde gebruikers
      Deze organisatie
      LOKAAL
      Iedereen
      GS_08_cv's
      Tekenkamer
      GS_03_verslagen_openbaar
      GS_07_overeenkomsten
      GS_01_facturen
      GS_04_Functieprofielen
      GS_00_documenten
      AEC
      GS_02_functioneringsgesprekken
      GS_06_offertes
      GS_05_Arbeidsovereenkomsten
      GS_09_ aanbevelingsbrieven
      GS_03_verslagen_beperkt
      Systeembeheer
      Hoog verplicht niveau

我知道我可以使用 findstr 搜索特定名称(字符串?),

gpresult /r /scope user | findstr /L /i "SysteemBeheer" > nul 2>&1
REM *alternative* gpresult /r /scope user | FIND /i "SysteemBeheer" > nul 2>&1
IF %ERRORLEVEL% EQU 0 (ECHO Sys.Beheer) ELSE ECHO NO.sys.beheer

但是我怎样才能改变它以便读取多行呢?

(例如借用一些代码)

systeminfo | find "Microsoft Windows" > %TEMP%\osname.txt
FOR /F "usebackq delims=: tokens=2" %%i IN (%TEMP%\osname.txt) DO set vers=%%i

echo %vers% | find "Windows 7" > nul
if %ERRORLEVEL% == 0 goto ver_7

echo %vers% | find "Windows Server 2008" > nul
if %ERRORLEVEL% == 0 goto ver_2008

echo %vers% | find "Windows Vista" > nul
if %ERRORLEVEL% == 0 goto ver_vista

goto warnthenexit

我的意思是这确实搜索了多个变量,我希望一些人如何从 gpresult 函数中找到多个安全组(GPO)(或者可能是更好的方法?)

我希望它做这样的事情,如果 systeembeheer 存在 do blaat1 如果 aec 存在 do blaat2 如果 tekenkamer 存在 do blaat3 但是可以存在多个 GPO 所以如果上述之一确实存在,则脚本/搜索不能停止,它仍然需要查看其他人是否也存在。

***也许有点像这样?

@echo off
CLS
setlocal enabledelayedexpansion

for %%i in (systeembeheer tekenkamer aec) do (
    gpresult /r /scope user | findstr /L /i %%i
    if errorlevel 0 if not errorlevel 1 echo %%i ok process found !errorlevel!
    if errorlevel 1 if not errorlevel 2 echo %%i no process found !errorlevel!
)

:exit
pause

并稍微改变了它:

@ECHO OFF
CLS
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

for %%i in (SysteemBeheer Administratie PersoneelsZaken TeamPlan) do (
    gpresult /r /scope user | findstr /L /i %%i > nul 2>&1
    if errorlevel 0 if not errorlevel 1 Set "GPO_%%i=True"
    if errorlevel 1 if not errorlevel 2 Set "GPO_%%i=False"
REM if errorlevel 0 if not errorlevel 1 echo %%i ok process found !errorlevel! *debug lines*
REM if errorlevel 1 if not errorlevel 2 echo %%i no process found !errorlevel! *debug lines*
)

if "%GPO_systeemBeheer%" == "True" (Echo GPO_SysteemBeheer=%GPO_systeemBeheer%) else Echo GPO_SysteemBeheer Not Found!
if "%GPO_Administratie%" == "True" (Echo GPO_Administratie=%GPO_Administratie%) else Echo GPO_Administratie Not Found!
if "%GPO_PersoneelsZaken%" == "True" (Echo GPO_PersoneelsZaken=%GPO_PersoneelsZaken%) else Echo GPO_PersoneelsZaken Not Found!
if "%GPO_TeamPlan%" == "True" (Echo GPO_TeamPlan=%GPO_TeamPlan%) else Echo GPO_TeamPlan Not Found!

:exit
echo.
echo.
PAUSE

这似乎确实符合我的要求,但我不确定这是最好的方法还是正确的方法???

4

1 回答 1

0

我不知道我以前是怎么错过这个问题的——迟到比我希望的更好:-)

你的基本策略是合理的。您可以做一些事情来改进和/或简化。

GPRESULT 命令需要很长时间才能执行。我会将结果捕获到一个文件中,然后搜索该文件。那应该会提高性能。

定义“布尔”变量时,更容易取消为 FALSE 定义变量,并将值设置为任何值以表示 TRUE。(我倾向于使用值 1)。然后您可以简单地使用 IF DEFINED VARIABLE 来测试 TRUE 或 FALSE。一个主要优点是您可以在代码块中设置值并测试结果,而无需启用延迟扩展。IF DEFINED 语句的一个限制是它不容易支持名称中带有空格的变量(请参阅什么语法将检查是否定义了包含空格的变量名称?)。

您明确将 ERRORLEVEL 0 视为成功(已找到),将 ERRORLEVEL 1 视为失败(未找到)。我不知道可能返回的任何其他 ERRORLEVEL,而且您不必费心处理任何其他值,那么为什么不简单地将 ERRORLEVEL 0 视为成功并将任何其他值视为失败呢?

更好的是,您可以使用&&运算符在成功时||有条件地运行命令块,并在失败时有条件地运行命令块。

安全组的名称中可以包含空格。这样的名称会因您的代码而失败。最好使用 FINDSTR /C 选项来指定搜索字符串。如果字符串包含空格,则必须将其括在引号中。/C 选项默认将字符串视为文字,因此不需要 /L 选项。

所以这就是我将如何编写您的原始代码:

@echo off
setlocal
cls
set "file=%temp%\gpresult%random%.txt"
gpresult /r /scope user >"%file%"
for %%i in (SysteemBeheer Administratie PersoneelsZaken TeamPlan "Group with space") do (
  findstr /i /c:%%i "%file%" >nul 2>&1 && (
    echo Group %%i OK
  ) || (
    echo Group %%i Not Found
  )
)
del "%file%"
pause

如果您想设置和测试“布尔”变量,并且您知道名称永远不会包含空格,那么我将使用以下内容:

@echo off
setlocal
cls
set "file=%temp%\gpresult%random%.txt"
gpresult /r /scope user >"%file%"
for %%i in (SysteemBeheer Administratie PersoneelsZaken TeamPlan) do (
  set "GPO_%%i="
  findstr /i /l %%i "%file%" >nul 2>&1 && set "GPO_%%i=1"
)
del "%file%"

if defined GPO_systeemBeheer (Echo GPO_SysteemBeheer Found) else Echo GPO_SysteemBeheer Not Found!
if defined GPO_Administratie (Echo GPO_Administratie Found) else Echo GPO_Administratie Not Found!
if defined GPO_PersoneelsZaken (Echo GPO_PersoneelsZaken Found) else Echo GPO_PersoneelsZaken Not Found!
if defined GPO_TeamPlan (Echo GPO_TeamPlan Found) else Echo GPO_TeamPlan Not Found!
pause

如果组名可以包含空格,那么我会将 IF 测试还原为更像您的第二组代码的东西。如果您使用 TRUE 和 FALSE 值而不是 undefined 和 1,那么您可以去掉 IF 语句中的封闭引号。

@echo off
setlocal
cls
set "file=%temp%\gpresult%random%.txt"
gpresult /r /scope user >"%file%"
for %%i in (SysteemBeheer Administratie PersoneelsZaken TeamPlan "Group with spaces") do (
  set "GPO_%%i="
  findstr /i /c:%%i "%file%" >nul 2>&1 && set "GPO_%%i=1"
)
del "%file%"

if "%GPO_systeemBeheer%"=="1" (Echo GPO_SysteemBeheer Found) else Echo GPO_SysteemBeheer Not Found!
if "%GPO_Administratie%"=="1" (Echo GPO_Administratie Found) else Echo GPO_Administratie Not Found!
if "%GPO_PersoneelsZaken%"=="1" (Echo GPO_PersoneelsZaken Found) else Echo GPO_PersoneelsZaken Not Found!
if "%GPO_TeamPlan%"=="1" (Echo GPO_TeamPlan Found) else Echo GPO_TeamPlan Not Found!
if "%GPO_Group with spaces%"=="1" (Echo GPO_Group with spaces Found) else Echo GPO_Group with spaces Not Found!
pause
于 2012-08-26T23:14:20.093 回答