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が存在する場合は blaat1を実行し、 aec が存在する場合は blaat2を実行し、 tekenkamer が存在する場合は 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 コマンドの実行にはかなりの時間がかかります。結果をファイルに一度キャプチャしてから、ファイルを検索します。これにより、パフォーマンスが向上するはずです。

「boolean」変数を定義する場合、FALSE の変数を定義解除し、値を TRUE を表す任意の値に設定する方が簡単です。(私は値 1 を使用する傾向があります)。次に、単純に IF DEFINED VARIABLE を使用して、TRUE または FALSE をテストできます。主な利点の 1 つは、遅延展開を有効にすることなく、コード ブロック内で値を設定して結果をテストできることです。IF DEFINED ステートメントの 1 つの制限は、名前にスペースを含む変数を簡単にサポートできないことです (スペースを含む変数名が定義されているかどうかを確認する構文は何ですか? を参照してください)。

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 テストをコードの 2 番目のセットのようなものに戻します。undefined と 1 の代わりに TRUE と FALSE の値を使用すると、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 に答える