RE: Determining Vista Editions

2009-08-20 Thread Steven Manross
WMI is a standard way that Microsoft is giving access to product data
like the OS Name.  The URL below should help if you need any other data
like numbers for the oslevel as opposed to the name of it..  Of
particular interest might be the "OperatingSystemSKU" and
"OSProductSuite".  

One of my particularly favorite values in this WMI Class is
"PAEEnabled"..  I like to verify if any of my administrative brethren
have forgotten to enable large memory support when the total memory in
the system is greater than 4GB.

"winmgmts:." is shorthand for the local computer.  Where as,
"winmgmts:somecomputer" would be a remote system.

P.S. In Vista, typically remote WMI Access is turned off by default
(firewall hardening and all)... 

HTH

Steven

http://msdn.microsoft.com/en-us/library/aa394239(VS.85).aspx

#--
use Win32::OLE qw(in);

$objWMI = Win32::OLE->GetObject("winmgmts:.\\root\\cimv2");


$oses = $objWMI->ExecQuery("select Caption,OSProductSuite from
Win32_OperatingSystem");

if (Win32::OLE->LastError() != 0) {
  print "Error Connecting to WMI: " . Win32::OLE->LastError();
  $osname = "Unknown";
}
foreach $os (in $oses) {
  print $os->{Caption}."\n";
}


From: perl-win32-users-boun...@listserv.activestate.com
[mailto:perl-win32-users-boun...@listserv.activestate.com] On Behalf Of
Michael Cohen
Sent: Wednesday, August 19, 2009 4:40 PM
To: perl-win32-users@listserv.ActiveState.com
Subject: Determining Vista Editions



To whomever knows the answer: 

I have been using the Win32::GetOSVersion() function for many
years in order to pull the Windows OS level.  However, I now have a new
need to determine whether or not the OS is Windows Vista Home Basic (or
for that matter, other various editions).  I do not see how to pull that
information from GetOSVersion().  From what I can find on the web, I
somehow need to use the "GetProductInfo" call from the "kernel32" DLL. 

I have tried the following code to try to pull the information
from my Vista 32 Ultimate, but cannot seem to get a valid response: 

 Cut here  
#!/usr/bin/perl -w 

use Win32; 
use Win32::API; 
use strict; 

my @oslevel = Win32::GetOSVersion(); 

my ($osMaj, $osMin, $spMaj, $spMin); 

printf("OS String:   %s\n", $oslevel[0]); 
printf("OS ID:   %s\n", $oslevel[4]); 
printf("OS Major:%d\n", $osMaj = int($oslevel[1])); 
printf("OS Minor:%d\n", $osMin = int($oslevel[2])); 
printf("OS Build:%s\n", $oslevel[3]); 
printf("OS SP Major: %d\n", $spMaj = int($oslevel[5])); 
printf("OS SP Minor: %d\n", $spMin = int($oslevel[6])); 
printf("OS SuiteMask:0x%08x\n", $oslevel[7]); 
printf("OS ProductType:  %s\n", $oslevel[8]); 

my $prodInfo = 0x;   # initialize with invalid value 
my $prodInfoPtr = \$prodInfo; 

if (($oslevel[1] == 6) && ($oslevel[2] == 0)) { 
  my $GetProductInfo = new Win32::API("kernel32",
"GetProductInfo", 
  "P", "I"); 
  my $rc = $GetProductInfo->Call($osMaj, $osMin, 
 $spMaj, $spMin, $prodInfoPtr); 

  printf("\nRC = %d\n", $rc); 
  printf("Product Info:0x%x\n", $prodInfo); 
  printf("Product Info:0x%x\n", $$prodInfoPtr); 
} 

 Cut here  


The information about this call is from this link: 
http://msdn.microsoft.com/en-us/library/ms724358(VS.85).aspx
  

Since the response from the GetProductInfo() command is put into
the DW pointer, I have initialized the variable to 0x to ensure
it is a double; however, the variable does not appear to be updated via
the GetProductInfo() command (it remains 0x) and the $rc is set
to 1.  FWIW, I have also tried to pass the variable directly (i.e., not
the ptr). 

What am I doing wrong?  Is there a better way to get this
information instead of using the GetProductInfo() command from the
"kernel32" DLL? 

Any help would greatly be appreciated. 

Regards,
Michael Cohen

___
Perl-Win32-Users mailing list
Perl-Win32-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs


Re: Determining Vista Editions

2009-08-20 Thread Sisyphus

- Original Message - 
From: "Michael Cohen" 

> I have been using the Win32::GetOSVersion() function for many years in
> order to pull the Windows OS level.  However, I now have a new need to
> determine whether or not the OS is Windows Vista Home Basic (or for that
> matter, other various editions).  I do not see how to pull that
> information from GetOSVersion().  From what I can find on the web, I
> somehow need to use the "GetProductInfo" call from the "kernel32" DLL.

I have Windows Vista, but my kernel32 apparently does not have 
GetProductInfo().
Any attempt to access the function using Inline::C fails because 
GetProductInfo is not defined - ultimately it's an undefined symbol.

If the function aint there, then it doesn't matter whether you use Inline::C 
or Win32::API - it's simply not going to work. Anyone know the exact 
situations under which this function becomes available ?

Cheers,
Rob

___
Perl-Win32-Users mailing list
Perl-Win32-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs


RE: Determining Vista Editions

2009-08-20 Thread Jack

 
___

From: perl-win32-users-boun...@listserv.activestate.com
[mailto:perl-win32-users-boun...@listserv.activestate.com] On Behalf Of
Michael Cohen
Sent: August-19-09 5:40 PM
To: perl-win32-users@listserv.ActiveState.com
Subject: Determining Vista Editions



>>To whomever knows the answer: 

>>I have been using the Win32::GetOSVersion() function for many years in
order to pull the Windows OS level.  However, I now have a new need to
determine whether or not the OS is Windows Vista Home Basic (or for that
matter, other various editions).

[snip]

>>Is there a better way to get this information instead of using the
GetProductInfo() command from the "kernel32" DLL? 


Better?? Likely not. I could not make the GetProductInfo API work either.
Instead perhaps you can just read the registry.

#!/usr/bin/perl -w 
use strict;
use Win32::TieRegistry;
$Registry->Delimiter("/");
my $edition = $Registry->{"LMachine/Software/Microsoft/"}->
  {"Windows NT/CurrentVersion//EditionID"}
  or  die "Can't find Edition ID: $^E\n";
print $edition;
__END__


Jack

___
Perl-Win32-Users mailing list
Perl-Win32-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs