I have scripted AllComputers.bat to generate CSV list of all the computers in a domain, showing the O/S, version, service pack, product name, and roles. The roles include:

Domain Controller (Y/N)
Global Catalog (Y/N)
"Schema","Domain naming","PDC","RID", and "Infrastructure"  FSMO masters,

like the following sample:

"JSI001","5.2","Service Pack 1  v.1159","Microsoft Windows Server 2003","Y","Y","Schema","Domain","PDC","RID","Infrastructure"                              "JSI009","5.1","Service Pack 2  v.2082","Microsoft Windows XP","N","N","","","","",""                              "JSI005","5.0","Service Pack 4","Microsoft Windows 2000","N","N","","","","",""                              "JSI003","5.1","Service Pack 1","Microsoft Windows XP","N","N","","","","",""                              "JSI007","5.2","None","Microsoft Windows Server 2003","N","N","","","","",""
The syntax for using AllComputers.bat is:

AllComputers.

The CSV list is displayed on the console, put you can pipe it to a file using:

AllComputers>FileName.

NOTE: AllComputers.bat uses AllFSMO.bat and IsGC.bat.

NOTE: If NETDOM.EXE is not installed on the computer you will use to run AllComputers.bat, install it from the Support / Tools folder of your O/S CD-ROM.

AllComputers.bat contains:

@echo off                              setlocal ENABLEDELAYEDEXPANSION                              set netdm=netdom query /domain:%userdnsdomain%                              set dc=Y                              for /f "Skip=1 Tokens=*" %%c in ('%netdm% dc^|find /v /i "The command completed successfully."') do (                               set cmp=%%c                               call :doit                              )                              set dc=N                              for /f "Skip=1 Tokens=*" %%c in ('%netdm% server^|find /v /i "The command completed successfully."') do (                               set cmp=%%c                               call :doit                              )                              for /f "Skip=1 Tokens=*" %%c in ('%netdm% workstation^|find /v /i "The command completed successfully."') do (                               set cmp=%%c                               call :doit                              )                              endlocal                              exit /b 0                              :doit                              set work=%cmp:     ( Workstation or Server )=%                              if "%work%" NEQ "%cmp%" set cmp=%work%#                              set cmp=%cmp: #=%                              set cmp=%cmp:#=%                              set cv=                              set sp=                              set pn=                              set gc=N                              for /f "Tokens=2*" %%r in ('reg query "\\%cmp%\HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion^|find "REG_SZ"') do set cv=%%s                              for /f "Tokens=2*" %%r in ('reg query "\\%cmp%\HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName^|find "REG_SZ"') do set pn=%%s                              set pn=!pn:,= !                              call :csdv>nul 2>&1                              if "%dc%" EQU "Y" call isgc "%cmp%" gc                              if "%dc%" EQU "Y" for /f "Tokens=1-6" %%r in ('AllFSMO') do (                               set role1=%%s                               set role2=%%t                               set role3=%%u                               set role4=%%v                               set role5=%%w                              )                              @echo "%cmp%","!cv!","!sp!","!pn!","!dc!","!gc!","!role1!","!role2!","!role3!","!role4!","!role5!"                              if  "%dc%" EQU "Y"  set role1=&set role2=&set role3=&set role4=&set role5=                              goto :EOF                              :csdv                              set sp=None                              for /f "Tokens=2*" %%r in ('reg query "\\%cmp%\HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CSDVersion^|find "REG_SZ"') do set sp=%%s                              set sp=!sp:,= !                              
NOTE: See tip 7717 » More on DSQUERY attribute filtering.