You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
4.8 KiB
190 lines
4.8 KiB
#define UNICODE 1
|
|
#include <windows.h>
|
|
#include <lm.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#define BUILD_NUMBER_KEY L"SOFTWARE\\MICROSOFT\\WINDOWS NT\\CURRENTVERSION"
|
|
#define BUILD_NUMBER_BUFFER_LENGTH 80
|
|
#define BUILD_LAB_BUFFER_LENGTH 80
|
|
|
|
DWORD GetBuildNumber(LPWSTR Server, LPWSTR BuildNumber, LPWSTR BuildLab);
|
|
|
|
int __cdecl
|
|
main(
|
|
int argc,
|
|
char ** argv
|
|
)
|
|
{
|
|
DWORD error;
|
|
DWORD cb;
|
|
WCHAR server[MAX_COMPUTERNAME_LENGTH + 3];
|
|
WCHAR buildNumber[BUILD_NUMBER_BUFFER_LENGTH];
|
|
WCHAR buildLab[BUILD_LAB_BUFFER_LENGTH];
|
|
BOOLEAN bBrief = FALSE;
|
|
|
|
//
|
|
// All server names start with \\.
|
|
//
|
|
|
|
server[0] = L'\\';
|
|
server[1] = L'\\';
|
|
|
|
//
|
|
// Get the build number for each server requested.
|
|
//
|
|
|
|
argc--;
|
|
argv++;
|
|
|
|
if (argc > 0) {
|
|
if ( (*argv[0]=='-' || *argv[0]=='/') && (argv[0][1]=='b' || argv[0][1]=='B') ) {
|
|
bBrief=TRUE;
|
|
argc--;
|
|
argv++;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Get the build number of the local machine
|
|
//
|
|
|
|
if (argc == 0 ) {
|
|
cb = MAX_COMPUTERNAME_LENGTH + 1;
|
|
if ( !GetComputerName( &server[2], &cb ) ) {
|
|
wcscpy( &server[2], L"Local Machine" );
|
|
}
|
|
|
|
error = GetBuildNumber( NULL, buildNumber, buildLab );
|
|
if ( error != ERROR_SUCCESS ) {
|
|
|
|
printf( "Error %d querying build number for %ws\n", error, server);
|
|
|
|
} else if (bBrief) {
|
|
printf( "%ws", buildNumber );
|
|
} else {
|
|
if (buildLab[0])
|
|
printf( "%ws is running build %ws (%ws)\n", server, buildNumber, buildLab );
|
|
else
|
|
printf( "%ws is running build %ws\n", server, buildNumber );
|
|
}
|
|
|
|
} else {
|
|
|
|
while ( argc ) {
|
|
CHAR *p = *argv;
|
|
|
|
if ( !_stricmp( p, "/?" ) || !_stricmp( p, "-?" ) ) {
|
|
puts( "Usage: BUILDNUM [-b] [ServerName [servername]...]\n"
|
|
" If no servername, then local machine is assumed.\n"
|
|
" -b prints only the build number digits (must be 1st arg if used).\n" );
|
|
return 0;
|
|
}
|
|
|
|
if ( !strncmp( "\\\\", p, 2 ) ) {
|
|
p += 2;
|
|
}
|
|
|
|
if ( strlen( p ) > MAX_COMPUTERNAME_LENGTH ) {
|
|
|
|
printf( "Computer name \\\\%s is too long\n", *argv );
|
|
|
|
} else {
|
|
|
|
WCHAR *q = &server[2];
|
|
|
|
while ( *p ) {
|
|
*q++ = *p++;
|
|
}
|
|
*q = 0;
|
|
|
|
error = GetBuildNumber( server, buildNumber, buildLab );
|
|
if ( error != ERROR_SUCCESS ) {
|
|
|
|
printf( "Error %d querying build number for %ws\n", error, server );
|
|
|
|
} else if (bBrief) {
|
|
printf( "%ws", buildNumber );
|
|
} else {
|
|
if (buildLab[0])
|
|
printf( "%ws is running build %ws (%ws)\n", server, buildNumber, buildLab );
|
|
else
|
|
printf( "%ws is running build %ws\n", server, buildNumber );
|
|
}
|
|
}
|
|
|
|
argc--;
|
|
argv++;
|
|
|
|
}
|
|
}
|
|
return 0;
|
|
|
|
} // main
|
|
|
|
DWORD
|
|
GetBuildNumber(
|
|
LPWSTR Server,
|
|
LPWSTR BuildNumber,
|
|
LPWSTR BuildLab
|
|
)
|
|
{
|
|
DWORD error;
|
|
HKEY key;
|
|
HKEY keyBuildNumber;
|
|
DWORD buildNumberLength;
|
|
DWORD keyType;
|
|
|
|
if ( Server == NULL ) {
|
|
key = HKEY_LOCAL_MACHINE;
|
|
}
|
|
|
|
error = RegConnectRegistry( Server, HKEY_LOCAL_MACHINE, &key );
|
|
if ( error != ERROR_SUCCESS ) {
|
|
return error;
|
|
}
|
|
|
|
error = RegOpenKeyEx( key, BUILD_NUMBER_KEY, 0, KEY_READ, &keyBuildNumber );
|
|
if ( error != ERROR_SUCCESS) {
|
|
return error;
|
|
}
|
|
|
|
buildNumberLength = BUILD_NUMBER_BUFFER_LENGTH * sizeof(WCHAR);
|
|
error = RegQueryValueEx(
|
|
keyBuildNumber,
|
|
L"CurrentBuildNumber",
|
|
NULL,
|
|
&keyType,
|
|
(LPBYTE)BuildNumber,
|
|
&buildNumberLength
|
|
);
|
|
if ( error != ERROR_SUCCESS ) {
|
|
error = RegQueryValueEx(
|
|
keyBuildNumber,
|
|
L"CurrentBuild",
|
|
NULL,
|
|
&keyType,
|
|
(LPBYTE)BuildNumber,
|
|
&buildNumberLength
|
|
);
|
|
}
|
|
|
|
buildNumberLength = BUILD_LAB_BUFFER_LENGTH * sizeof(WCHAR);
|
|
if (RegQueryValueEx(
|
|
keyBuildNumber,
|
|
L"BuildLab",
|
|
NULL,
|
|
&keyType,
|
|
(LPBYTE)BuildLab,
|
|
&buildNumberLength
|
|
) != ERROR_SUCCESS )
|
|
{
|
|
*BuildLab = 0;
|
|
}
|
|
|
|
RegCloseKey( keyBuildNumber );
|
|
RegCloseKey( key );
|
|
|
|
return error;
|
|
|
|
} // GetBuildNumber
|