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.
1131 lines
30 KiB
1131 lines
30 KiB
#include "precomp.hxx"
|
|
#include <stdio.h>
|
|
#include <script.h>
|
|
#include "LogScript.hxx"
|
|
#include <ilogobj.hxx>
|
|
#include "filectl.hxx"
|
|
#include "asclogc.hxx"
|
|
#include "ncslogc.hxx"
|
|
#include "lkrhash.h"
|
|
#include "extlogc.hxx"
|
|
#include "odbcconn.hxx"
|
|
#include "odblogc.hxx"
|
|
|
|
#include <initguid.h>
|
|
#include <iadmw.h>
|
|
|
|
#include "resource.h"
|
|
|
|
HINSTANCE hDLLInstance;
|
|
|
|
BOOL
|
|
AddClsIdRegKeys(
|
|
IN LPCSTR ControlKey,
|
|
IN LPCSTR ClsId,
|
|
IN LPCSTR ControlName,
|
|
IN LPCSTR PPageClsId,
|
|
IN LPCSTR PPageName,
|
|
IN LPCSTR BitmapIndex
|
|
);
|
|
|
|
BOOL
|
|
AddControlRegKeys(
|
|
IN LPCSTR ControlKey,
|
|
IN LPCSTR ControlName,
|
|
IN LPCSTR ClsId,
|
|
IN LPCSTR PPageClsId,
|
|
IN LPCSTR PPageName,
|
|
IN LPCSTR BitmapIndex
|
|
);
|
|
|
|
BOOL
|
|
CreateMetabaseKeys();
|
|
|
|
HRESULT SetAdminACL(
|
|
IMSAdminBase *pAdminBase,
|
|
METADATA_HANDLE hMeta,
|
|
LPWSTR wszKeyName
|
|
);
|
|
|
|
DWORD
|
|
GetPrincipalSID (
|
|
LPTSTR Principal,
|
|
PSID *Sid,
|
|
BOOL *pbWellKnownSID
|
|
);
|
|
|
|
BEGIN_OBJECT_MAP(ObjectMap)
|
|
OBJECT_ENTRY(CLSID_NCSALOG, CNCSALOG)
|
|
OBJECT_ENTRY(CLSID_ODBCLOG, CODBCLOG)
|
|
OBJECT_ENTRY(CLSID_EXTLOG, CEXTLOG)
|
|
OBJECT_ENTRY(CLSID_ASCLOG, CASCLOG)
|
|
END_OBJECT_MAP()
|
|
|
|
DECLARE_DEBUG_VARIABLE();
|
|
|
|
DECLARE_DEBUG_PRINTS_OBJECT();
|
|
DECLARE_PLATFORM_TYPE();
|
|
|
|
extern "C" {
|
|
|
|
BOOL
|
|
WINAPI
|
|
DLLEntry(
|
|
HINSTANCE hDll,
|
|
DWORD dwReason,
|
|
LPVOID lpvReserved
|
|
);
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
DLLEntry(
|
|
HINSTANCE hDll,
|
|
DWORD dwReason,
|
|
LPVOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
DLL entrypoint.
|
|
|
|
Arguments:
|
|
|
|
hDLL - Instance handle.
|
|
|
|
Reason - The reason the entrypoint was called.
|
|
DLL_PROCESS_ATTACH
|
|
DLL_PROCESS_DETACH
|
|
DLL_THREAD_ATTACH
|
|
DLL_THREAD_DETACH
|
|
|
|
Return Value:
|
|
|
|
BOOL - TRUE if the action succeeds.
|
|
|
|
--*/
|
|
{
|
|
hDLLInstance = hDll;
|
|
|
|
BOOL bReturn = TRUE;
|
|
|
|
switch ( dwReason ) {
|
|
|
|
case DLL_PROCESS_ATTACH:
|
|
INITIALIZE_PLATFORM_TYPE();
|
|
CREATE_DEBUG_PRINT_OBJECT("iislog.dll");
|
|
LOAD_DEBUG_FLAGS_FROM_REG_STR("System\\CurrentControlSet\\Services\\InetInfo\\Parameters", 0);
|
|
_Module.Init(ObjectMap,hDll);
|
|
g_eventLog = new EVENT_LOG(IISLOG_EVENTLOG_SOURCE);
|
|
|
|
if ( g_eventLog == NULL ) {
|
|
DBGPRINTF((DBG_CONTEXT,
|
|
"Unable to create eventlog[%s] object[err %d]\n",
|
|
IISLOG_EVENTLOG_SOURCE, GetLastError()));
|
|
}
|
|
|
|
(VOID)IISGetPlatformType();
|
|
|
|
DisableThreadLibraryCalls(hDll);
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
|
|
if ( g_eventLog != NULL ) {
|
|
delete g_eventLog;
|
|
g_eventLog = NULL;
|
|
}
|
|
|
|
_Module.Term();
|
|
DELETE_DEBUG_PRINT_OBJECT( );
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return bReturn;
|
|
} // DllEntry
|
|
|
|
|
|
//
|
|
// constants used in self registration
|
|
//
|
|
|
|
#define TYPELIB_CLSID "{FF160650-DE82-11CF-BC0A-00AA006111E0}"
|
|
|
|
#define NCSA_CLSID NCSALOG_CLSID // %F
|
|
#define NCSA_KEY "MSIISLOG.MSNCSALogCtrl.1"
|
|
#define NCSA_NAME "MSNCSALog Control"
|
|
#define NCSA_PP_CLSID "{FF160660-DE82-11CF-BC0A-00AA006111E0}"
|
|
#define NCSA_PP_NAME "MSNCSALog Property Page"
|
|
|
|
#define ODBC_CLSID ODBCLOG_CLSID //5B
|
|
#define ODBC_KEY "MSIISLOG.MSODBCLogCtrl.1"
|
|
#define ODBC_NAME "MSODBCLog Control"
|
|
#define ODBC_PP_CLSID "{FF16065C-DE82-11CF-BC0A-00AA006111E0}"
|
|
#define ODBC_PP_NAME "MSODBCLog Property Page"
|
|
|
|
#define ASCII_CLSID ASCLOG_CLSID // 57
|
|
#define ASCII_KEY "MSIISLOG.MSASCIILogCtrl.1"
|
|
#define ASCII_NAME "MSASCIILog Control"
|
|
#define ASCII_PP_CLSID "{FF160658-DE82-11CF-BC0A-00AA006111E0}"
|
|
#define ASCII_PP_NAME "MSASCIILog Property Page"
|
|
|
|
#define CUSTOM_CLSID EXTLOG_CLSID // 63
|
|
#define CUSTOM_KEY "MSIISLOG.MSCustomLogCtrl.1"
|
|
#define CUSTOM_NAME "MSCustomLog Control"
|
|
#define CUSTOM_PP_CLSID "{FF160664-DE82-11CF-BC0A-00AA006111E0}"
|
|
#define CUSTOM_PP_NAME "MSCustomLog Property Page"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DllRegisterServer - Adds entries to the system registry
|
|
|
|
STDAPI
|
|
DllRegisterServer(void)
|
|
{
|
|
//
|
|
// MS NCSA Log Support
|
|
//
|
|
|
|
if ( !AddControlRegKeys(
|
|
NCSA_KEY,
|
|
NCSA_NAME,
|
|
NCSA_CLSID,
|
|
NCSA_PP_CLSID,
|
|
NCSA_PP_NAME,
|
|
"4") ) {
|
|
|
|
goto error;
|
|
}
|
|
|
|
//
|
|
// MS ODBC Log Support
|
|
//
|
|
|
|
if ( !AddControlRegKeys(
|
|
ODBC_KEY,
|
|
ODBC_NAME,
|
|
ODBC_CLSID,
|
|
ODBC_PP_CLSID,
|
|
ODBC_PP_NAME,
|
|
"3") ) {
|
|
|
|
goto error;
|
|
}
|
|
|
|
//
|
|
// MS Ascii Log Support
|
|
//
|
|
|
|
if ( !AddControlRegKeys(
|
|
ASCII_KEY,
|
|
ASCII_NAME,
|
|
ASCII_CLSID,
|
|
ASCII_PP_CLSID,
|
|
ASCII_PP_NAME,
|
|
"2") ) {
|
|
|
|
goto error;
|
|
}
|
|
|
|
//
|
|
// MS Custom Log Support
|
|
//
|
|
|
|
if ( !AddClsIdRegKeys(
|
|
CUSTOM_KEY,
|
|
CUSTOM_CLSID,
|
|
CUSTOM_NAME,
|
|
CUSTOM_PP_CLSID,
|
|
CUSTOM_PP_NAME,
|
|
"2"
|
|
) ) {
|
|
goto error;
|
|
}
|
|
|
|
//
|
|
// Metabase entries for W3C custom logging
|
|
//
|
|
|
|
if ( !CreateMetabaseKeys() ) {
|
|
|
|
goto error;
|
|
}
|
|
|
|
return S_OK;
|
|
|
|
error:
|
|
return E_UNEXPECTED;
|
|
|
|
} // DllRegisterServer
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DllUnregisterServer - Removes entries from the system registry
|
|
|
|
STDAPI
|
|
DllUnregisterServer(void)
|
|
{
|
|
|
|
HKEY hCLSID;
|
|
|
|
//
|
|
// Delete controls
|
|
//
|
|
|
|
ZapRegistryKey(HKEY_CLASSES_ROOT,NCSA_KEY);
|
|
ZapRegistryKey(HKEY_CLASSES_ROOT,ODBC_KEY);
|
|
ZapRegistryKey(HKEY_CLASSES_ROOT,ASCII_KEY);
|
|
|
|
//
|
|
// Get CLSID handle
|
|
//
|
|
|
|
if ( RegOpenKeyExA(HKEY_CLASSES_ROOT,
|
|
"CLSID",
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hCLSID) != ERROR_SUCCESS ) {
|
|
|
|
IIS_PRINTF((buff,"IISLOG: Cannot open CLSID key\n"));
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
ZapRegistryKey(hCLSID, NCSA_CLSID);
|
|
ZapRegistryKey(hCLSID, NCSA_PP_CLSID);
|
|
|
|
ZapRegistryKey(hCLSID, ODBC_CLSID);
|
|
ZapRegistryKey(hCLSID, ODBC_PP_CLSID);
|
|
|
|
ZapRegistryKey(hCLSID, ASCII_CLSID);
|
|
ZapRegistryKey(hCLSID, ASCII_PP_CLSID);
|
|
|
|
ZapRegistryKey(hCLSID, CUSTOM_CLSID);
|
|
ZapRegistryKey(hCLSID, CUSTOM_PP_CLSID);
|
|
|
|
RegCloseKey(hCLSID);
|
|
|
|
//
|
|
// Open the metabase path and remove Custom Logging keys
|
|
//
|
|
|
|
/*
|
|
|
|
IMSAdminBase* pMBCom = NULL;
|
|
METADATA_HANDLE hMeta = NULL;
|
|
|
|
if ( SUCCEEDED( CoCreateInstance(GETAdminBaseCLSID(TRUE), NULL, CLSCTX_LOCAL_SERVER,
|
|
IID_IMSAdminBase, (void **)(&pMBCom) )))
|
|
{
|
|
if ( SUCCEEDED( pMBCom->OpenKey( METADATA_MASTER_ROOT_HANDLE, L"LM",
|
|
METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE, MB_TIMEOUT,
|
|
&hMeta)) )
|
|
{
|
|
pMBCom->DeleteKey(hMeta, L"Logging/Custom Logging");
|
|
pMBCom->CloseKey(hMeta);
|
|
}
|
|
|
|
pMBCom->Release();
|
|
}
|
|
|
|
*/
|
|
return S_OK;
|
|
|
|
} // DllUnregisterServer
|
|
|
|
|
|
BOOL
|
|
AddControlRegKeys(
|
|
IN LPCSTR ControlKey,
|
|
IN LPCSTR ControlName,
|
|
IN LPCSTR ControlClsId,
|
|
IN LPCSTR PPageClsId,
|
|
IN LPCSTR PPageName,
|
|
IN LPCSTR BitmapIndex
|
|
)
|
|
{
|
|
|
|
HKEY hProgID = NULL;
|
|
HKEY hCLSID = NULL;
|
|
|
|
BOOL fRet = FALSE;
|
|
|
|
//
|
|
// Add control name
|
|
//
|
|
|
|
hProgID = CreateKey(HKEY_CLASSES_ROOT,ControlKey,ControlName);
|
|
if ( hProgID == NULL ) {
|
|
goto exit;
|
|
}
|
|
|
|
hCLSID = CreateKey(hProgID,"CLSID",ControlClsId);
|
|
if ( hCLSID == NULL ) {
|
|
goto exit;
|
|
}
|
|
|
|
//
|
|
// Add CLSID keys
|
|
//
|
|
|
|
if ( !AddClsIdRegKeys(
|
|
ControlKey,
|
|
ControlClsId,
|
|
ControlName,
|
|
PPageClsId,
|
|
PPageName,
|
|
BitmapIndex) ) {
|
|
|
|
goto exit;
|
|
}
|
|
|
|
fRet = TRUE;
|
|
|
|
exit:
|
|
if ( hProgID != NULL ) {
|
|
RegCloseKey(hProgID);
|
|
}
|
|
|
|
if ( hCLSID != NULL ) {
|
|
RegCloseKey(hCLSID);
|
|
}
|
|
|
|
return(fRet);
|
|
|
|
} // AddControlRegKeys
|
|
|
|
|
|
BOOL
|
|
AddClsIdRegKeys(
|
|
IN LPCSTR ControlKey,
|
|
IN LPCSTR ClsId,
|
|
IN LPCSTR ControlName,
|
|
IN LPCSTR PPageClsId,
|
|
IN LPCSTR PPageName,
|
|
IN LPCSTR BitmapIndex
|
|
)
|
|
{
|
|
BOOL fRet = FALSE;
|
|
|
|
HKEY hCLSID = NULL;
|
|
HKEY hRoot = NULL;
|
|
HKEY hKey, hKey2;
|
|
|
|
CHAR szName[MAX_PATH+1];
|
|
|
|
HMODULE hModule;
|
|
|
|
//
|
|
// open CLASSES/CLSID
|
|
//
|
|
|
|
if ( RegOpenKeyEx(HKEY_CLASSES_ROOT,
|
|
"CLSID",
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hCLSID) != ERROR_SUCCESS ) {
|
|
|
|
IIS_PRINTF((buff,"IISLOG: Cannot open CLSID key\n"));
|
|
goto exit;
|
|
}
|
|
|
|
//
|
|
// Create the Guid and set the control name
|
|
//
|
|
|
|
hRoot = CreateKey(hCLSID,ClsId,ControlName);
|
|
|
|
if ( hRoot == NULL ) {
|
|
goto exit;
|
|
}
|
|
|
|
//
|
|
// Control
|
|
//
|
|
|
|
hKey = CreateKey(hRoot, "Control", "");
|
|
if ( hKey == NULL ) {
|
|
goto exit;
|
|
}
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
//
|
|
// InProcServer32
|
|
//
|
|
|
|
hModule=GetModuleHandleA("iislog.dll");
|
|
if (hModule == NULL) {
|
|
goto exit;
|
|
}
|
|
|
|
if (GetModuleFileName(hModule, szName, sizeof(szName)) == 0) {
|
|
goto exit;
|
|
}
|
|
|
|
hKey = CreateKey(hRoot, "InProcServer32", szName);
|
|
if ( hKey == NULL ) {
|
|
goto exit;
|
|
}
|
|
|
|
if (RegSetValueExA(hKey,
|
|
"ThreadingModel",
|
|
NULL,
|
|
REG_SZ,
|
|
(LPBYTE)"Both",
|
|
sizeof("Both")) != ERROR_SUCCESS) {
|
|
|
|
RegCloseKey(hKey);
|
|
goto exit;
|
|
}
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
//
|
|
// Misc Status
|
|
//
|
|
|
|
hKey = CreateKey(hRoot,"MiscStatus","0");
|
|
if ( hKey == NULL ) {
|
|
goto exit;
|
|
}
|
|
|
|
hKey2 = CreateKey(hKey,"1","131473");
|
|
if ( hKey2 == NULL ) {
|
|
RegCloseKey(hKey);
|
|
goto exit;
|
|
}
|
|
|
|
RegCloseKey(hKey2);
|
|
RegCloseKey(hKey);
|
|
|
|
//
|
|
// ProgID
|
|
//
|
|
|
|
hKey = CreateKey(hRoot,"ProgID",ControlKey);
|
|
if ( hKey == NULL ) {
|
|
goto exit;
|
|
}
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
//
|
|
// ToolboxBitmap32
|
|
//
|
|
|
|
{
|
|
CHAR tmpBuf[MAX_PATH+1];
|
|
strcpy(tmpBuf,szName);
|
|
strcat(tmpBuf,", ");
|
|
strcat(tmpBuf,BitmapIndex);
|
|
|
|
hKey = CreateKey(hRoot,"ToolboxBitmap32",tmpBuf);
|
|
if ( hKey == NULL ) {
|
|
goto exit;
|
|
}
|
|
RegCloseKey(hKey);
|
|
}
|
|
|
|
//
|
|
// TypeLib
|
|
//
|
|
|
|
hKey = CreateKey(hRoot,"TypeLib",TYPELIB_CLSID);
|
|
if ( hKey == NULL ) {
|
|
goto exit;
|
|
}
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
//
|
|
// Version
|
|
//
|
|
|
|
hKey = CreateKey(hRoot,"Version","1.0");
|
|
if ( hKey == NULL ) {
|
|
goto exit;
|
|
}
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
//
|
|
// Property page
|
|
//
|
|
|
|
RegCloseKey(hRoot);
|
|
hRoot = NULL;
|
|
|
|
hRoot = CreateKey(hCLSID, PPageClsId, PPageName);
|
|
if ( hRoot == NULL ) {
|
|
goto exit;
|
|
}
|
|
|
|
hKey = CreateKey(hRoot, "InProcServer32", szName );
|
|
if ( hKey == NULL ) {
|
|
goto exit;
|
|
}
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
fRet = TRUE;
|
|
exit:
|
|
|
|
if ( hRoot != NULL ) {
|
|
RegCloseKey(hRoot);
|
|
}
|
|
|
|
if ( hCLSID != NULL ) {
|
|
RegCloseKey(hCLSID);
|
|
}
|
|
|
|
return fRet;
|
|
|
|
} // AddClsIdRegKeys
|
|
|
|
|
|
BOOL
|
|
CreateMetabaseKeys()
|
|
{
|
|
USES_CONVERSION;
|
|
|
|
typedef struct _MB_PROP_
|
|
{
|
|
LPWSTR wcsPath;
|
|
DWORD dwNameString;
|
|
LPSTR szHeaderName;
|
|
DWORD dwPropID;
|
|
DWORD dwPropMask;
|
|
DWORD dwDataType;
|
|
DWORD dwNodeID;
|
|
} MB_PROP;
|
|
|
|
IMSAdminBase* pMBCom;
|
|
CHAR szString[256];
|
|
int i;
|
|
|
|
METADATA_HANDLE hMeta = NULL;
|
|
METADATA_RECORD mdRecord;
|
|
|
|
HRESULT hr;
|
|
|
|
MB_PROP mbProperties[] =
|
|
{
|
|
{ L"Logging/Custom Logging/Date", IDS_DATE,
|
|
EXTLOG_DATE_ID, MD_LOGEXT_FIELD_MASK, MD_EXTLOG_DATE, MD_LOGCUSTOM_DATATYPE_LPSTR, 1},
|
|
|
|
{ L"Logging/Custom Logging/Time", IDS_TIME,
|
|
EXTLOG_TIME_ID, MD_LOGEXT_FIELD_MASK, MD_EXTLOG_TIME, MD_LOGCUSTOM_DATATYPE_LPSTR, 2},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties", IDS_EXTENDED_PROP,
|
|
NULL, MD_LOGEXT_FIELD_MASK, 0, MD_LOGCUSTOM_DATATYPE_LPSTR, 3},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Client IP Address", IDS_CLIENT_IP_ADDRESS,
|
|
EXTLOG_CLIENT_IP_ID, 0, MD_EXTLOG_CLIENT_IP, MD_LOGCUSTOM_DATATYPE_LPSTR, 5},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/User Name", IDS_USER_NAME,
|
|
EXTLOG_USERNAME_ID, 0, MD_EXTLOG_USERNAME, MD_LOGCUSTOM_DATATYPE_LPSTR, 6},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Service Name", IDS_SERVICE_NAME,
|
|
EXTLOG_SITE_NAME_ID, 0, MD_EXTLOG_SITE_NAME, MD_LOGCUSTOM_DATATYPE_LPSTR, 7},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Server Name", IDS_SERVER_NAME,
|
|
EXTLOG_COMPUTER_NAME_ID, 0, MD_EXTLOG_COMPUTER_NAME, MD_LOGCUSTOM_DATATYPE_LPSTR, 8},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Server IP", IDS_SERVER_IP,
|
|
EXTLOG_SERVER_IP_ID, 0, MD_EXTLOG_SERVER_IP, MD_LOGCUSTOM_DATATYPE_LPSTR, 9},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Server Port", IDS_SERVER_PORT,
|
|
EXTLOG_SERVER_PORT_ID, 0, MD_EXTLOG_SERVER_PORT, MD_LOGCUSTOM_DATATYPE_ULONG, 10},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Method", IDS_METHOD,
|
|
EXTLOG_METHOD_ID, 0, MD_EXTLOG_METHOD, MD_LOGCUSTOM_DATATYPE_LPSTR, 11},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/URI Stem", IDS_URI_STEM,
|
|
EXTLOG_URI_STEM_ID, 0, MD_EXTLOG_URI_STEM, MD_LOGCUSTOM_DATATYPE_LPSTR, 12},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/URI Query", IDS_URI_QUERY,
|
|
EXTLOG_URI_QUERY_ID, 0, MD_EXTLOG_URI_QUERY, MD_LOGCUSTOM_DATATYPE_LPSTR, 13},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Protocol Status", IDS_HTTP_STATUS,
|
|
EXTLOG_HTTP_STATUS_ID, 0, MD_EXTLOG_HTTP_STATUS, MD_LOGCUSTOM_DATATYPE_ULONG, 14},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Win32 Status", IDS_WIN32_STATUS,
|
|
EXTLOG_WIN32_STATUS_ID, 0, MD_EXTLOG_WIN32_STATUS, MD_LOGCUSTOM_DATATYPE_ULONG, 15},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Bytes Sent", IDS_BYTES_SENT,
|
|
EXTLOG_BYTES_SENT_ID, 0, MD_EXTLOG_BYTES_SENT, MD_LOGCUSTOM_DATATYPE_ULONG, 16},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Bytes Received", IDS_BYTES_RECEIVED,
|
|
EXTLOG_BYTES_RECV_ID, 0, MD_EXTLOG_BYTES_RECV, MD_LOGCUSTOM_DATATYPE_ULONG, 17},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Time Taken", IDS_TIME_TAKEN,
|
|
EXTLOG_TIME_TAKEN_ID, 0, MD_EXTLOG_TIME_TAKEN, MD_LOGCUSTOM_DATATYPE_ULONG, 18},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Protocol Version", IDS_PROTOCOL_VERSION,
|
|
EXTLOG_PROTOCOL_VERSION_ID, 0, MD_EXTLOG_PROTOCOL_VERSION, MD_LOGCUSTOM_DATATYPE_LPSTR, 19},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Host", IDS_HOST,
|
|
EXTLOG_HOST_ID, 0, EXTLOG_HOST, MD_LOGCUSTOM_DATATYPE_LPSTR, 20},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/User Agent", IDS_USER_AGENT,
|
|
EXTLOG_USER_AGENT_ID, 0, MD_EXTLOG_USER_AGENT, MD_LOGCUSTOM_DATATYPE_LPSTR, 21},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Cookie", IDS_COOKIE,
|
|
EXTLOG_COOKIE_ID, 0, MD_EXTLOG_COOKIE, MD_LOGCUSTOM_DATATYPE_LPSTR, 22},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Referer", IDS_REFERER,
|
|
EXTLOG_REFERER_ID, 0, MD_EXTLOG_REFERER, MD_LOGCUSTOM_DATATYPE_LPSTR, 23},
|
|
|
|
{ L"Logging/Custom Logging/Extended Properties/Protocol Substatus", IDS_HTTP_SUB_STATUS,
|
|
EXTLOG_HTTP_SUB_STATUS_ID, 0, MD_EXTLOG_HTTP_SUB_STATUS, MD_LOGCUSTOM_DATATYPE_ULONG, 32},
|
|
|
|
{ L"\0", 0, NULL, 0, 0, 0 },
|
|
};
|
|
|
|
//
|
|
// Open the metabase path
|
|
//
|
|
|
|
if ( FAILED( CoCreateInstance(GETAdminBaseCLSID(TRUE), NULL, CLSCTX_LOCAL_SERVER,
|
|
IID_IMSAdminBase, (void **)(&pMBCom) )))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
// Create the LM key
|
|
if ( FAILED( pMBCom->OpenKey( METADATA_MASTER_ROOT_HANDLE, L"/",
|
|
METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE, MB_TIMEOUT,
|
|
&hMeta) ))
|
|
{
|
|
// Create the LM key
|
|
pMBCom->Release();
|
|
return FALSE;
|
|
}
|
|
|
|
hr = pMBCom->AddKey( hMeta, L"LM");
|
|
if ( FAILED(hr) && (HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) != hr))
|
|
{
|
|
goto cleanup;
|
|
}
|
|
pMBCom->CloseKey(hMeta);
|
|
hMeta = NULL;
|
|
|
|
|
|
if ( FAILED( pMBCom->OpenKey( METADATA_MASTER_ROOT_HANDLE, L"LM",
|
|
METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE, MB_TIMEOUT,
|
|
&hMeta) ))
|
|
{
|
|
pMBCom->Release();
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Create the initial set of Keys.
|
|
//
|
|
|
|
hr = pMBCom->AddKey( hMeta, L"Logging");
|
|
|
|
if ( FAILED(hr) && (HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) != hr))
|
|
{
|
|
goto cleanup;
|
|
}
|
|
|
|
hr = pMBCom->AddKey( hMeta, L"Logging/Custom Logging");
|
|
|
|
if ( FAILED(hr) && (HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) != hr))
|
|
{
|
|
goto cleanup;
|
|
}
|
|
|
|
//
|
|
// Set all the properties
|
|
//
|
|
|
|
mdRecord.dwMDUserType = IIS_MD_UT_SERVER;
|
|
|
|
for (i=0; 0 != mbProperties[i].wcsPath[0]; i++)
|
|
{
|
|
|
|
hr = pMBCom->AddKey( hMeta, mbProperties[i].wcsPath);
|
|
|
|
if ( FAILED(hr) && (HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) != hr))
|
|
{
|
|
goto cleanup;
|
|
}
|
|
|
|
// don't overwrite it entry already exist.
|
|
if ( SUCCEEDED(hr) || (HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) != hr))
|
|
{
|
|
// We won't get here if the key already exists.
|
|
mdRecord.dwMDAttributes = METADATA_INHERIT; // name and header is not inheritable.
|
|
|
|
mdRecord.dwMDDataType = STRING_METADATA;
|
|
|
|
if ( (0 != mbProperties[i].dwNameString) &&
|
|
(0 < LoadString( hDLLInstance, mbProperties[i].dwNameString, szString, sizeof(szString)) )
|
|
)
|
|
{
|
|
mdRecord.dwMDIdentifier = MD_LOGCUSTOM_PROPERTY_NAME;
|
|
mdRecord.pbMDData = (PBYTE)A2W(szString);
|
|
mdRecord.dwMDDataLen = (DWORD)((sizeof(WCHAR)/sizeof(BYTE)) * (wcslen((LPWSTR) mdRecord.pbMDData)+1));
|
|
|
|
if ( FAILED(pMBCom->SetData( hMeta, mbProperties[i].wcsPath, &mdRecord)) )
|
|
{
|
|
goto cleanup;
|
|
}
|
|
}
|
|
|
|
if ( NULL != mbProperties[i].szHeaderName)
|
|
{
|
|
mdRecord.dwMDIdentifier = MD_LOGCUSTOM_PROPERTY_HEADER;
|
|
mdRecord.pbMDData = (PBYTE) (A2W(mbProperties[i].szHeaderName));
|
|
mdRecord.dwMDDataLen = (DWORD)((sizeof(WCHAR)/sizeof(BYTE)) * (wcslen((LPWSTR) mdRecord.pbMDData)+1));
|
|
|
|
if ( FAILED(pMBCom->SetData( hMeta, mbProperties[i].wcsPath, &mdRecord)) )
|
|
{
|
|
goto cleanup;
|
|
}
|
|
}
|
|
|
|
mdRecord.dwMDDataType = DWORD_METADATA;
|
|
mdRecord.dwMDDataLen = sizeof(DWORD);
|
|
|
|
if ( 0 != mbProperties[i].dwPropID)
|
|
{
|
|
mdRecord.dwMDIdentifier = MD_LOGCUSTOM_PROPERTY_ID;
|
|
mdRecord.pbMDData = (PBYTE) &(mbProperties[i].dwPropID);
|
|
|
|
if ( FAILED(pMBCom->SetData( hMeta, mbProperties[i].wcsPath, &mdRecord)) )
|
|
{
|
|
goto cleanup;
|
|
}
|
|
}
|
|
|
|
if ( 0 != mbProperties[i].dwPropMask)
|
|
{
|
|
mdRecord.dwMDIdentifier = MD_LOGCUSTOM_PROPERTY_MASK;
|
|
mdRecord.pbMDData = (PBYTE) &(mbProperties[i].dwPropMask);
|
|
|
|
if ( FAILED(pMBCom->SetData( hMeta, mbProperties[i].wcsPath, &mdRecord)) )
|
|
{
|
|
goto cleanup;
|
|
}
|
|
}
|
|
|
|
if ( 0 != mbProperties[i].dwNodeID)
|
|
{
|
|
mdRecord.dwMDIdentifier = MD_LOGCUSTOM_PROPERTY_NODE_ID;
|
|
mdRecord.pbMDData = (PBYTE) &(mbProperties[i].dwNodeID);
|
|
|
|
if ( FAILED(pMBCom->SetData( hMeta, mbProperties[i].wcsPath, &mdRecord)) )
|
|
{
|
|
goto cleanup;
|
|
}
|
|
}
|
|
|
|
mdRecord.dwMDIdentifier = MD_LOGCUSTOM_PROPERTY_DATATYPE;
|
|
mdRecord.pbMDData = (PBYTE) &(mbProperties[i].dwDataType);
|
|
|
|
if ( FAILED(pMBCom->SetData( hMeta, mbProperties[i].wcsPath, &mdRecord)) )
|
|
{
|
|
goto cleanup;
|
|
}
|
|
|
|
WCHAR wcsKeyType[] = L"IIsCustomLogModule";
|
|
|
|
MD_SET_DATA_RECORD ( &mdRecord,
|
|
MD_KEY_TYPE,
|
|
METADATA_NO_ATTRIBUTES,
|
|
IIS_MD_UT_SERVER,
|
|
STRING_METADATA,
|
|
sizeof(wcsKeyType),
|
|
wcsKeyType
|
|
);
|
|
|
|
if ( FAILED(pMBCom->SetData( hMeta, mbProperties[i].wcsPath, &mdRecord)) )
|
|
{
|
|
goto cleanup;
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Set the Key Type and Services List Property
|
|
//
|
|
|
|
{
|
|
WCHAR wcsKeyType[] = L"IIsCustomLogModule";
|
|
|
|
MD_SET_DATA_RECORD ( &mdRecord,
|
|
MD_KEY_TYPE,
|
|
METADATA_NO_ATTRIBUTES,
|
|
IIS_MD_UT_SERVER,
|
|
STRING_METADATA,
|
|
sizeof(wcsKeyType),
|
|
wcsKeyType
|
|
);
|
|
|
|
if ( FAILED(pMBCom->SetData( hMeta, L"Logging/Custom Logging", &mdRecord)) )
|
|
{
|
|
goto cleanup;
|
|
}
|
|
|
|
WCHAR wcsServices[] = L"W3SVC\0MSFTPSVC\0SMTPSVC\0NNTPSVC\0";
|
|
|
|
|
|
MD_SET_DATA_RECORD ( &mdRecord,
|
|
MD_LOGCUSTOM_SERVICES_STRING,
|
|
METADATA_INHERIT,
|
|
IIS_MD_UT_SERVER,
|
|
MULTISZ_METADATA,
|
|
sizeof(wcsServices),
|
|
wcsServices
|
|
);
|
|
|
|
if ( FAILED(pMBCom->SetData( hMeta, L"Logging/Custom Logging", &mdRecord)) )
|
|
{
|
|
goto cleanup;
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set the Admin ACL to allow everyone to read the /LM/Logging tree. This is to allow
|
|
// operators to effectively use the ILogScripting components.
|
|
//
|
|
|
|
if (FAILED(SetAdminACL(pMBCom, hMeta, L"Logging")))
|
|
{
|
|
goto cleanup;
|
|
}
|
|
if (NULL != hMeta)
|
|
{
|
|
pMBCom->CloseKey(hMeta);
|
|
}
|
|
pMBCom->Release();
|
|
return TRUE;
|
|
|
|
cleanup:
|
|
if (NULL != hMeta)
|
|
{
|
|
pMBCom->CloseKey(hMeta);
|
|
}
|
|
pMBCom->Release();
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
HRESULT SetAdminACL(
|
|
IMSAdminBase * pAdminBase,
|
|
METADATA_HANDLE hMeta,
|
|
LPWSTR wszKeyName
|
|
)
|
|
{
|
|
BOOL b = FALSE;
|
|
DWORD dwLength = 0;
|
|
|
|
PSECURITY_DESCRIPTOR pSD = NULL;
|
|
PSECURITY_DESCRIPTOR outpSD = NULL;
|
|
DWORD cboutpSD = 0;
|
|
PACL pACLNew = NULL;
|
|
DWORD cbACL = 0;
|
|
PSID pAdminsSID = NULL;
|
|
BOOL bWellKnownSID = FALSE;
|
|
METADATA_RECORD mdr;
|
|
HRESULT hr = NO_ERROR;
|
|
|
|
// Initialize a new security descriptor
|
|
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
|
|
// BugFix: 57647 Whistler
|
|
// Prefix bug pSD being used when NULL.
|
|
// EBK 5/5/2000
|
|
if (pSD == NULL)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto cleanup;
|
|
}
|
|
|
|
InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION);
|
|
|
|
// Get Local Admins Sid
|
|
GetPrincipalSID (_T("Administrators"), &pAdminsSID, &bWellKnownSID);
|
|
|
|
// Initialize a new ACL, which only contains 2 aaace
|
|
cbACL = sizeof(ACL) +
|
|
(sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(pAdminsSID) - sizeof(DWORD));
|
|
pACLNew = (PACL) LocalAlloc(LPTR, cbACL);
|
|
|
|
// BugFix: 57646 Whistler
|
|
// Prefix bug pACLNew being used when NULL.
|
|
// EBK 5/5/2000
|
|
if (pACLNew == NULL)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto cleanup;
|
|
}
|
|
|
|
InitializeAcl(pACLNew, cbACL, ACL_REVISION);
|
|
|
|
AddAccessAllowedAce(
|
|
pACLNew,
|
|
ACL_REVISION,
|
|
MD_ACR_READ | MD_ACR_WRITE | MD_ACR_RESTRICTED_WRITE | MD_ACR_UNSECURE_PROPS_READ | MD_ACR_ENUM_KEYS | MD_ACR_WRITE_DAC,
|
|
pAdminsSID);
|
|
|
|
// Add the ACL to the security descriptor
|
|
b = SetSecurityDescriptorDacl(pSD, TRUE, pACLNew, FALSE);
|
|
b = SetSecurityDescriptorOwner(pSD, pAdminsSID, TRUE);
|
|
b = SetSecurityDescriptorGroup(pSD, pAdminsSID, TRUE);
|
|
|
|
// Security descriptor blob must be self relative
|
|
b = MakeSelfRelativeSD(pSD, outpSD, &cboutpSD);
|
|
outpSD = (PSECURITY_DESCRIPTOR)GlobalAlloc(GPTR, cboutpSD);
|
|
|
|
// BugFix: 57648, 57649 Whistler
|
|
// Prefix bug outpSD being used when NULL.
|
|
// EBK 5/5/2000
|
|
if (outpSD == NULL)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto cleanup;
|
|
}
|
|
|
|
// BugFix: 57649 Whistler
|
|
// Prefix bug outpSD being used when not inintalized.
|
|
// EmilyK 2/19/2001
|
|
if ( !MakeSelfRelativeSD( pSD, outpSD, &cboutpSD ) )
|
|
{
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
goto cleanup;
|
|
}
|
|
|
|
|
|
// below this modify pSD to outpSD
|
|
|
|
// Apply the new security descriptor to the file
|
|
dwLength = GetSecurityDescriptorLength(outpSD);
|
|
|
|
mdr.dwMDIdentifier = MD_ADMIN_ACL;
|
|
mdr.dwMDAttributes = METADATA_INHERIT | METADATA_REFERENCE | METADATA_SECURE;
|
|
mdr.dwMDUserType = IIS_MD_UT_SERVER;
|
|
mdr.dwMDDataType = BINARY_METADATA;
|
|
mdr.dwMDDataLen = dwLength;
|
|
mdr.pbMDData = (LPBYTE)outpSD;
|
|
|
|
hr = pAdminBase->SetData(hMeta, wszKeyName, &mdr);
|
|
|
|
cleanup:
|
|
// both of Administrators and Everyone are well-known SIDs, use FreeSid() to free them.
|
|
if (outpSD)
|
|
GlobalFree(outpSD);
|
|
|
|
if (pAdminsSID)
|
|
FreeSid(pAdminsSID);
|
|
if (pSD)
|
|
LocalFree((HLOCAL) pSD);
|
|
if (pACLNew)
|
|
LocalFree((HLOCAL) pACLNew);
|
|
|
|
return (hr);
|
|
}
|
|
|
|
|
|
DWORD
|
|
GetPrincipalSID (
|
|
LPTSTR Principal,
|
|
PSID *Sid,
|
|
BOOL *pbWellKnownSID
|
|
)
|
|
{
|
|
SID_IDENTIFIER_AUTHORITY SidIdentifierNTAuthority = SECURITY_NT_AUTHORITY;
|
|
SID_IDENTIFIER_AUTHORITY SidIdentifierWORLDAuthority = SECURITY_WORLD_SID_AUTHORITY;
|
|
PSID_IDENTIFIER_AUTHORITY pSidIdentifierAuthority = NULL;
|
|
BYTE Count = 0;
|
|
DWORD dwRID[8];
|
|
|
|
*pbWellKnownSID = TRUE;
|
|
memset(&(dwRID[0]), 0, 8 * sizeof(DWORD));
|
|
if ( lstrcmp(Principal,_T("Administrators")) == 0 ) {
|
|
// Administrators group
|
|
pSidIdentifierAuthority = &SidIdentifierNTAuthority;
|
|
Count = 2;
|
|
dwRID[0] = SECURITY_BUILTIN_DOMAIN_RID;
|
|
dwRID[1] = DOMAIN_ALIAS_RID_ADMINS;
|
|
} else if ( lstrcmp(Principal,_T("System")) == 0) {
|
|
// SYSTEM
|
|
pSidIdentifierAuthority = &SidIdentifierNTAuthority;
|
|
Count = 1;
|
|
dwRID[0] = SECURITY_LOCAL_SYSTEM_RID;
|
|
} else if ( lstrcmp(Principal,_T("Interactive")) == 0) {
|
|
// INTERACTIVE
|
|
pSidIdentifierAuthority = &SidIdentifierNTAuthority;
|
|
Count = 1;
|
|
dwRID[0] = SECURITY_INTERACTIVE_RID;
|
|
} else if ( lstrcmp(Principal,_T("Everyone")) == 0) {
|
|
// Everyone
|
|
pSidIdentifierAuthority = &SidIdentifierWORLDAuthority;
|
|
Count = 1;
|
|
dwRID[0] = SECURITY_WORLD_RID;
|
|
} else {
|
|
*pbWellKnownSID = FALSE;
|
|
}
|
|
|
|
if (*pbWellKnownSID) {
|
|
if ( !AllocateAndInitializeSid(pSidIdentifierAuthority,
|
|
(BYTE)Count,
|
|
dwRID[0],
|
|
dwRID[1],
|
|
dwRID[2],
|
|
dwRID[3],
|
|
dwRID[4],
|
|
dwRID[5],
|
|
dwRID[6],
|
|
dwRID[7],
|
|
Sid) )
|
|
return GetLastError();
|
|
} else {
|
|
// get regular account sid
|
|
DWORD sidSize;
|
|
TCHAR refDomain [256];
|
|
DWORD refDomainSize;
|
|
DWORD returnValue;
|
|
SID_NAME_USE snu;
|
|
|
|
sidSize = 0;
|
|
refDomainSize = 255;
|
|
|
|
LookupAccountName (NULL,
|
|
Principal,
|
|
*Sid,
|
|
&sidSize,
|
|
refDomain,
|
|
&refDomainSize,
|
|
&snu);
|
|
|
|
returnValue = GetLastError();
|
|
if (returnValue != ERROR_INSUFFICIENT_BUFFER)
|
|
return returnValue;
|
|
|
|
*Sid = (PSID) malloc (sidSize);
|
|
refDomainSize = 255;
|
|
|
|
if (!LookupAccountName (NULL,
|
|
Principal,
|
|
*Sid,
|
|
&sidSize,
|
|
refDomain,
|
|
&refDomainSize,
|
|
&snu))
|
|
{
|
|
return GetLastError();
|
|
}
|
|
}
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
|