Leaked source code of windows server 2003
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.
 
 
 
 
 
 

314 lines
7.2 KiB

//*************************************************************
//
// Copyright (c) Microsoft Corporation 1998
// All rights reserved
//
// util.cxx
//
//*************************************************************
#include "appmgext.hxx"
SRSETRESTOREPOINTW * gpfnSRSetRetorePointW = 0;
BOOL
IsMemberOfAdminGroup(
HANDLE hUserToken
)
{
SID_IDENTIFIER_AUTHORITY AuthorityNT = SECURITY_NT_AUTHORITY;
PSID pSidAdmin;
BOOL bStatus;
BOOL bIsAdmin;
bIsAdmin = FALSE;
pSidAdmin = 0;
bStatus = AllocateAndInitializeSid( &AuthorityNT, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pSidAdmin );
if ( bStatus )
bStatus = CheckTokenMembership( hUserToken, pSidAdmin, &bIsAdmin );
FreeSid( pSidAdmin );
return bIsAdmin;
}
DWORD
GetPreviousSid(
HANDLE hUserToken,
WCHAR * pwszCurrentScriptPath,
WCHAR ** ppwszPreviousSid
)
{
HANDLE hFind;
WIN32_FIND_DATA FindData;
PSID pSid;
WCHAR * pwszSlash1;
WCHAR * pwszSlash2;
WCHAR * pwszSearchPath;
DWORD Length;
DWORD Status;
BOOL bMember;
BOOL bStatus;
*ppwszPreviousSid = 0;
//
// Script dir paths created by GetScriptDirPath have '\' at the end.
//
pwszSlash1 = wcsrchr( pwszCurrentScriptPath, L'\\' );
*pwszSlash1 = 0;
pwszSlash2 = wcsrchr( pwszCurrentScriptPath, L'\\' );
*pwszSlash2 = 0;
Length = lstrlen(pwszCurrentScriptPath);
pwszSearchPath = new WCHAR[Length + 3];
if ( pwszSearchPath )
{
memcpy( pwszSearchPath, pwszCurrentScriptPath, Length * sizeof(WCHAR) );
pwszSearchPath[Length] = L'\\';
pwszSearchPath[Length+1] = L'*';
pwszSearchPath[Length+2] = 0;
}
*pwszSlash1 = *pwszSlash2 = L'\\';
if ( ! pwszSearchPath )
return ERROR_OUTOFMEMORY;
//
// We've constructed a search path of %systemroot%\system32\appmgmt\*.
//
hFind = FindFirstFile( pwszSearchPath, &FindData );
delete [] pwszSearchPath;
if ( INVALID_HANDLE_VALUE == hFind )
return ERROR_SUCCESS;
Status = ERROR_SUCCESS;
do
{
if ( ! (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
continue;
if ( (0 == lstrcmp( FindData.cFileName, L"." )) ||
(0 == lstrcmp( FindData.cFileName, L".." )) ||
(CompareString(LOCALE_INVARIANT, NORM_IGNORECASE, FindData.cFileName, -1, L"MACHINE", -1) == CSTR_EQUAL))
continue;
bMember = FALSE;
pSid = 0;
bStatus = ConvertStringSidToSid( FindData.cFileName, &pSid );
if ( bStatus )
{
bStatus = CheckTokenMembership( hUserToken, pSid, &bMember );
if ( bStatus && bMember )
bStatus = ConvertSidToStringSid( pSid, ppwszPreviousSid );
LocalFree( pSid );
}
if ( ! bStatus )
{
Status = GetLastError();
break;
}
if ( bMember )
break;
} while ( FindNextFile( hFind, &FindData ) );
FindClose( hFind );
return Status;
}
DWORD
RenameScriptDir(
WCHAR * pwszPreviousSid,
WCHAR * pwszCurrentScriptPath
)
{
WCHAR * pwszSlash1;
WCHAR * pwszSlash2;
WCHAR * pwszOldScriptPath;
DWORD Length;
BOOL bStatus;
//
// Script dir paths created by GetScriptDirPath have '\' at the end.
//
pwszSlash1 = wcsrchr( pwszCurrentScriptPath, L'\\' );
*pwszSlash1 = 0;
pwszSlash2 = wcsrchr( pwszCurrentScriptPath, L'\\' );
*pwszSlash2 = 0;
Length = lstrlen( pwszCurrentScriptPath );
pwszOldScriptPath = new WCHAR[Length + 1 + lstrlen(pwszPreviousSid) + 1];
if ( pwszOldScriptPath )
{
HRESULT hr;
memcpy( pwszOldScriptPath, pwszCurrentScriptPath, Length * sizeof(WCHAR) );
pwszOldScriptPath[Length] = L'\\';
hr = StringCchCopy( &pwszOldScriptPath[Length+1], lstrlen(pwszPreviousSid) + 1, pwszPreviousSid );
if (FAILED(hr))
{
delete [] pwszOldScriptPath;
return hr;
}
}
*pwszSlash1 = *pwszSlash2 = L'\\';
if ( ! pwszOldScriptPath )
return ERROR_OUTOFMEMORY;
bStatus = MoveFileEx( pwszOldScriptPath, pwszCurrentScriptPath, 0 );
delete [] pwszOldScriptPath;
if ( ! bStatus )
return GetLastError();
return ERROR_SUCCESS;
}
DWORD
GetCurrentUserGPOList(
OUT PGROUP_POLICY_OBJECT* ppGpoList // Free this with the FreeGPOList API
)
{
GUID AppmgmtExtension = {0xc6dc5466, 0x785a, 0x11d2,
0x84, 0xd0,
0x00, 0xc0, 0x4f, 0xb1, 0x69, 0xf7};
return GetAppliedGPOList(
0,
NULL,
NULL,
&AppmgmtExtension,
ppGpoList);
}
DWORD GetWin32ErrFromHResult( HRESULT hr )
{
DWORD Status = ERROR_SUCCESS;
if (S_OK != hr)
{
if (FACILITY_WIN32 == HRESULT_FACILITY(hr))
{
Status = HRESULT_CODE(hr);
}
else
{
Status = GetLastError();
if (ERROR_SUCCESS == Status)
{
//an error had occurred but nobody called SetLastError
//should not be mistaken as a success.
Status = (DWORD) hr;
}
}
}
return Status;
}
void ClearManagedApp( MANAGED_APP* pManagedApp )
{
if (pManagedApp->pszPackageName)
{
midl_user_free(pManagedApp->pszPackageName);
}
if (pManagedApp->pszSupportUrl)
{
midl_user_free(pManagedApp->pszSupportUrl);
}
if (pManagedApp->pszPolicyName)
{
midl_user_free(pManagedApp->pszPolicyName);
}
if (pManagedApp->pszPublisher)
{
midl_user_free(pManagedApp->pszPublisher);
}
//
// Make sure to clear the structure if there is a failure
// so we won't try to marshal bogus data
//
memset(pManagedApp, 0, sizeof(*pManagedApp));
}
CLoadSfc::CLoadSfc( DWORD &Status )
{
hSfc = LoadLibrary( L"sfc.dll" );
if ( ! hSfc )
{
Status = GetLastError();
return;
}
gpfnSRSetRetorePointW = (SRSETRESTOREPOINTW *) GetProcAddress( hSfc, "SRSetRestorePointW" );
if ( ! gpfnSRSetRetorePointW )
{
Status = ERROR_PROC_NOT_FOUND;
return;
}
Status = ERROR_SUCCESS;
}
CLoadSfc::~CLoadSfc()
{
if ( hSfc )
FreeLibrary( hSfc );
}
//
// Force policy to be synchronous at next refresh --
// use a token for user policy, NULL for machine policy
//
DWORD ForceSynchronousRefresh( HANDLE hUserToken )
{
LONG Status;
UNICODE_STRING SidString;
Status = GetSidString( hUserToken, &SidString );
if ( ERROR_SUCCESS == Status )
{
//
// Inform the gp engine to give us a sync refresh
//
Status = ForceSyncFgPolicy( SidString.Buffer );
RtlFreeUnicodeString( &SidString );
}
return Status;
}