2012-06-14 29 views
0

如果我使用:「gpresult/r/scope user」,我將看到哪些GPO(安全組)處於活動狀態,因此我不想爲不同gpo的某些特定規則。現在我怎麼能過濾一些這些活動的GPO到我的批處理文件? 這是從我Gpresult的結果的一部分:在gpresult中找到gpo(for/find/findstr)

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的CAN存在,所以如果上述1確實存在的腳本/搜索絕不僅於此,它還是有看,如果別人之一也同樣存在。

***也許更像這樣?

@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 

這似乎做我想做什麼,BU我不知道這是否是最好的辦法還是做的正確方法? ??

+0

有誰知道最後一段腳本是否是最好的方式嗎?或者是否有更好/更有效的方式? – APOC

+0

這是完成和/或唯一的方法嗎? – APOC

回答

0

我不知道我怎麼錯過了之前這個問題 - 亡羊補牢從來就不是我希望:-)

你的基本策略是合理的。有幾件事情可以改進和/或簡化。

GPRESULT命令需要很長時間才能執行。我會在文件中捕獲結果一次,然後搜索文件。這應該會提高性能。

定義「布爾」變量時,更容易取消定義FALSE變量,並將該值設置爲任何值以表示TRUE。 (我傾向於使用值1)。然後,您可以簡單地使用IF DEFINED VARIABLE來測試TRUE或FALSE。一個主要優勢是您可以設置該值並在一段代碼內測試結果,而無需啓用延遲擴展。 IF DEFINED語句的一個限制是它不容易支持名稱中帶空格的變量(請參閱What syntax will check if a variable name containing spaces is 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,那麼你可以去掉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