|
I'm trying to discover a better way to determine if IIS is installed with Windows Vista.
I've gone over the registry, the Windows\System32\InetSrv Folder, and all the registry entries and files seem to be intact when you uninstall IIS Server using Windows Features.
So I'm looking at Windows Feature, it know what features are installed, and I'm trying to figure out the method it uses, or the location of the information.
Just wanted to know if anyone out there has any information on this.
|
|
|
|
|
Jim,
jkirkerx wrote: I'm trying to discover a better way to determine if IIS is installed with
Windows Vista.
In one of my old installers it looks like I was checking for the existence of the registry key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp however.. I wrote the installer back in 2006 so I do not know if that still works. You should investigate this.
jkirkerx wrote: So I'm looking at Windows Feature, it know what features are installed, and I'm
trying to figure out the method it uses, or the location of the information.
Well I read the documentation for the MsiEnumComponents function[^] and came up with this:
#include <Msi.h>
using namespace std;
#pragma comment(lib, "msi.lib")
VOID SampleEnumerateInstallsFromMSI()
{
DWORD dwRet = 0;
DWORD dwIndex = 0;
TCHAR szProduct[MAX_GUID_CHARS + 1];
while(ERROR_NO_MORE_ITEMS != dwRet)
{
dwRet = MsiEnumComponents(dwIndex, szProduct);
if(ERROR_NO_MORE_ITEMS != dwRet)
{
TCHAR szProductName[MAX_PATH];
DWORD dwCount = MAX_PATH;
DWORD dwSuccess = MsiGetProductInfo(szProduct,INSTALLPROPERTY_PRODUCTNAME,szProductName,&dwCount);
if(ERROR_SUCCESS == dwSuccess)
{
TRACE1("%s was installed from a MSI.\n",szProductName);
}
else if(ERROR_UNKNOWN_PRODUCT == dwSuccess)
{
}
}
++dwIndex;
}
}
Unfortunately when I execute these MSI functions... it seems that it can only enumerate installations that used an MSI package. Here on my workstation it was missing litterally hundreds of software packages. So I decided that I would dig a little deeper and see if I could manage to read the registry and directly extract all of the installed software. Here is the result:
#include <string>
#include <vector>
VOID SampleEnumerateInstallsFromRegistry()
{
CRegKey reg;
BOOL bWow64;
HKEY hkeyLM = HKEY_LOCAL_MACHINE;
TCHAR szBasekey[] = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData");
IsWow64Process(GetCurrentProcess(),&bWow64);
LONG lResult = reg.Open(hkeyLM,szBasekey,TRUE == bWow64 ? KEY_WOW64_64KEY | KEY_READ:KEY_READ);
if(ERROR_SUCCESS == lResult)
{
TCHAR key[MAX_PATH];
DWORD dwError =0;
int iIndex = 0;
DWORD dwLength = MAX_PATH;
while(ERROR_SUCCESS == (dwError = reg.EnumKey(iIndex,key,&dwLength,0)))
{
CRegKey products_subkey;
TCHAR szRegistryPath[MAX_PATH* 2];
_tcscpy_s(szRegistryPath,MAX_PATH * 2,szBasekey);
_tcscat_s(szRegistryPath,MAX_PATH * 2,_T("\\"));
_tcscat_s(szRegistryPath,MAX_PATH * 2,key);
_tcscat_s(szRegistryPath,MAX_PATH * 2, _T("\\Products"));
lResult = products_subkey.Open(hkeyLM,szRegistryPath,TRUE == bWow64 ? KEY_WOW64_64KEY | KEY_READ:KEY_READ);
if(ERROR_SUCCESS == lResult)
{
dwLength = MAX_PATH;
int iIndexB = 0;
while(ERROR_SUCCESS == (dwError = products_subkey.EnumKey(iIndexB,key,&dwLength,0)))
{
CRegKey install_key;
TCHAR szFinalRegistryPath[MAX_PATH* 2];
_tcscpy_s(szFinalRegistryPath,MAX_PATH * 2,szRegistryPath);
_tcscat_s(szFinalRegistryPath,MAX_PATH * 2,_T("\\"));
_tcscat_s(szFinalRegistryPath,MAX_PATH * 2,key);
_tcscat_s(szFinalRegistryPath,MAX_PATH * 2,_T("\\InstallProperties"));
lResult = install_key.Open(hkeyLM,szFinalRegistryPath,TRUE == bWow64 ? KEY_WOW64_64KEY | KEY_READ:KEY_READ);
if(ERROR_SUCCESS == lResult)
{
TCHAR szDisplayName[MAX_PATH];
dwLength = MAX_PATH;
install_key.QueryStringValue(_T("DisplayName"),szDisplayName,&dwLength);
TRACE1("%s was installed from a non-MSI installer.\n",szDisplayName);
}
dwLength = MAX_PATH;
++iIndexB;
install_key.Close();
}
}
dwLength = MAX_PATH;
++iIndex;
products_subkey.Close();
}
}
reg.Close();
}
Anyway it looks like it is enumerating just about everything I have installed on my workstation. Hopefully you will find it useful and if not maybe someone else will.
Best Wishes,
-David Delaune
|
|
|
|
|
|
That's useful
Out of the box, didn't think of that.
The inetstp is generated on first install, but when you uninstall IIS, the key is still there. That's why I was looking for something deeper.
Let me cruise the keys tomorrow, and do some forensics. That might be the key I was looking for.
Thanks Randor
|
|
|
|
|
Hello, I'm working with CDockablePanes, and I am unable to get maximize/minimize buttons to appear on them. Any help would be greatly appreciated.
|
|
|
|
|
Any Ideas? Adding the options to the window styles has no effect. Does anyone know if it's possible? Ideally I'd like them to look like VS2010 panes (with an extra button for a drop down menu). Please help!
|
|
|
|
|
void lxt971reset()
{
int temp2,temp1;
pioreset1=pioreset1 | 0x0010;
*pioaddr_ptr=9<<24;*piowrdata_ptr=pioreset1;wait(10);*piowr=1;*piowr=0;
wait(1000);
pioreset1=pioreset1 & (~0x0010);
*pioaddr_ptr=9<<24;*piowrdata_ptr=pioreset1;wait(10);*piowr=1;*piowr=0;
}
|
|
|
|
|
Are you going to pay for it?
Every new day is another chance to change your life.
|
|
|
|
|
It is just matter of knowing C bitwise operations and reading the device datasheet (we haven't the latter so how can we help you?).
Veni, vidi, vici.
|
|
|
|
|
|
You damn little egg-headed Belgian detective you.
Veni, vidi, vici.
|
|
|
|
|
You should now spend your time answering the question that was asked at the beginning, rather than complimenting me.
|
|
|
|
|
At the moment I'm stuck at temp1 and temp2 interpretation.
Veni, vidi, vici.
|
|
|
|
|
Veni, vidi, ristagnavi
|
|
|
|
|
Veni, vidi, supersedi.
Veni, vidi, vici.
|
|
|
|
|
i think this belongs in the Hall Of Shame
|
|
|
|
|
// not code
void lxt971reset()
{
int temp2,temp1;
pioreset1=pioreset1 | 0x0010;
// hex 10 = binary 10000; | is Bitwise OR; sets the 5th position from the right in pioreset1 to a
one. Probably turning on some kind of switch
*pioaddr_ptr=9<<24;
// Not sure why one would do this but this shifts 9 (binary 1001) 24 bits to the left ( also multiplies 9 times (2 to the 24th power) which equals Binary 10010000000000000000000000000 and stores it
*piowrdata_ptr=pioreset1;
// sets a pointer to the value from setp 1
wait(10);
// I geuss a delay to let the previous action to take effect
*piowr=1;
// Turn something on
*piowr=0;
// Turn it off
wait(1000);
// Another delay
pioreset1=pioreset1 & (~0x0010);
// (~0x0010) = 01111 bacically the complement of 10000 from step 1 "piorset1 & 01111" turns off the switch truned on in step 1
*pioaddr_ptr=9<<24;
// Same as step 2 but with switch off
*piowrdata_ptr=pioreset1;
// Same as step 3
wait(10);
// more delay for timing I suppose
*piowr=1;
*piowr=0;
// The old On/Off again
}
// never did use temp1 or temp 2;
John Nawrocki
Chief Technical Advisor
Custom Molded Products
|
|
|
|
|
Needs formatting!
Unrequited desire is character building. OriginalGriff
I'm sitting here giving you a standing ovation - Len Goodman
|
|
|
|
|
But you missed to mention your postal address.
Starting to think people post kid pics in their profiles because that was the last time they were cute - Jeremy.
|
|
|
|
|
Using Microsoft's NMAKE with -I option for include paths. It works for the include files in these folders, but can't seem to find one in a named subfolder:
Here's the resulting command & error message:
cl /nologo /Ox /MD /EHsc /W3 /D_CRT_SECURE_NO_DEPRECATE -I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\sys"; -I. "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\sys" "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include" "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" -DAVOID_WIN32_FILEIO -DCHECK_JPEG_YCBCR_SUBSAMPLING -DDEFAULT_EXTRASAMPLE_AS_ALPHA -DSTRIPCHOP_DEFAULT=TIFF_STRIPCHOP -DSTRIP_SIZE_DEFAULT=8192 -DLOGLUV_SUPPORT -DNEXT_SUPPORT -DTHUNDER_SUPPORT -DLZW_SUPPORT -DPACKBITS_SUPPORT -DCCITT_SUPPORT -DTIF_PLATFORM_CONSOLE -DFILLODER_LSB2MSB /c tif_unix.c tif_unix.c tif_unix.c(35) : fatal error C1083: Cannot open include file: 'sys/types.h': No such file or directory
Two things to note:
1. The "missing" file, "types.h", IS in the "sys" subfolder of one of the include paths, so "sys/types.h" should have been found, and
2. The "sys" subfolder was also included (out of desperation) and types.h STILL wasn't found.
Any ideas why this include file can't be found?
"Microsoft -- Adding unnecessary complexity to your work since 1987!"
modified 24-Feb-12 11:44am.
|
|
|
|
|
I haven't messed with make files in a very long time, but it seems that the preprocessor is going to look in the following folders for sys/types.h :
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\sys"
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\sys"
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include"
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" Of the above, only the last one would appear to contain a folder named sys , correct?
Does the \ vs. / make any difference? I don't think it does, but I just wanted to mention it.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Show me a community that obeys the Ten Commandments and I'll show you a less crowded prison system." - Anonymous
|
|
|
|
|
Thanks for the info, but the problem turned out to be something else.
"Microsoft -- Adding unnecessary complexity to your work since 1987!"
|
|
|
|
|
I suspected it was after reading Richard's post.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Show me a community that obeys the Ten Commandments and I'll show you a less crowded prison system." - Anonymous
|
|
|
|
|
Isn't sys/types.h a POSIX include file? Can you use it on Windows (I mean without Cygwin )?
Veni, vidi, vici.
|
|
|
|
|
I just checked - it is in the Windows sys directory.
Unrequited desire is character building. OriginalGriff
I'm sitting here giving you a standing ovation - Len Goodman
|
|
|
|
|