395 lines
10 KiB
C++
395 lines
10 KiB
C++
/*===================================================================
|
|
Microsoft ASP
|
|
|
|
Microsoft Confidential.
|
|
Copyright 1997 Microsoft Corporation. All Rights Reserved.
|
|
|
|
Component: Package Management Tool
|
|
|
|
File: main.cpp
|
|
|
|
Owner: leijin
|
|
|
|
Note:
|
|
===================================================================*/
|
|
|
|
|
|
#include <tchar.h>
|
|
|
|
#include "admutil.h"
|
|
#include <stdio.h>
|
|
#include <objbase.h>
|
|
#include <initguid.h>
|
|
|
|
//#ifdef _WAMREG_LINK_DIRECT
|
|
//#include "..\wmrgexp.h"
|
|
//#endif
|
|
|
|
#include <iwamreg.h>
|
|
|
|
#define SIZE_STRING_BUFFER 1024
|
|
|
|
|
|
void CAdmUtil::OpenWamAdm (const CString & strComputer)
|
|
{
|
|
IClassFactory * pcsfFactory = NULL;
|
|
COSERVERINFO csiMachineName;
|
|
COSERVERINFO *pcsiParam = NULL;
|
|
OLECHAR rgchMachineName[MAX_PATH];
|
|
|
|
//release previous interface if needed
|
|
if(pIWamAdm!=0)
|
|
{
|
|
//reuse the interface
|
|
return;
|
|
//pIWamAdm->Release();
|
|
//pIWamAdm=0;
|
|
}
|
|
//convert to OLECHAR[];
|
|
#if UNICODE
|
|
wsprintfW( rgchMachineName, L"%s", LPCTSTR(strComputer));
|
|
#else
|
|
wsprintfW( rgchMachineName, L"%S", LPCTSTR(strComputer));
|
|
#endif
|
|
|
|
//fill the structure for CoGetClassObject
|
|
ZeroMemory( &csiMachineName, sizeof(csiMachineName) );
|
|
// csiMachineName.pAuthInfo = NULL;
|
|
// csiMachineName.dwFlags = 0;
|
|
// csiMachineName.pServerInfoExt = NULL;
|
|
pcsiParam = &csiMachineName;
|
|
csiMachineName.pwszName = (strComputer.IsEmpty())?NULL:rgchMachineName;
|
|
|
|
hresError = CoGetClassObject(CLSID_WamAdmin, CLSCTX_SERVER, pcsiParam,
|
|
IID_IClassFactory, (void**) &pcsfFactory);
|
|
|
|
if (FAILED(hresError))
|
|
{
|
|
Error(_T("Failed to CoGetClassObject of WamAdm object"));
|
|
}
|
|
else {
|
|
hresError = pcsfFactory->CreateInstance(NULL, IID_IWamAdmin, (void **) &pIWamAdm);
|
|
if (FAILED(hresError)) Error(_T("Failed to CreateInstance of WamAdm object"));
|
|
pcsfFactory->Release();
|
|
}
|
|
}
|
|
|
|
void CAdmUtil::CloseWamAdm (void)
|
|
{
|
|
if(pIWamAdm!=0)
|
|
{
|
|
pIWamAdm->Release();
|
|
pIWamAdm=0;
|
|
}
|
|
}
|
|
|
|
void CAdmUtil::AppCreateInProc(const _TCHAR* szPath,const CString & strComputer)
|
|
{
|
|
WCHAR wszMetabasePath[SIZE_STRING_BUFFER];
|
|
HRESULT hr = NOERROR;
|
|
//
|
|
INT cSize = 0;
|
|
INT cch = 0;
|
|
#ifndef UNICODE
|
|
cSize = MultiByteToWideChar(0, 0, szPath, -1, wszMetabasePath, SIZE_STRING_BUFFER);
|
|
if (cSize == 0)
|
|
{
|
|
hresError = GetLastError();
|
|
if (hresError == ERROR_INSUFFICIENT_BUFFER)
|
|
{
|
|
Error(_T("metabase path exceeds 1024 chars"));
|
|
}
|
|
else
|
|
Error("");
|
|
return;
|
|
}
|
|
#else
|
|
wcscpy(wszMetabasePath,szPath);
|
|
#endif
|
|
|
|
OpenWamAdm(strComputer);
|
|
|
|
if (SUCCEEDED(hresError) && pIWamAdm!=0)
|
|
{
|
|
CloseObject_hmd(); //close reusable handle; it may conflict with WAM
|
|
hresError = pIWamAdm->AppCreate(wszMetabasePath, TRUE);
|
|
if (FAILED(hresError))
|
|
{
|
|
Error(_T("create failed"));
|
|
}
|
|
else
|
|
{
|
|
Print(_T("application created\n"));
|
|
}
|
|
}
|
|
|
|
//CloseWamAdm();
|
|
|
|
return;
|
|
}
|
|
|
|
void CAdmUtil::AppCreateOutProc(const _TCHAR* szPath,const CString & strComputer)
|
|
{
|
|
WCHAR wszMetabasePath[SIZE_STRING_BUFFER];
|
|
|
|
|
|
INT cSize = 0;
|
|
INT cch = 0;
|
|
|
|
#ifndef UNICODE
|
|
cSize = MultiByteToWideChar(0, 0, szPath, -1, wszMetabasePath, SIZE_STRING_BUFFER);
|
|
if (cSize == 0)
|
|
{
|
|
hresError = GetLastError();
|
|
if (hresError == ERROR_INSUFFICIENT_BUFFER)
|
|
{
|
|
Error(_T("metabase path exceeds 1024 chars"));
|
|
}
|
|
else
|
|
Error("");
|
|
return;
|
|
}
|
|
#else
|
|
wcscpy(wszMetabasePath,szPath);
|
|
#endif
|
|
OpenWamAdm(strComputer);
|
|
if (SUCCEEDED(hresError)&& pIWamAdm!=0)
|
|
{
|
|
CloseObject_hmd(); //close reusable handle; it may conflict with WAM
|
|
hresError = pIWamAdm->AppCreate(wszMetabasePath, FALSE);
|
|
if (FAILED(hresError))
|
|
{
|
|
Error(_T("create failed"));
|
|
}
|
|
else
|
|
{
|
|
Print(_T("application created\n"));
|
|
}
|
|
}
|
|
//CloseWamAdm();
|
|
return;
|
|
}
|
|
|
|
void CAdmUtil::AppDelete(const _TCHAR* szPath,const CString & strComputer)
|
|
{
|
|
WCHAR wszMetabasePath[SIZE_STRING_BUFFER];
|
|
|
|
|
|
INT cSize = 0;
|
|
INT cch = 0;
|
|
|
|
#ifndef UNICODE
|
|
cSize = MultiByteToWideChar(0, 0, szPath, -1, wszMetabasePath, SIZE_STRING_BUFFER);
|
|
if (cSize == 0)
|
|
{
|
|
hresError = GetLastError();
|
|
if (hresError == ERROR_INSUFFICIENT_BUFFER)
|
|
{
|
|
Error(_T("metabase path exceeds 1024 chars"));
|
|
}
|
|
else
|
|
Error("");
|
|
return;
|
|
}
|
|
#else
|
|
wcscpy(wszMetabasePath,szPath);
|
|
#endif
|
|
OpenWamAdm(strComputer);
|
|
if (SUCCEEDED(hresError)&& pIWamAdm!=0)
|
|
{
|
|
CloseObject_hmd(); //close reusable handle; it may conflict with WAM
|
|
hresError = pIWamAdm->AppDelete(wszMetabasePath,FALSE);
|
|
if (FAILED(hresError))
|
|
{
|
|
Error(_T("delete failed"));
|
|
}
|
|
else
|
|
{
|
|
Print(_T("application deleted\n"));
|
|
}
|
|
}
|
|
//CloseWamAdm();
|
|
return;
|
|
}
|
|
|
|
void CAdmUtil::AppRename(CAdmNode& a_AdmNode, CAdmNode& a_AdmDstNode, const CString & strComputer)
|
|
{
|
|
WCHAR wszMetabasePath[SIZE_STRING_BUFFER];
|
|
|
|
WCHAR wszMetabaseDstPath[SIZE_STRING_BUFFER];
|
|
|
|
INT cSize = 0;
|
|
INT cch = 0;
|
|
|
|
#ifndef UNICODE
|
|
cSize = MultiByteToWideChar(0, 0, LPCTSTR(a_AdmNode.GetLMNodePath()), -1, wszMetabasePath, SIZE_STRING_BUFFER);
|
|
if (cSize == 0)
|
|
{
|
|
hresError = GetLastError();
|
|
if (hresError == ERROR_INSUFFICIENT_BUFFER)
|
|
{
|
|
Error(_T("metabase path exceeds 1024 chars"));
|
|
}
|
|
else
|
|
Error("");
|
|
return;
|
|
}
|
|
|
|
wcscat(wszMetabaseDstPath,L"/");
|
|
cSize = MultiByteToWideChar(0, 0, LPCTSTR(a_AdmDstNode.GetLMNodePath()), -1, wszMetabaseDstPath, SIZE_STRING_BUFFER);
|
|
if (cSize == 0)
|
|
{
|
|
hresError = GetLastError();
|
|
if (hresError == ERROR_INSUFFICIENT_BUFFER)
|
|
{
|
|
Error(_T("metabase path exceeds 1024 chars"));
|
|
}
|
|
else
|
|
Error("");
|
|
return;
|
|
}
|
|
wcscat(wszMetabaseDstPath,L"/");
|
|
|
|
#else
|
|
wcscpy(wszMetabasePath,LPCTSTR(a_AdmNode.GetLMNodePath()));
|
|
wcscpy(wszMetabaseDstPath,LPCTSTR(a_AdmDstNode.GetLMNodePath()));
|
|
#endif
|
|
|
|
|
|
OpenWamAdm(strComputer);
|
|
if (SUCCEEDED(hresError)&& pIWamAdm!=0)
|
|
{
|
|
CloseObject_hmd(); //close reusable handle; it may conflict with WAM
|
|
hresError = pIWamAdm->AppDeleteRecoverable(wszMetabasePath,TRUE /*Recursive*/);
|
|
if (FAILED(hresError))
|
|
{
|
|
Error(_T("AppDeleteRecoverable() failed"));
|
|
}
|
|
else
|
|
{
|
|
RenameObject(a_AdmNode,a_AdmDstNode);
|
|
if(FAILED(QueryLastHresError()))
|
|
{
|
|
Error(_T("node failed to be renamed"));
|
|
}
|
|
else
|
|
{
|
|
CloseObject_hmd(); //close reusable handle; it may conflict with WAM
|
|
hresError = pIWamAdm->AppRecover(wszMetabaseDstPath,TRUE /*Recursive*/);
|
|
if (FAILED(hresError))
|
|
{
|
|
Error(_T("AppRecover() failed"));
|
|
}
|
|
else
|
|
{
|
|
Print(_T("application renamed\n"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//CloseWamAdm();
|
|
return;
|
|
}
|
|
|
|
|
|
void CAdmUtil::AppUnLoad(const _TCHAR* szPath,const CString & strComputer)
|
|
{
|
|
WCHAR wszMetabasePath[SIZE_STRING_BUFFER];
|
|
|
|
|
|
INT cSize = 0;
|
|
INT cch = 0;
|
|
|
|
#ifndef UNICODE
|
|
cSize = MultiByteToWideChar(0, 0, szPath, -1, wszMetabasePath, SIZE_STRING_BUFFER);
|
|
if (cSize == 0)
|
|
{
|
|
hresError = GetLastError();
|
|
if (hresError == ERROR_INSUFFICIENT_BUFFER)
|
|
{
|
|
Error(_T("metabase path exceeds 1024 chars"));
|
|
}
|
|
else
|
|
Error("");
|
|
return;
|
|
}
|
|
#else
|
|
wcscpy(wszMetabasePath,szPath);
|
|
#endif
|
|
OpenWamAdm(strComputer);
|
|
if (SUCCEEDED(hresError)&& pIWamAdm!=0)
|
|
{
|
|
CloseObject_hmd(); //close reusable handle; it may conflict with WAM
|
|
hresError = pIWamAdm->AppUnLoad(wszMetabasePath,FALSE);
|
|
if (FAILED(hresError))
|
|
{
|
|
Error(_T("Unload application failed"));
|
|
}
|
|
else
|
|
{
|
|
Print(_T("application unloaded\n"));
|
|
}
|
|
|
|
}
|
|
//CloseWamAdm();
|
|
return;
|
|
}
|
|
|
|
void CAdmUtil::AppGetStatus(const _TCHAR* szPath,const CString & strComputer)
|
|
{
|
|
WCHAR wszMetabasePath[SIZE_STRING_BUFFER];
|
|
|
|
|
|
INT cSize = 0;
|
|
INT cch = 0;
|
|
|
|
#ifndef UNICODE
|
|
cSize = MultiByteToWideChar(0, 0, szPath, -1, wszMetabasePath, SIZE_STRING_BUFFER);
|
|
if (cSize == 0)
|
|
{
|
|
hresError = GetLastError();
|
|
if (hresError == ERROR_INSUFFICIENT_BUFFER)
|
|
{
|
|
Error(_T("The Metabase path exceeds 1024 chars"));
|
|
}
|
|
else
|
|
Error("");
|
|
return;
|
|
}
|
|
#else
|
|
wcscpy(wszMetabasePath,szPath);
|
|
#endif
|
|
OpenWamAdm(strComputer);
|
|
if (SUCCEEDED(hresError)&& pIWamAdm!=0)
|
|
{
|
|
DWORD dwStatus;
|
|
CloseObject_hmd(); //close reusable handle; it may conflict with WAM
|
|
hresError = pIWamAdm->AppGetStatus(wszMetabasePath, &dwStatus);
|
|
if (FAILED(hresError))
|
|
{
|
|
Error(_T("GetStatus of application %s failed"));
|
|
}
|
|
else
|
|
{
|
|
if (dwStatus == APPSTATUS_NOTDEFINED)
|
|
{
|
|
Print(_T("Application is not defined\n"));
|
|
}
|
|
else if (dwStatus == APPSTATUS_STOPPED)
|
|
{
|
|
Print(_T("Application is stopped\n"));
|
|
}
|
|
else if (dwStatus == APPSTATUS_RUNNING)
|
|
{
|
|
Print(_T("Application is running\n"));
|
|
}
|
|
else
|
|
{
|
|
Print(_T("Application is in unknown state\n"));
|
|
}
|
|
}
|
|
}
|
|
//CloseWamAdm();
|
|
return;
|
|
}
|