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.

239 lines
6.0 KiB

  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Copyright (c) 2000-2002 Microsoft Corporation
  3. //
  4. ///////////////////////////////////////////////////////////////////////////////
  5. // Includes
  6. #include <stdio.h>
  7. #include <atlbase.h>
  8. #include <vss.h>
  9. #include <vswriter.h>
  10. #include <vsbackup.h>
  11. #define GUID_FMT L"{%.8x-%.4x-%.4x-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x}"
  12. #define GUID_PRINTF_ARG( X ) \
  13. (X).Data1, \
  14. (X).Data2, \
  15. (X).Data3, \
  16. (X).Data4[0], (X).Data4[1], (X).Data4[2], (X).Data4[3], \
  17. (X).Data4[4], (X).Data4[5], (X).Data4[6], (X).Data4[7]
  18. ///////////////////////////////////////////////////////////////////////////////
  19. // Implementation
  20. HRESULT QuerySnapshots()
  21. {
  22. HRESULT hr;
  23. //Create a BackupComponents Interface
  24. CComPtr<IVssBackupComponents> pBackupComp;
  25. hr = CreateVssBackupComponents(&pBackupComp);
  26. if (FAILED(hr)){
  27. wprintf(L"CreateVssBackupComponents failed [0x%08lx]\n", hr);
  28. return (hr);
  29. }
  30. // Initialize the backup component instance
  31. hr = pBackupComp->InitializeForBackup();
  32. if (FAILED(hr)){
  33. wprintf(L"IVssBackupComponents::InitializeForBackup failed [0x%08lx]\n", hr);
  34. return (hr);
  35. }
  36. // Query all snapshots in the system
  37. hr = pBackupComp->SetContext(VSS_CTX_ALL);
  38. if (FAILED(hr)){
  39. wprintf(L"IVssBackupComponents::InitializeForBackup failed [0x%08lx]\n", hr);
  40. return (hr);
  41. }
  42. // Get list all snapshots
  43. CComPtr<IVssEnumObject> pIEnumSnapshots;
  44. hr = pBackupComp->Query( GUID_NULL,
  45. VSS_OBJECT_NONE,
  46. VSS_OBJECT_SNAPSHOT,
  47. &pIEnumSnapshots );
  48. if (FAILED(hr)){
  49. wprintf(L"IVssBackupComponents::Query failed [0x%08lx]\n", hr);
  50. return (hr);
  51. }
  52. // For all snapshots do...
  53. VSS_OBJECT_PROP Prop;
  54. VSS_SNAPSHOT_PROP& Snap = Prop.Obj.Snap;
  55. for(;;) {
  56. // Get next element
  57. ULONG ulFetched;
  58. hr = pIEnumSnapshots->Next( 1, &Prop, &ulFetched );
  59. //Case where we reached the end of list
  60. if (hr == S_FALSE)
  61. break;
  62. if (hr != S_OK) {
  63. wprintf(L"IVssEnumObject::Next failed [0x%08lx]\n", hr);
  64. return(hr);
  65. }
  66. //print results
  67. wprintf(L"* ShadowID: " GUID_FMT L"\n"
  68. L" Attributes: [0x%08lx]\n"
  69. L" ShadowSetID: " GUID_FMT L"\n"
  70. L" Volume: %s \n"
  71. L" Device: %s \n\n",
  72. GUID_PRINTF_ARG(Snap.m_SnapshotId),
  73. Snap.m_lSnapshotAttributes,
  74. GUID_PRINTF_ARG(Snap.m_SnapshotSetId),
  75. Snap.m_pwszOriginalVolumeName,
  76. Snap.m_pwszSnapshotDeviceObject
  77. );
  78. // Free up memory returned by COM
  79. ::VssFreeSnapshotProperties(&Snap);
  80. }
  81. return(S_OK);
  82. }
  83. HRESULT QueryProviders()
  84. {
  85. HRESULT hr;
  86. //Create a BackupComponents Interface
  87. CComPtr<IVssBackupComponents> pBackupComp;
  88. hr = CreateVssBackupComponents(&pBackupComp);
  89. if (FAILED(hr)){
  90. wprintf(L"CreateVssBackupComponents failed [0x%08lx]\n", hr);
  91. return (hr);
  92. }
  93. // Initialize the backup component instance
  94. hr = pBackupComp->InitializeForBackup();
  95. if (FAILED(hr)){
  96. wprintf(L"IVssBackupComponents::InitializeForBackup failed [0x%08lx]\n", hr);
  97. return (hr);
  98. }
  99. // Get list all snapshots
  100. CComPtr<IVssEnumObject> pIEnumProviders;
  101. hr = pBackupComp->Query( GUID_NULL,
  102. VSS_OBJECT_NONE,
  103. VSS_OBJECT_PROVIDER,
  104. &pIEnumProviders );
  105. if (FAILED(hr)){
  106. wprintf(L"IVssBackupComponents::Query failed [0x%08lx]\n", hr);
  107. return (hr);
  108. }
  109. // For all providers do...
  110. VSS_OBJECT_PROP Prop;
  111. VSS_PROVIDER_PROP& Prov = Prop.Obj.Prov;
  112. for(;;) {
  113. // Get next element
  114. ULONG ulFetched;
  115. hr = pIEnumProviders->Next( 1, &Prop, &ulFetched );
  116. //Case where we reached the end of list
  117. if (hr == S_FALSE)
  118. break;
  119. if (hr != S_OK) {
  120. wprintf(L"IVssEnumObject::Next failed [0x%08lx]\n", hr);
  121. return(hr);
  122. }
  123. wprintf(L"* ProviderID: " GUID_FMT L"\n"
  124. L" Type: [0x%08lx]\n"
  125. L" Name: %s \n"
  126. L" Version: %s \n"
  127. L" CLSID: " GUID_FMT L"\n\n",
  128. GUID_PRINTF_ARG(Prov.m_ProviderId),
  129. (LONG) Prov.m_eProviderType,
  130. Prov.m_pwszProviderName,
  131. Prov.m_pwszProviderVersion,
  132. GUID_PRINTF_ARG(Prov.m_ClassId)
  133. );
  134. // Free up memory returned by COM
  135. ::CoTaskMemFree(Prov.m_pwszProviderName);
  136. ::CoTaskMemFree(Prov.m_pwszProviderVersion);
  137. }
  138. return(S_OK);
  139. }
  140. // Returns:
  141. // - S_OK if the COM client is a local Administrator
  142. // - E_ACCESSDENIED if the COM client is not an Administrator
  143. // - E_OUTOFMEMORY on memory errors
  144. HRESULT IsAdministrator2()
  145. {
  146. // Impersonate the client
  147. HRESULT hr = CoImpersonateClient();
  148. if (hr != S_OK)
  149. {
  150. return E_ACCESSDENIED;
  151. }
  152. // Get the impersonation token
  153. HANDLE hToken = NULL;
  154. if (!OpenThreadToken(GetCurrentThread(),
  155. TOKEN_QUERY, TRUE, &hToken))
  156. {
  157. return E_ACCESSDENIED;
  158. }
  159. // Revert to self
  160. hr = CoRevertToSelf();
  161. if (FAILED(hr))
  162. {
  163. CloseHandle(hToken);
  164. return E_ACCESSDENIED;
  165. }
  166. // Build the SID for the Administrators group
  167. PSID psidAdmin = NULL;
  168. SID_IDENTIFIER_AUTHORITY SidAuth = SECURITY_NT_AUTHORITY;
  169. if (!AllocateAndInitializeSid
  170. (
  171. &SidAuth,
  172. 2,
  173. SECURITY_BUILTIN_DOMAIN_RID,
  174. DOMAIN_ALIAS_RID_ADMINS,
  175. 0, 0, 0, 0, 0, 0, &psidAdmin))
  176. {
  177. CloseHandle(hToken);
  178. return E_OUTOFMEMORY;
  179. }
  180. // Check the token membership
  181. BOOL bIsAdmin = FALSE;
  182. if (!CheckTokenMembership(hToken, psidAdmin, &bIsAdmin))
  183. {
  184. FreeSid( psidAdmin );
  185. CloseHandle(hToken);
  186. return E_ACCESSDENIED;
  187. }
  188. // Release resources
  189. FreeSid( psidAdmin );
  190. CloseHandle(hToken);
  191. // Verify if the client is administrator
  192. if (!bIsAdmin)
  193. return E_ACCESSDENIED;
  194. return S_OK;
  195. }