:: Save or rename this file extension as ICE-NSM.cmd and customise its top settings :: :: Parameters: [optional Bind Password, skip for Anonymous LDAP] :: :: About: Outputs some CSV format reports aimed at Novell Storage Manager admins :: * The Target Path applied to a container OU, etc. 2.5x only :: * A list of unique Target Paths. 2.5x only (assumes unique Volume Object names) :: * A list of Novell Volumes :: * A list of any users in your Tree without Home Directories :: * A list of any users in your Tree having the temporary Proxy Home Path :: * A sample LDIF File (under some circumstances) :: :: Early ICE.EXE - Faster but which value returns from multi-valued attributes is undefined :: Later ICE.EXE - See eDir for Windows installer under "[Folder]\nt\I386\NDSonNT\ndsnt\nds" :: :: v1.1. By Mark Fairpo. Released by Hull College under Creative Commons CC-By-SA License :: @echo off :: ---- Required Customisation ---- set ICE=C:\Novell\consoleone\1.2\bin\ICE.exe set SERVER=LDAP1.mydomain.net set BIND_DN=cn=User,o=Org :: ---- Optional Customisation To Uncomment ---- :: set SSL_DER=\\%SERVER%\SYS\PUBLIC\RootCert.der :: set BASE_DN=ou=NSMPolicies,o=Org :: set VOL_CUSTOM=cccKanakaAFPVolumeName set PROXY_DIR=PROXYHOM set EXT=.csv set @POLICY=%~sn0-Policy set @VOLS=%~sn0-Vols set @TARGETS=%~sn0-Targets set @NOHOME=%~sn0-NoHome set @PROXY=%~sn0-ProxyHome set @LDIF=%@PROXY%.ldf set @VBS=Replace.vbs set @DUMP=%TEMP%\iceout.tmp set @FILTER=%TEMP%\filter.tmp set BIND_DN=-d "%BIND_DN%" -w "%~1" if "%1"=="" set BIND_DN= if "%TZ%"=="" set TZ=GMT if not "%SSL_DER%"=="" set SSL_DER=-p 636 -L "%SSL_DER%" if not "%BASE_DN%"=="" set BASE_DN=-b "%BASE_DN%" if not "%VOL_CUSTOM%"=="" set VOL_CUSTOM=,%VOL_CUSTOM% echo Working Directory: "%CD%" for %%I in (%@DUMP%,%@POLICY%%EXT%,%@PROXY%_1%EXT%,%@NOHOME%_1%EXT%,%@LDIF%) do if exist %%I del %%I echo Writing: %@VBS% >%@FILTER% FIND.EXE ":::" <"%~f0" >%@VBS% FIND.EXE /V "FIND.EXE" <%@FILTER% set ATTRIB=cn,cccFSFactoryUserQuota,cccFSFactoryAppliedContainers,cccFSFactoryUserPath echo Export Attributes: %ATTRIB% "%ICE%" -o -S LDAP -s %SERVER% %SSL_DER% %BIND_DN% -F "objectClass=cccFSFactoryPolicy" %BASE_DN% -D DELIM -f %@DUMP% -t %ATTRIB% if not exist %@DUMP% ( if exist ice.log start ice.log goto QUIT ) echo Writing: %@POLICY%%EXT% for /F "tokens=2 delims=," %%I in ("%ATTRIB%") do FIND.EXE ",%%I" %@DUMP% >NUL if errorlevel 1 echo %ATTRIB%,Path>%@POLICY%%EXT% >>%@POLICY%%EXT% SORT.EXE %@DUMP% >NUL CScript.EXE %@VBS% "#\d#" "`,`" %@POLICY%%EXT% :: start %@POLICY%%EXT% set ATTRIB=cccFSFactoryUserPath echo Export Attributes: %ATTRIB% "%ICE%" -o -S LDAP -s %SERVER% %SSL_DER% %BIND_DN% -F "objectClass=cccFSFactoryPolicy" %BASE_DN% -D DELIM -f %@DUMP% -t %ATTRIB% echo Writing: %@TARGETS%%EXT% FIND.EXE /V "%ATTRIB%" <%@DUMP% >%@TARGETS%%EXT% :: Target Paths are prefixed "\" except to a Volume root, which has a blank Path element >NUL CScript.EXE %@VBS% "#\d#" "`,`" %@TARGETS%%EXT% >NUL CScript.EXE %@VBS% "`cn=" "" %@TARGETS%%EXT% >NUL CScript.EXE %@VBS% ",ou?=.*`," "," %@TARGETS%%EXT% set ATTRIB=cn,hostServer,hostResourceName%VOL_CUSTOM% echo Export Attributes: %ATTRIB% "%ICE%" -o -S LDAP -s %SERVER% %SSL_DER% %BIND_DN% -F "objectClass=volume" -D DELIM -f %@DUMP% -t %ATTRIB% echo Writing: %@VOLS%%EXT% for /F "tokens=2 delims=," %%I in ("%ATTRIB%") do FIND.EXE /V ",%%I" <%@DUMP% >%@FILTER% >NUL CScript.EXE %@VBS% ",`cn=" "," %@FILTER% >NUL CScript.EXE %@VBS% ",ou?=.*`," "\" %@FILTER% >NUL CScript.EXE %@VBS% "" "," %@FILTER% >%@VOLS%%EXT% ECHO Object,Map%VOL_CUSTOM% >>%@VOLS%%EXT% SORT.EXE %@FILTER% echo Wait: Resolve %@TARGETS%%EXT% from %@VOLS%%EXT% >%@DUMP% type NUL for /F "delims=" %%V in (%@TARGETS%%EXT%) do call :LINK %%V echo Wait: Remove duplicates from %@TARGETS%%EXT% >%@TARGETS%%EXT% SORT.EXE %@DUMP% >%@DUMP% echo Path for /F "delims=*" %%V in (%@TARGETS%%EXT%) do call :UNIQUE %%V copy /Y %@DUMP% %@TARGETS%%EXT% :: ndsHomeDirectory filter expects "Volume_Object_DN#Namespace_Type#Path" so dump all Users instead :: eDirectory's User class maps to object class inetOrgPerson in the default LDAP schema set ATTRIB=dn,ndsHomeDirectory echo Export Attributes: %ATTRIB% "%ICE%" -o -S LDAP -s %SERVER% %SSL_DER% %BIND_DN% -F "objectClass=User" -D DELIM -f %@DUMP% -t %ATTRIB% for %%I in (%@PROXY%,%@NOHOME%) do if exist %%I%EXT% ren %%I%EXT% %%I_1%EXT% echo Writing: %@NOHOME%%EXT% for /F "tokens=2 delims=," %%I in ("%ATTRIB%") do FIND.EXE ",%%I" %@DUMP% >NUL if errorlevel 1 echo %ATTRIB%,Path>%@NOHOME%%EXT% >>%@NOHOME%%EXT% FIND.EXE /V "#" <%@DUMP% echo Writing: %@PROXY%%EXT% >%@FILTER% FIND.EXE /I "%PROXY_DIR%" <%@DUMP% set EL=%ERRORLEVEL% >%@PROXY%%EXT% echo %ATTRIB%,Path,Comments >>%@PROXY%%EXT% SORT.EXE %@FILTER% if "%EL%"=="1" goto TIDY >NUL CScript.EXE %@VBS% "#\d#" "`,`" %@PROXY%%EXT% >>%@PROXY%%EXT% echo. >>%@PROXY%%EXT% echo ,,,* For any user without an NSM Event blank their Home Directory prior to Backfill. >>%@PROXY%%EXT% echo ,,,* Try to run this report outside of your allowed Data Move Schedule. >>%@PROXY%%EXT% echo ,,,* If the %PROXY_DIR% folder gets deleted (moved) then reload NSMENGIN to recreate. echo Writing: %@LDIF% >%@LDIF% echo version: 1 >>%@LDIF% echo # Prune entries having NSM Pending Events before importing this LDIF File >>%@LDIF% echo # via ConsoleOne's NDS Import Wizard, etc. See also %@PROXY%%EXT% for /F "delims=" %%V in (%@FILTER%) do call :ADD %%V :TIDY for %%I in (ice.log,icedelim.tmp) do if exist %%I del %%I goto QUIT :: To format a DOS environment variable from NetWare to UNC syntax use "\\%NETWARE::=%" :LINK if "%1"=="" goto :EOF >%@FILTER% FIND.EXE /I "%1," <%@VOLS%%EXT% if not errorlevel 1 for /F "tokens=2 delims=," %%V in (%@FILTER%) do echo "%%V:%~2">>%@DUMP% shift shift goto LINK :: Quotes to handle lines containing DOS conditional processing symbols (Ampersand) :UNIQUE if not defined prev_rec goto WRITE if "%~1"==%prev_rec% goto :EOF :WRITE >>%@DUMP% echo "%~1" set prev_rec="%~1" goto :EOF :ADD echo Adding User: %~1 >>%@LDIF% echo. >>%@LDIF% echo dn: %~1 >>%@LDIF% echo changetype: modify >>%@LDIF% echo delete: ndsHomeDirectory goto :EOF :QUIT set BIND_DN= ::: ' Regular Expressions in VBScript - http://msdn.microsoft.com/en-us/library/ms974570.aspx ::: Const ForReading = 1, ForWriting = 2 ::: Set objFSO = CreateObject("Scripting.FileSystemObject") ::: With WScript.Arguments ::: If .Unnamed.Count <> 3 Then ::: WScript.Echo "Syntax: [CScript] " & WScript.ScriptName & " [/I] ""find_RegEx"" ""replace_string"" [path]filename" ::: ElseIf Not objFSO.FileExists(.Unnamed(2)) Then ::: WScript.Echo "File not found - " & .Unnamed(2) ::: Else ::: On Error Resume Next ::: Set objFile = objFSO.OpenTextFile(.Unnamed(2), ForReading) ::: If Err Then CustomError "Read" ::: strText = objFile.ReadAll ::: If Err Then CustomError "Reading" ::: objFile.Close ::: Set regEx = New RegExp ::: regEx.Pattern = Replace(.Unnamed(0), "`", """") ::: regEx.IgnoreCase = .Named.Exists("I") ::: regEx.Global = True ::: strText = regEx.Replace(strText, Replace(Replace(.Unnamed(1), "`", """"), "\n", vbCrLf)) ::: If Err Then CustomError "RegExp" ::: Set objFile = objFSO.OpenTextFile(.Unnamed(2), ForWriting) ::: If Err Then CustomError "Write" ::: objFile.Write strText ::: If Err Then CustomError "Writing" ::: objFile.Close ::: If Err Then CustomError "Write" ::: End If ::: End With ::: Sub CustomError(strType) ::: WScript.Echo strType & " Error: " & Err.Description ::: WScript.Quit 1 ::: End Sub