====== Quick Inventory ======
===== Les fichiers =====
@echo off
REM variables definition (can be edited)
set QI_MAX_THREAD=8
set QI_BASE_DIR=D:\Quick_Inventory
REM variables definition
set QI_CPT=0
set QI_CPT_OFF=0
set QI_CPT_ON=0
set QI_CPT_TIMEOUT=0
set QI_CPT_ONLINE=0
set QI_THREAD_NBR=1
set /a QI_THREAD_HIGHER=%QI_MAX_THREAD%-1
set QI_CACHE=%QI_BASE_DIR%\cache
set QI_BIN=%QI_BASE_DIR%\bin
REM delete cache folder if requested
if "%1"=="--delete-cache" rmdir /s /q %QI_CACHE%
REM create working directory
if not exist %QI_CACHE%\. mkdir %QI_CACHE%
if not exist %QI_BIN%\. mkdir %QI_BIN%
REM clean cache
del /q %QI_CACHE%\*.ping >nul 2>&1
del /q %QI_CACHE%\*.list >nul 2>&1
del /q %QI_CACHE%\*.tmp >nul 2>&1
del /q %QI_CACHE%\workstations.* >nul 2>&1
for /f "tokens=3,4" %%T IN ('dir /-c %QI_CACHE%\*.details') DO (
if "%%T"=="0" del /q %QI_CACHE%\%%U >nul 2>&1
)
SETLOCAL ENABLEDELAYEDEXPANSION
REM find the number of workstations, split workstations into multiple lists
for /f "skip=1" %%L IN (list.csv) DO (
set /a QI_CPT+=1
set /a QI_THREAD_NBR=!QI_CPT! %% %QI_MAX_THREAD%
echo %%L>> %QI_CACHE%\ping.thread!QI_THREAD_NBR!.list
)
echo %QI_CPT% workstations found
echo ---
REM ping all workstations
echo ping all workstations
for /l %%D IN (0,1,%QI_THREAD_HIGHER%) DO start %QI_BIN%\ping.thread.cmd %%D
REM wait for ping end
echo wait for %QI_MAX_THREAD% term signals ('waitfor /si thread' to trigger manually)
for /l %%E IN (0,1,%QI_THREAD_HIGHER%) DO waitfor thread
echo all signals received
echo ---
REM list offline workstations
for /f %%C IN ('findstr /c:"(100%% loss)" /c:"Destination host unreachable" /c:"could not find host" /M %QI_CACHE%\*.ping') DO echo %%~nC>> %QI_CACHE%\workstations.offline
REM find the number of online/offline workstations
for /f %%L IN (%QI_CACHE%\workstations.offline) DO set /a QI_CPT_OFF+=1
set /a QI_CPT_ON=%QI_CPT%-%QI_CPT_OFF%
REM list online workstations
for /f "skip=1" %%G IN (list.csv) DO (
for /f "tokens=1 delims=" %%H IN ('findstr /x %%G %QI_CACHE%\workstations.offline') DO set var=%%H
if not "!var!"=="%%G" echo %%G>> %QI_CACHE%\workstations.online
)
REM split online workstations into multiple lists
for /f %%L IN (%QI_CACHE%\workstations.online) DO (
if not exist %QI_CACHE%\%%L.details (
set /a QI_CPT_ONLINE+=1
set /a QI_THREAD_NBR=!QI_CPT_ONLINE! %% %QI_MAX_THREAD%
set workstation=%%L
set machine_type=!workstation:~5,3!
for %%R IN (wdx WDX wlx WLX) DO (
if "!machine_type!"=="%%R" echo %%L>> %QI_CACHE%\details.thread!QI_THREAD_NBR!.list
)
)
)
echo %QI_CPT_ON% online / %QI_CPT_OFF% offline
echo %QI_CPT_ON%> %QI_CACHE%\online_count.tmp
echo %QI_CPT_OFF%> %QI_CACHE%\offline_count.tmp
echo ---
REM get details from online workstations
echo get details from online workstations
for /l %%D IN (0,1,%QI_THREAD_HIGHER%) DO start %QI_BIN%\details.thread.cmd %%D
REM wait for details end
echo wait for %QI_MAX_THREAD% term signals ('waitfor /si thread' to trigger manually)
for /l %%E IN (0,1,%QI_THREAD_HIGHER%) DO waitfor thread
echo all signals received
echo ---
REM clean cache from empty details
for /f "tokens=3,4" %%T IN ('dir /-c %QI_CACHE%\*.details') DO (
if "%%T"=="0" del /q %QI_CACHE%\%%U >nul 2>&1
)
REM building html result
echo building html result
call %QI_BIN%\html_generator.bat
start firefox "%QI_BASE_DIR%\qi.html"
ENDLOCAL
:eof
Hostname
workstation1
workstation2
@echo off
for /f %%A IN (%QI_CACHE%\ping.thread%1.list) DO call:knock %%A
waitfor /si thread
exit
:knock
echo %1
ping -n 2 -w 5000 %1 > %QI_CACHE%\%1.ping
:eof
@echo off
for /f %%K IN (%QI_CACHE%\details.thread%1.list) DO (
systeminfo /s \\%%K> %QI_CACHE%\%%K.details.tmp
findstr /v /r "KB[0-9][0-9]*$" %QI_CACHE%\%%K.details.tmp> %QI_CACHE%\%%K.details.1.tmp
findstr /v /c:"OS Manufacturer" /c:"OS Configuration" /c:"OS Build Type" /c:"Virtual Memory" %QI_CACHE%\%%K.details.1.tmp> %QI_CACHE%\%%K.details.2.tmp
findstr /v /l "Registered Directory Locale" %QI_CACHE%\%%K.details.2.tmp> %QI_CACHE%\%%K.details
del /q %QI_CACHE%\%%K.details.*.tmp
)
waitfor /si thread
exit
:eof
@echo off
REM version 1
:: ----------------------------------------------------------------------------
:: Usage: inventory.cmd
:: ----------------------------------------------------------------------------
:: Description: It creates a batch file filled with WMIC commands and calls it.
:: The results located in %path_local% folder are compute. Temporary files
:: are deleted.
:: ----------------------------------------------------------------------------
:: -- User customizable variables ---------------------------------------------
:: dns_tld : top level domain (.co.uk -> uk)
:: ----------------------------------------------------------------------------
set path_local=..\cache
set dns_tld=local
:: -- Other variables ---------------------------------------------------------
if "%1"=="" goto syntax
REM extract codes from workstation name
set workstation=%1
set country=%workstation:~0,2%
set site=%workstation:~2,3%
set machine_type=%workstation:~5,3%
set batch_file=%path_local%\%workstation%.cmd
REM machine_type=WLX or WDX
set verif_type=
if "%machine_type%"=="vmw" set machine_type=WDX
if "%machine_type%"=="VMW" set machine_type=WDX
for %%A IN (wdx WDX wlx WLX wlt WLT) DO if "%machine_type%"=="%%A" set verif_type=TRUE
if not "%verif_type%"=="TRUE" (
echo machine_type %machine_type% not supported.
goto fin
)
:inventaire
REM Create the batch file to run with admin rights
echo @echo off> %batch_file%
echo echo inventory of %workstation% in progress...>> %batch_file%
echo set OU7=>> %batch_file%
echo wmic /NODE:%workstation% os get Name^> %path_local%\%workstation%.os.tmp>> %batch_file%
echo type %path_local%\%workstation%.os.tmp ^| findstr /i /c:"Windows 7" ^>nul>> %batch_file%
echo if #%%ERRORLEVEL%%==#0 set OU7=7 >> %batch_file%
echo call:trim OU7 "%%OU7%%">> %batch_file%
echo REM request for dsget command>> %batch_file%
echo set request="CN=%workstation%,OU=%machine_type%%%OU7%%,OU=%site%,DC=%country%,DC=%dns_tld%">> %batch_file%
echo dsget computer %%request%% -desc^> %path_local%\%workstation%.ad-user.tmp>> %batch_file%
echo REM user_login>> %batch_file%
echo wmic /NODE:%workstation% computersystem get UserName ^> %path_local%\%workstation%.username.tmp>> %batch_file%
echo for /f "skip=1 delims=" %%%%A in ('type %path_local%\%workstation%.username.tmp') do (>> %batch_file%
echo for /f "tokens=1,2 delims=\" %%%%B in ("%%%%A") do (>> %batch_file%
echo set user_domain=%%%%B>> %batch_file%
echo set user_login=%%%%C>> %batch_file%
echo )>> %batch_file%
echo )>> %batch_file%
echo call:trim user_login "%%user_login%%">> %batch_file%
echo REM other wmic commands>> %batch_file%
echo wmic useraccount where "Name='%%user_login%%' and Domain='%%user_domain%%'" get FullName^> %path_local%\%workstation%.fullname.tmp>> %batch_file%
echo wmic /NODE:%workstation% csproduct get IdentifyingNumber,Name^> %path_local%\%workstation%.serial.tmp>> %batch_file%
echo wmic /NODE:%workstation% computersystem get SystemType^> %path_local%\%workstation%.type.tmp>> %batch_file%
echo wmic /NODE:%workstation% nic get MACAddress,Name ^| findstr /r "[0-9A-F]**:[0-9A-F]**:[0-9A-F]**:[0-9A-F]**:[0-9A-F]**:[0-9A-F]**"^> %path_local%\%workstation%.nic.tmp>> %batch_file%
echo waitfor /si inventaire>> %batch_file%
echo goto:eof>> %batch_file%
echo :trim>> %batch_file%
echo REM usage: call:trim var_name var_value>> %batch_file%
echo set "str=%%~2##">> %batch_file%
echo set "str=%%str: ##=##%%">> %batch_file%
echo set "str=%%str: ##=##%%">> %batch_file%
echo set "str=%%str: ##=##%%">> %batch_file%
echo set "str=%%str: ##=##%%">> %batch_file%
echo set "%%~1=%%str:##=%%">> %batch_file%
echo set str=>> %batch_file%
echo goto:eof>> %batch_file%
echo :eof>> %batch_file%
start cmd.exe /C "%batch_file%"
waitfor inventaire
REM user_login
for /f "skip=1 delims=" %%A IN ('type %path_local%\%workstation%.username.tmp') DO (
for /f "tokens=1,2 delims=\" %%B in ("%%A") do (
set user_domain=%%B
set user_login=%%C
)
)
call:trim user_login "%user_login%"
REM User FullName
for /f "skip=1 delims=" %%A in ('type %path_local%\%workstation%.fullname.tmp') do set user_fullname=%%A
set user_fullname=%user_fullname:(external)=%
call:trim user_fullname "%user_fullname%"
REM ad_user
for /f "tokens=1,* delims=:" %%A IN ('findstr /n /r . %path_local%\%workstation%.ad-user.tmp') DO if #%%A==#2 set ad_user=%%B
:: left trim
for /f "tokens=* delims= " %%A IN ("%ad_user%") DO set ad_user=%%A
REM serial_num
for /f "skip=1 tokens=1* delims= " %%A in ('type %path_local%\%workstation%.serial.tmp') do set serial_num=%%A && set model_name=%%B
call:trim serial_num "%serial_num%"
REM model_name
call:trim model_name "%model_name%"
REM OS
for /f "skip=1 delims=" %%A in ('type %path_local%\%workstation%.os.tmp') do for /f "delims=|" %%B in ("%%A") do set os_name=%%B
REM arch_type
for /f "skip=1 delims=" %%A in ('type %path_local%\%workstation%.type.tmp') do set arch_type=%%A
set arch_type=%arch_type:~0,3%
REM check if the user connected is the ad_user
echo %ad_user% | findstr /i /c:"%user_fullname%" > NUL
if #%ERRORLEVEL%==#0 set user_change=false
REM write to file
set details=..\cache\%workstation%.details
echo workstation : %workstation%> %details%
echo model type : %model_name%>> %details%
echo serial num. : %serial_num%>> %details%
echo OS name : %os_name% ^(%arch_type%^)>> %details%
type %path_local%\%workstation%.nic.tmp>> %details%
if "%user_change%"=="false" echo user : %user_fullname% ^(%user_login%^)>> %details%
if not "%user_change%"=="false" (
echo user : %user_fullname% ^(%user_login%^)>> %details%
echo AD assign. : %ad_user%>> %details%
)
REM write to screen
echo.
echo workstation : %workstation%
echo model type : %model_name%
echo serial num. : %serial_num%
echo OS name : %os_name% ^(%arch_type%^)
type %path_local%\%workstation%.nic.tmp
if "%user_change%"=="false" echo user : %user_fullname% ^(%user_login%^)
if not "%user_change%"=="false" (
echo user : %user_fullname% ^(%user_login%^)
echo AD assign. : %ad_user%
)
goto fin
:syntax
echo Usage: %0 ^
:fin
del /q %path_local%\%workstation%.*.tmp
goto:eof
:trim
REM usage: call:trim var_name var_value
set "str=%~2##"
set "str=%str: ##=##%"
set "str=%str: ##=##%"
set "str=%str: ##=##%"
set "str=%str: ##=##%"
set "%~1=%str:##=%"
set str=
goto:eof
/www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Quick Inventory