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.
604 lines
12 KiB
604 lines
12 KiB
//*************************************************************
|
|
//
|
|
// Copyright (c) Microsoft Corporation 1998
|
|
// All rights reserved
|
|
//
|
|
// manapp.hxx
|
|
//
|
|
//*************************************************************
|
|
|
|
#if !defined(__MANAPP_HXX__)
|
|
#define __MANAPP_HXX__
|
|
|
|
typedef struct
|
|
{
|
|
GUID* pCategory; /* IN */
|
|
MANAGED_APPLIST* pAppList; /* IN */
|
|
HANDLE hUserToken; /* IN */
|
|
HANDLE hEventAppsEnumerated; /* IN */
|
|
error_status_t Status; /* OUT */
|
|
} ARPCONTEXT;
|
|
|
|
#define PACKAGEINFO_ALLOC_COUNT 20
|
|
|
|
//
|
|
// The prefix to the scope of management is always "LDAP://" --
|
|
// this constant refers to the length of that prefix
|
|
//
|
|
#define SOMID_PREFIX_LEN 7
|
|
|
|
extern "C"
|
|
DWORD
|
|
WINAPI
|
|
ForceSyncFgPolicy( LPWSTR szUserSid );
|
|
|
|
|
|
class CGPOInfo;
|
|
|
|
class CGPOInfoList : public CList
|
|
{
|
|
public:
|
|
~CGPOInfoList();
|
|
|
|
BOOL
|
|
Add(
|
|
PGROUP_POLICY_OBJECT pGPO
|
|
);
|
|
|
|
CGPOInfo *
|
|
Find(
|
|
WCHAR * pwszGPOId
|
|
);
|
|
|
|
int
|
|
Compare(
|
|
WCHAR * pwszGPOId1,
|
|
WCHAR * pwszGPOId2
|
|
);
|
|
};
|
|
|
|
class CGPOInfo : public CListItem
|
|
{
|
|
friend class CGPOInfoList;
|
|
friend class CManagedAppProcessor;
|
|
|
|
public:
|
|
CGPOInfo(
|
|
PGROUP_POLICY_OBJECT pGPOInfo,
|
|
BOOL & bStatus
|
|
);
|
|
|
|
~CGPOInfo();
|
|
|
|
WCHAR* GetSOMPath()
|
|
{
|
|
return _pwszSOMPath;
|
|
}
|
|
|
|
WCHAR* GetGPOPath()
|
|
{
|
|
return _pwszGPOPath;
|
|
}
|
|
|
|
WCHAR* GetGPOName()
|
|
{
|
|
return _pwszGPOName;
|
|
}
|
|
|
|
private:
|
|
WCHAR * _pwszGPOId;
|
|
WCHAR * _pwszGPOName;
|
|
WCHAR * _pwszGPOPath;
|
|
WCHAR* _pwszSOMPath;
|
|
};
|
|
|
|
class CRsopAppContext : public CRsopContext
|
|
{
|
|
public:
|
|
|
|
enum
|
|
{
|
|
NONE,
|
|
POLICY_REFRESH,
|
|
ARPLIST,
|
|
INSTALL,
|
|
REMOVAL
|
|
};
|
|
|
|
enum
|
|
{
|
|
DEMAND_INSTALL_NAME,
|
|
DEMAND_INSTALL_CLSID,
|
|
DEMAND_INSTALL_PROGID,
|
|
DEMAND_INSTALL_FILEEXT,
|
|
DEMAND_INSTALL_NONE
|
|
};
|
|
|
|
CRsopAppContext() :
|
|
CRsopContext( APPMGMTEXTENSIONGUID ),
|
|
_dwContext( NONE ),
|
|
_dwInstallType( DEMAND_INSTALL_NONE ),
|
|
_wszDemandSpec( NULL ),
|
|
_bTransition( FALSE ),
|
|
_bRemovalPurge( FALSE ),
|
|
_bRemoveGPOApps( FALSE ),
|
|
_bForcedRefresh( FALSE ),
|
|
_dwCurrentRsopVersion( 0 ),
|
|
_hEventAppsEnumerated( NULL ),
|
|
_StatusAbort( ERROR_SUCCESS )
|
|
{}
|
|
|
|
CRsopAppContext(
|
|
DWORD dwContext,
|
|
HANDLE hEventAppsEnumerated = NULL,
|
|
APPKEY* pAppType = NULL );
|
|
|
|
CRsopAppContext( PRSOP_TARGET pRsopTarget, BOOL bReportingMode ) :
|
|
CRsopContext( pRsopTarget, bReportingMode, APPMGMTEXTENSIONGUID ),
|
|
_dwContext( POLICY_REFRESH ),
|
|
_dwInstallType( DEMAND_INSTALL_NONE ),
|
|
_wszDemandSpec( NULL ),
|
|
_bTransition( FALSE ),
|
|
_bRemovalPurge( FALSE ),
|
|
_bRemoveGPOApps( FALSE ),
|
|
_bForcedRefresh( FALSE ),
|
|
_dwCurrentRsopVersion( 0 ),
|
|
_hEventAppsEnumerated( NULL ),
|
|
_StatusAbort( ERROR_SUCCESS )
|
|
{}
|
|
|
|
CRsopAppContext(
|
|
IWbemServices* pWbemServices,
|
|
BOOL bTransition,
|
|
HRESULT* phrLoggingStatus ) :
|
|
CRsopContext( pWbemServices, phrLoggingStatus, APPMGMTEXTENSIONGUID ),
|
|
_dwContext( POLICY_REFRESH ),
|
|
_dwInstallType( DEMAND_INSTALL_NONE ),
|
|
_wszDemandSpec( NULL ),
|
|
_bTransition( bTransition ),
|
|
_bRemovalPurge( TRUE ),
|
|
_bRemoveGPOApps( FALSE ),
|
|
_bForcedRefresh ( FALSE ),
|
|
_dwCurrentRsopVersion( 0 ),
|
|
_hEventAppsEnumerated( NULL ),
|
|
_StatusAbort( ERROR_SUCCESS )
|
|
{}
|
|
|
|
~CRsopAppContext();
|
|
|
|
void InitializeRsopContext(
|
|
HANDLE hUserToken,
|
|
HKEY hkUser,
|
|
BOOL bForcedRefresh,
|
|
BOOL* pbNoChanges
|
|
);
|
|
|
|
DWORD
|
|
GetContext()
|
|
{
|
|
return _dwContext;
|
|
}
|
|
|
|
DWORD GetDemandSpec( WCHAR** ppwszDemandSpec )
|
|
{
|
|
*ppwszDemandSpec = _wszDemandSpec;
|
|
return _dwInstallType;
|
|
}
|
|
|
|
BOOL Transition()
|
|
{
|
|
return _bTransition;
|
|
}
|
|
|
|
BOOL
|
|
PurgeRemovalEntries()
|
|
{
|
|
return _bRemovalPurge;
|
|
}
|
|
|
|
void
|
|
ResetRemovalPurge()
|
|
{
|
|
_bRemovalPurge = FALSE;
|
|
}
|
|
|
|
void
|
|
SetGPOAppAdd()
|
|
{
|
|
_bRemoveGPOApps = FALSE;
|
|
}
|
|
|
|
void
|
|
SetGPOAppRemoval()
|
|
{
|
|
_bRemoveGPOApps = TRUE;
|
|
}
|
|
|
|
BOOL
|
|
RemoveGPOApps()
|
|
{
|
|
return _bRemoveGPOApps;
|
|
}
|
|
|
|
BOOL
|
|
ForcedRefresh()
|
|
{
|
|
return _bForcedRefresh;
|
|
}
|
|
|
|
HRESULT
|
|
MoveAppContextState( CRsopAppContext* pRsopContext );
|
|
|
|
HRESULT
|
|
SetARPContext();
|
|
|
|
DWORD
|
|
WriteCurrentRsopVersion( HKEY hkUser );
|
|
|
|
void
|
|
SetPolicyAborted( DWORD Status );
|
|
|
|
BOOL
|
|
HasPolicyAborted();
|
|
|
|
void
|
|
SetAppsEnumerated();
|
|
|
|
private:
|
|
|
|
//
|
|
// Note -- if a new data member is added below, then
|
|
// MoveAppContextState needs to be updated in order to take it
|
|
// into account
|
|
//
|
|
|
|
DWORD _dwContext;
|
|
DWORD _dwInstallType;
|
|
WCHAR* _wszDemandSpec;
|
|
BOOL _bTransition;
|
|
BOOL _bRemovalPurge;
|
|
BOOL _bRemoveGPOApps;
|
|
BOOL _bForcedRefresh;
|
|
DWORD _dwCurrentRsopVersion;
|
|
HANDLE _hEventAppsEnumerated; // event created outside this object, should not be freed by this object
|
|
DWORD _StatusAbort; // This is set to something other than ERROR_SUCCESS if
|
|
// policy processing aborted before we even tried to apply
|
|
// (e.g. install, assign, uninstall) the app.
|
|
};
|
|
|
|
class CManagedAppProcessor
|
|
{
|
|
public:
|
|
|
|
CManagedAppProcessor(
|
|
DWORD dwFlags,
|
|
HANDLE hUserToken,
|
|
HKEY hKeyRoot,
|
|
PFNSTATUSMESSAGECALLBACK pfnStatusCallback,
|
|
BOOL bIncludeLegacy,
|
|
BOOL bRegularPolicyRun,
|
|
CRsopAppContext * pRsopContext,
|
|
DWORD & Status
|
|
);
|
|
|
|
~CManagedAppProcessor();
|
|
|
|
BOOL
|
|
AddGPO(
|
|
PGROUP_POLICY_OBJECT pGPOInfo
|
|
);
|
|
|
|
BOOL AddGPOList(
|
|
PGROUP_POLICY_OBJECT pGPOInfo
|
|
);
|
|
|
|
DWORD
|
|
Delete();
|
|
|
|
DWORD
|
|
Process();
|
|
|
|
inline BOOL
|
|
IsUserPolicy()
|
|
{
|
|
return _bUser;
|
|
}
|
|
|
|
inline BOOL
|
|
NoChanges()
|
|
{
|
|
return _bNoChanges;
|
|
}
|
|
|
|
inline BOOL
|
|
Async()
|
|
{
|
|
return _bAsync;
|
|
}
|
|
|
|
inline DWORD
|
|
ErrorReason()
|
|
{
|
|
return _ErrorReason;
|
|
}
|
|
|
|
inline BOOL
|
|
ARPList()
|
|
{
|
|
return _bARPList;
|
|
}
|
|
|
|
inline BOOL
|
|
RegularPolicyRun()
|
|
{
|
|
return _bRegularPolicyRun;
|
|
}
|
|
|
|
inline BOOL
|
|
IsRemovingPolicies()
|
|
{
|
|
return _bDeleteGPOs;
|
|
}
|
|
|
|
inline CRsopAppContext*
|
|
GetRsopContext()
|
|
{
|
|
return &_RsopContext;
|
|
}
|
|
|
|
inline WCHAR *
|
|
LocalScriptDir()
|
|
{
|
|
return _pwszLocalPath;
|
|
}
|
|
|
|
inline HANDLE
|
|
UserToken()
|
|
{
|
|
return _hUserToken;
|
|
}
|
|
|
|
inline HKEY
|
|
RootKey()
|
|
{
|
|
return _hkRoot;
|
|
}
|
|
|
|
inline HKEY
|
|
PolicyKey()
|
|
{
|
|
return _hkPolicy;
|
|
}
|
|
|
|
inline HKEY
|
|
AppmgmtKey()
|
|
{
|
|
return _hkAppmgmt;
|
|
}
|
|
|
|
inline CGPOInfoList &
|
|
GPOList()
|
|
{
|
|
return _GPOs;
|
|
}
|
|
|
|
inline CAppList &
|
|
AppList()
|
|
{
|
|
return _Apps;
|
|
}
|
|
|
|
inline CAppList &
|
|
ScriptList()
|
|
{
|
|
return _LocalScripts;
|
|
}
|
|
|
|
inline void
|
|
LogonMsgApplying()
|
|
{
|
|
LogonMsg( IDS_STATUS_APPLY );
|
|
}
|
|
|
|
inline void
|
|
LogonMsgDefault()
|
|
{
|
|
if ( _bUser )
|
|
LogonMsg( IDS_STATUS_USER_SETTINGS );
|
|
else
|
|
LogonMsg( IDS_STATUS_COMPUTER_SETTINGS );
|
|
}
|
|
|
|
inline void
|
|
LogonMsgInstall(
|
|
WCHAR * pwszApp
|
|
)
|
|
{
|
|
LogonMsg( IDS_STATUS_INSTALL, pwszApp );
|
|
}
|
|
|
|
inline void
|
|
LogonMsgUninstall(
|
|
WCHAR * pwszApp
|
|
)
|
|
{
|
|
LogonMsg( IDS_STATUS_UNINSTALL, pwszApp );
|
|
}
|
|
|
|
inline DWORD
|
|
Impersonate()
|
|
{
|
|
if ( ! GetRsopContext()->IsPlanningModeEnabled() && _bUser && ! ImpersonateLoggedOnUser( _hUserToken ) )
|
|
{
|
|
DebugMsg((DM_WARNING, IDS_NOIMPERSONATE, GetLastError()));
|
|
return GetLastError();
|
|
}
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
inline void
|
|
Revert()
|
|
{
|
|
if ( ! GetRsopContext()->IsPlanningModeEnabled() && _bUser )
|
|
RevertToSelf();
|
|
}
|
|
|
|
DWORD
|
|
GetOrderedLocalAppList(
|
|
CAppList & AppList
|
|
);
|
|
|
|
DWORD
|
|
GetLocalScriptAppList(
|
|
CAppList & AppList
|
|
);
|
|
|
|
DWORD
|
|
LoadPolicyList();
|
|
|
|
DWORD
|
|
SetPolicyListFromGPOList(
|
|
PGROUP_POLICY_OBJECT pGPOList
|
|
);
|
|
|
|
DWORD
|
|
MergePolicyList();
|
|
|
|
DWORD
|
|
GetManagedApplications(
|
|
GUID * pCategory,
|
|
ARPCONTEXT* pArpContext
|
|
);
|
|
|
|
void
|
|
WriteRsopLogs();
|
|
|
|
private:
|
|
|
|
void
|
|
LogonMsg(
|
|
DWORD MsgId,
|
|
...
|
|
);
|
|
|
|
DWORD
|
|
CreateAndSecureScriptDir();
|
|
|
|
void
|
|
DeleteScriptFile(
|
|
GUID & DeploymentId
|
|
);
|
|
|
|
DWORD
|
|
GetRemovedApps();
|
|
|
|
HRESULT
|
|
GetAppsFromDirectory();
|
|
|
|
DWORD
|
|
GetAppsFromLocal();
|
|
|
|
BOOL
|
|
DetectLostApps();
|
|
|
|
DWORD
|
|
GetLostApps();
|
|
|
|
HRESULT
|
|
FindAppInRSoP(
|
|
CAppInfo * pScriptInfo,
|
|
GUID * pGPOId,
|
|
LONG * pRedeployCount
|
|
);
|
|
|
|
HRESULT
|
|
GetPackageEnumeratorFromPath(
|
|
WCHAR* wszClassStorePath,
|
|
GUID* pCategory,
|
|
DWORD dwAppFlags,
|
|
IEnumPackage** ppEnumPackage);
|
|
|
|
HRESULT
|
|
GetDsPackageFromGPO(
|
|
CGPOInfo* pGpoInfo,
|
|
GUID* pDeploymentId,
|
|
PACKAGEDISPINFO* pPackageInfo);
|
|
|
|
HRESULT
|
|
GetClassAccessFromPath(
|
|
WCHAR* wszClassStorePath,
|
|
IClassAccess** ppIClassAccess);
|
|
|
|
HRESULT
|
|
EnumerateApps(
|
|
IEnumPackage * pEnumPackages
|
|
);
|
|
|
|
BOOL
|
|
AddAppsFromDirectory(
|
|
ULONG cApps,
|
|
PACKAGEDISPINFO * rgPackageInfo,
|
|
CAppList & AppList
|
|
);
|
|
|
|
DWORD
|
|
GetDSQuery();
|
|
|
|
DWORD
|
|
CommitPolicyList();
|
|
|
|
CGPOInfoList _GPOs;
|
|
CAppList _Apps;
|
|
CAppList _LocalScripts;
|
|
|
|
CSPath _CSPath;
|
|
|
|
PFNSTATUSMESSAGECALLBACK _pfnStatusCallback;
|
|
|
|
WCHAR * _pwszLocalPath; // %systemroot%\system32\appmgmt\<SID>
|
|
|
|
HANDLE _hUserToken;
|
|
HKEY _hkRoot;
|
|
HKEY _hkPolicy;
|
|
HKEY _hkAppmgmt;
|
|
BOOL _bUser;
|
|
BOOL _bNoChanges;
|
|
BOOL _bAsync;
|
|
BOOL _bARPList;
|
|
ULONGLONG _NewUsn;
|
|
DWORD _ArchLang;
|
|
BOOL _bIncludeLegacy;
|
|
BOOL _bDeleteGPOs;
|
|
BOOL _bRegularPolicyRun;
|
|
|
|
DWORD _ErrorReason;
|
|
CRsopAppContext _RsopContext;
|
|
};
|
|
|
|
typedef HRESULT (STDAPICALLTYPE * SHGETFOLDERPATHW)(
|
|
HWND hwnd,
|
|
int csidl,
|
|
HANDLE hToken,
|
|
DWORD dwFlags,
|
|
LPWSTR lpszPath
|
|
);
|
|
|
|
DWORD
|
|
GetScriptDirPath(
|
|
HANDLE hToken,
|
|
DWORD ExtraPathChars,
|
|
WCHAR ** ppwszPath,
|
|
DWORD * dwAllocatedSize = NULL
|
|
);
|
|
|
|
#endif // __MANAPP_HXX__
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|