JwaGPEdit.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:33k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { Group Policy API interface Unit for Object Pascal                            }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: gpedit.h, released June 2000. The original Pascal      }
  9. { code is: GPEdit.pas, released December 2000. The initial developer of the    }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. unit JwaGPEdit;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "GPEdit.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   ActiveX {TODO}, JwaPrSht, JwaWinType;
  52. type
  53.   LPOLESTR = POleStr;
  54.   {$NODEFINE LPOLESTR}
  55. //-----------------------------------------------------------------------------
  56. //
  57. // GPEDIT.H - Definitions and prototypes for Group Policy
  58. //
  59. // Copyright 1997-1999, Microsoft Corporation
  60. //
  61. //-----------------------------------------------------------------------------
  62. //
  63. // Terminology
  64. //
  65. // Group Policy Editor  -  The tool to view a Group Policy Object.
  66. //
  67. // Group Policy Object  -  A collection of administrator defined policies.
  68. //                         Each Group Policy Object (GPO) has both file system
  69. //                         and Active Directory storage available to it.
  70. //
  71. // IGPEInformation      -  The interface MMC Snapin Extensions use to
  72. //                         talk to the Group Policy Editor.
  73. //
  74. // IGroupPolicyObject   -  The interface used to create/edit a GPO directly
  75. //                         without going through the Group Policy Editor
  76. //
  77. //
  78. // Group Policy Editor MMC SnapIn GUID
  79. //
  80. // {8FC0B734-A0E1-11d1-A7D3-0000F87571E3}
  81. const
  82.   CLSID_GPESnapIn: TGUID = (
  83.     D1:$8fc0b734; D2:$a0e1; D3:$11d1; D4:($a7, $d3, $0, $0, $f8, $75, $71, $e3));
  84.   {$EXTERNALSYM CLSID_GPESnapIn}
  85. //
  86. // Group Policy Editor node ids
  87. //
  88. //
  89. // Computer ConfigurationWindows Settings
  90. // {8FC0B737-A0E1-11d1-A7D3-0000F87571E3}
  91. //
  92.   NODEID_Machine: TGUID = (
  93.     D1:$8fc0b737; D2:$a0e1; D3:$11d1; D4:($a7, $d3, $0, $0, $f8, $75, $71, $e3));
  94.   {$EXTERNALSYM NODEID_Machine}
  95. //
  96. // Computer ConfigurationSoftware Settings
  97. // {8FC0B73A-A0E1-11d1-A7D3-0000F87571E3}
  98. //
  99.   NODEID_MachineSWSettings: TGUID = (
  100.     D1:$8fc0b73a; D2:$a0e1; D3:$11d1; D4:($a7, $d3, $0, $0, $f8, $75, $71, $e3));
  101.   {$EXTERNALSYM NODEID_MachineSWSettings}
  102. //
  103. // User ConfigurationWindows Settings
  104. // {8FC0B738-A0E1-11d1-A7D3-0000F87571E3}
  105. //
  106.   NODEID_User: TGUID = (
  107.     D1:$8fc0b738; D2:$a0e1; D3:$11d1; D4:($a7, $d3, $0, $0, $f8, $75, $71, $e3));
  108.   {$EXTERNALSYM NODEID_User}
  109. //
  110. // User ConfigurationSoftware Settings
  111. // {8FC0B73C-A0E1-11d1-A7D3-0000F87571E3}
  112. //
  113.   NODEID_UserSWSettings: TGUID = (
  114.     D1:$8fc0b73c; D2:$a0e1; D3:$11d1; D4:($a7, $d3, $0, $0, $f8, $75, $71, $e3));
  115.   {$EXTERNALSYM NODEID_UserSWSettings}
  116. //
  117. // IGPEInformation interface id
  118. //
  119. // {8FC0B735-A0E1-11d1-A7D3-0000F87571E3}
  120.   IID_IGPEInformation: TGUID = (
  121.     D1:$8fc0b735; D2:$a0e1; D3:$11d1; D4:($a7, $d3, $0, $0, $f8, $75, $71, $e3));
  122.   {$EXTERNALSYM IID_IGPEInformation}
  123. //
  124. // Group Policy Object class id
  125. //
  126. // {EA502722-A23D-11d1-A7D3-0000F87571E3}
  127.   CLSID_GroupPolicyObject: TGUID = (
  128.     D1:$ea502722; D2:$a23d; D3:$11d1; D4:($a7, $d3, $0, $0, $f8, $75, $71, $e3));
  129.   {$EXTERNALSYM CLSID_GroupPolicyObject}
  130. //
  131. // Group Policy Object interface id
  132. //
  133. // {EA502723-A23D-11d1-A7D3-0000F87571E3}
  134.   IID_IGroupPolicyObject: TGUID = (
  135.     D1:$ea502723; D2:$a23d; D3:$11d1; D4:($a7, $d3, $0, $0, $f8, $75, $71, $e3));
  136.   {$EXTERNALSYM IID_IGroupPolicyObject}
  137. //
  138. // GUID that identifies the registry extension
  139. //
  140.   REGISTRY_EXTENSION_GUID: TGUID = (
  141.     D1:$35378EAC; D2:$683F; D3:$11D2; D4:($A8, $9A, $00, $C0, $4F, $BB, $CF, $A2));
  142.   {$EXTERNALSYM IID_IGroupPolicyObject}
  143. //========================================================================================
  144. //
  145. // Resultant Set of Policy node ids
  146. //
  147. //========================================================================================
  148. //
  149. // Resultant Set of Policy MMC SnapIn GUID
  150. //
  151. // {6DC3804B-7212-458D-ADB0-9A07E2AE1FA2}
  152.   CLSID_RSOPSnapIn: TGUID = (
  153.     D1:$6dc3804b; D2:$7212; D3:$458d; D4:($ad, $b0, $9a, $07, $e2, $ae, $1f, $a2));
  154.   {$EXTERNALSYM CLSID_RSOPSnapIn}
  155. //
  156. // Computer ConfigurationWindows Settings
  157. // {BD4C1A2E-0B7A-4A62-A6B0-C0577539C97E}
  158. //
  159.   NODEID_RSOPMachine: TGUID = (
  160.     D1:$bd4c1a2e; D2:$0b7a; D3:$4a62; D4:($a6, $b0, $c0, $57, $75, $39, $c9, $7e));
  161.   {$EXTERNALSYM NODEID_RSOPMachine}
  162. //
  163. // Computer ConfigurationSoftware Settings
  164. // {6A76273E-EB8E-45DB-94C5-25663A5f2C1A}
  165. //
  166.   NODEID_RSOPMachineSWSettings: TGUID = (
  167.     D1:$6a76273e; D2:$eb8e; D3:$45db; D4:($94, $c5, $25, $66, $3a, $5f, $2c, $1a));
  168.   {$EXTERNALSYM NODEID_RSOPMachineSWSettings}
  169. //
  170. // User ConfigurationWindows Settings
  171. // {AB87364F-0CEC-4CD8-9BF8-898F34628FB8}
  172. //
  173.   NODEID_RSOPUser: TGUID = (
  174.     D1:$ab87364f; D2:$0cec; D3:$4cd8; D4:($9b, $f8, $89, $8f, $34, $62, $8f, $b8));
  175.   {$EXTERNALSYM NODEID_RSOPUser}
  176. //
  177. // User ConfigurationSoftware Settings
  178. // {E52C5CE3-FD27-4402-84DE-D9A5F2858910}
  179. //
  180.   NODEID_RSOPUserSWSettings: TGUID = (
  181.     D1:$e52c5ce3; D2:$fd27; D3:$4402; D4:($84, $de, $d9, $a5, $f2, $85, $89, $10));
  182.   {$EXTERNALSYM NODEID_RSOPUserSWSettings}
  183. //
  184. // IRSOPInformation interface id
  185. //
  186. // {9A5A81B5-D9C7-49EF-9D11-DDF50968C48D}
  187.   IID_IRSOPInformation: TGUID = (
  188.     D1:$9a5a81b5; D2:$d9c7; D3:$49ef; D4:($9d, $11, $dd, $f5, $09, $68, $c4, $8d));
  189.   {$EXTERNALSYM IID_IRSOPInformation}
  190. // #include <objbase.h>
  191. //
  192. // Group Policy Object Section flags
  193. //
  194. const
  195.   GPO_SECTION_ROOT                = 0;  // Root
  196.   {$EXTERNALSYM GPO_SECTION_ROOT}
  197.   GPO_SECTION_USER                = 1;  // User
  198.   {$EXTERNALSYM GPO_SECTION_USER}
  199.   GPO_SECTION_MACHINE             = 2;  // Machine
  200.   {$EXTERNALSYM GPO_SECTION_MACHINE}
  201. //
  202. // Group Policy Object types
  203. //
  204. type
  205.   _GROUP_POLICY_OBJECT_TYPE = (
  206.     GPOTypeLocal,                         // GPO on the local machine
  207.     GPOTypeRemote,                        // GPO on a remote machine
  208.     GPOTypeDS);                           // GPO in the Active Directory
  209.   {$EXTERNALSYM _GROUP_POLICY_OBJECT_TYPE}
  210.   GROUP_POLICY_OBJECT_TYPE = _GROUP_POLICY_OBJECT_TYPE;
  211.   {$EXTERNALSYM GROUP_POLICY_OBJECT_TYPE}
  212.   PGROUP_POLICY_OBJECT_TYPE = ^GROUP_POLICY_OBJECT_TYPE;
  213.   {$EXTERNALSYM PGROUP_POLICY_OBJECT_TYPE}
  214.   TGroupPolicyObjectType = GROUP_POLICY_OBJECT_TYPE;
  215.   PGroupPolicyObjectType = PGROUP_POLICY_OBJECT_TYPE;
  216. //
  217. // Group Policy Hint types
  218. //
  219.   _GROUP_POLICY_HINT_TYPE = (
  220.     GPHintUnknown,                          // No link information available
  221.     GPHintMachine,                          // GPO linked to a machine (local or remote)
  222.     GPHintSite,                             // GPO linked to a site
  223.     GPHintDomain,                           // GPO linked to a domain
  224.     GPHintOrganizationalUnit);              // GPO linked to a organizational unit
  225.   {$EXTERNALSYM _GROUP_POLICY_HINT_TYPE}
  226.   GROUP_POLICY_HINT_TYPE = _GROUP_POLICY_HINT_TYPE;
  227.   {$EXTERNALSYM GROUP_POLICY_HINT_TYPE}
  228.   PGROUP_POLICY_HINT_TYPE = ^GROUP_POLICY_HINT_TYPE;
  229.   {$EXTERNALSYM PGROUP_POLICY_HINT_TYPE}
  230.   TGroupPolicyHintType = GROUP_POLICY_HINT_TYPE;
  231.   PGroupPolicyHintType = PGROUP_POLICY_HINT_TYPE;
  232.   IGPEInformation = interface (IUnknown)
  233.   ['{8FC0B735-A0E1-11d1-A7D3-0000F87571E3}']
  234.     // *** IGPEInformation methods ***
  235.     //
  236.     // Returns the unique Group Policy Object name (a GUID)
  237.     //
  238.     // pszName contains the name on return
  239.     // cchMaxLength is the max number of characters that can be stored in pszName
  240.     //
  241.     function GetName(pszName: LPOLESTR; cchMaxLength: Integer): HRESULT; stdcall;
  242.     //
  243.     // Returns the friendly display name for this Group Policy Object
  244.     //
  245.     // pszName contains the name on return
  246.     // cchMaxLength is the max number of characters that can be stored in pszName
  247.     //
  248.     function GetDisplayName(pszName: LPOLESTR; cchMaxLength: Integer): HRESULT; stdcall;
  249.     //
  250.     // Returns a registry key handle for the requested section.  The returned
  251.     // key is the root of the registry, not the Policies subkey.  To set / read
  252.     // a value in the Policies subkey, you will need to call RegOpenKeyEx to
  253.     // open SoftwarePolicies subkey first.
  254.     //
  255.     // The handle has been opened with ALL ACCESS rights.  Call RegCloseKey
  256.     // on the handle when finished.
  257.     //
  258.     // dwSection is either GPO_SECTION_USER or GPO_SECTION_MACHINE
  259.     // hKey contains the registry key on return
  260.     //
  261.     function GetRegistryKey(dwSection: DWORD; var hKey: HKEY): HRESULT; stdcall;
  262.     //
  263.     // Returns the Active Directory path to the root of the request section.
  264.     // The path is in ADSI name format.
  265.     //
  266.     // dwSection is one of the GPO_SECTION_* flags
  267.     // pszPath contains the path on return
  268.     // cchMaxPath is the max number of characters that can be stored in pszPath
  269.     //
  270.     function GetDSPath(dwSection: DWORD; pszPath: LPOLESTR; cchMaxPath: Integer): HRESULT; stdcall;
  271.     //
  272.     // Returns the UNC path to the root of the requested section.
  273.     //
  274.     // dwSection is one of the GPO_SECTION_* flags
  275.     // pszPath contains the path on return
  276.     // cchMaxPath is the number of characters that can be stored in pszPath.
  277.     //
  278.     function GetFileSysPath(dwSection: DWORD; pszPath: LPOLESTR; cchMaxPath: Integer): HRESULT; stdcall;
  279.     //
  280.     // Returns the user preferences (options)
  281.     //
  282.     // Currently, there are no options defined.  This is reserved for future use.
  283.     //
  284.     // dwOptions receives a bitmask value
  285.     //
  286.     function GetOptions(var dwOptions: DWORD): HRESULT; stdcall;
  287.     //
  288.     // Returns the type of GPO being edited.
  289.     //
  290.     // The three types are:  a GPO in the Active Directory, the GPO on the local machine,
  291.     // and the GPO on a remote machine.
  292.     //
  293.     // Machine GPOs only have file system storage (no Active Directory storage available).
  294.     // If GetDSPath is called for a machine GPO, the function will succeed
  295.     // and the returned buffer will be the empty string ""
  296.     //
  297.     // Active Directory GPOs have both file system and Active Directory storage available to them.
  298.     //
  299.     // gpoType receives one of the type flags listed above.
  300.     //
  301.     function GetType(var gpoType: GROUP_POLICY_OBJECT_TYPE): HRESULT; stdcall;
  302.     //
  303.     // Returns the type of Active Directory object (or machine) that could be linked to
  304.     // this GPO
  305.     //
  306.     // This is a hint api only.  The GPE does not know which Active Directory objects are
  307.     // linked to a particular GPO, but it can offer a hint based upon how the
  308.     // user started the GPE.
  309.     //
  310.     // Use this method with great caution.  Some extensions might want to
  311.     // customize their user interface based upon the scoping for this GPO,
  312.     // but it is easy to offer the wrong namespace.  Best advice is to
  313.     // always offer your full user interface, but if you choose to use this
  314.     // method, always offer your full user interface if you recieve the
  315.     // unknown hint back.
  316.     //
  317.     // gpHint receives one of the hint flags listed above.
  318.     //
  319.     function GetHint(var gpHint: GROUP_POLICY_HINT_TYPE): HRESULT; stdcall;
  320.     //
  321.     // Informs the Group Policy Editor that policy settings have changed.
  322.     // Extensions MUST call this methold every time a change is made
  323.     // to a Group Policy Object.
  324.     //
  325.     // bMachine specifies if machine or user policy has changed.
  326.     // bAdd specifies whether this is an add or delete.
  327.     // pGuidExtension is the guid or unique name of extension that
  328.     //    will process this GPO.
  329.     // pGuidSnapin is the guid or unique name of snapin that is making
  330.     //    this call
  331.     //
  332.     function PolicyChanged(bMachine, bAdd: BOOL; const pGuidExtension, pGuidSnapin: GUID): HRESULT; stdcall;
  333.   end;
  334.   {$EXTERNALSYM IGPEInformation}
  335.   LPGPEINFORMATION = ^IGPEInformation;
  336.   {$EXTERNALSYM LPGPEINFORMATION}
  337. //
  338. // Group Policy Object open / creation flags
  339. //
  340. const
  341.   GPO_OPEN_LOAD_REGISTRY     = $00000001;  // Load the registry files
  342.   {$EXTERNALSYM GPO_OPEN_LOAD_REGISTRY}
  343.   GPO_OPEN_READ_ONLY         = $00000002;  // Open the GPO as read only
  344.   {$EXTERNALSYM GPO_OPEN_READ_ONLY}
  345. //
  346. // Group Policy Object option flags
  347. //
  348. const
  349.   GPO_OPTION_DISABLE_USER    = $00000001;  // The user portion of this GPO is disabled
  350.   {$EXTERNALSYM GPO_OPTION_DISABLE_USER}
  351.   GPO_OPTION_DISABLE_MACHINE = $00000002;  // The machine portion of this GPO is disabled
  352.   {$EXTERNALSYM GPO_OPTION_DISABLE_MACHINE}
  353. type
  354.   IGroupPolicyObject = interface (IUnknown)
  355.   ['{EA502723-A23D-11d1-A7D3-0000F87571E3}']
  356.     // *** IGroupPolicyObject methods ***
  357.     //
  358.     // Creates a new GPO in the Active Directory with the given friendly name
  359.     // and opens it via OpenDSGPO().  If pszDomainName contains a domain
  360.     // controller name, the GPO will be created on that DC.  If it does not
  361.     // specify a domain controller name, the method will select a DC on
  362.     // the callers behalf.
  363.     //
  364.     // pszDomainName contains the ADSI path of the domain root
  365.     // pszDisplayName contains the friendly display name
  366.     // dwFlags is a bitmask of GPO open / creation flags listed above
  367.     //
  368.     function New(pszDomainName, pszDisplayName: LPOLESTR; dwFlags: DWORD): HRESULT; stdcall;
  369.     //
  370.     // Opens the specified Group Policy Object in the Active Directory
  371.     // based upon the passed in flags.  If pszPath contains a domain
  372.     // controller name, the GPO will be opened on that DC.  If it does
  373.     // not contain a domain controller name, the method will select a
  374.     // DC on the callers behalf.  If the registry is not loaded,
  375.     // GetRegistryKey() will return E_FAIL.
  376.     //
  377.     // pszPath contains the ADSI path to the GPO to open
  378.     // dwFlags is a bitmask of GPO open / creation flags listed above
  379.     //
  380.     function OpenDSGPO(pszPath: LPOLESTR; dwFlags: DWORD): HRESULT; stdcall;
  381.     //
  382.     // Opens the default Group Policy Object on this machine with the
  383.     // dwFlags options listed above.  If the registry is not loaded,
  384.     // GetRegistryKey() will return E_FAIL.
  385.     //
  386.     // dwFlags is a bitmask of GPO open / creation flags listed above
  387.     //
  388.     function OpenLocalMachineGPO(dwFlags: DWORD): HRESULT; stdcall;
  389.     //
  390.     // Opens the default Group Policy Object on a remote machine with the
  391.     // dwFlags options listed above.  If the registry is not loaded,
  392.     // GetRegistryKey() will return E_FAIL.
  393.     //
  394.     // pszComputerName contains the machine name in \machine format
  395.     // dwFlags is a bitmask of GPO open / creation flags listed above
  396.     //
  397.     function OpenRemoteMachineGPO(pszComputerName: LPOLESTR; dwFlags: DWORD): HRESULT; stdcall;
  398.     //
  399.     // Flushes the registry settings to disk and updates the revision
  400.     // number of the GPO.
  401.     //
  402.     // bMachine specifies if machine or user should be saved.
  403.     // bAdd specifies whether this is an add or delete.
  404.     // pGuidExtension is the guid or unique name of extension that
  405.     //    will process this GPO.
  406.     // pGuid is a guid
  407.     //
  408.     function Save(bMachine, bAdd: BOOL; const pGuidExtension, pGuid: GUID): HRESULT; stdcall;
  409.     //
  410.     // Deletes this Group Policy Object.
  411.     //
  412.     // After calling this method, no other methods are valid to call
  413.     // since the data will have been deleted.
  414.     //
  415.     function Delete: HRESULT; stdcall;
  416.     //
  417.     // Returns the unique Group Policy Object name
  418.     //
  419.     // For Active Directory policy objects, this is a GUID
  420.     // For the local policy object, it is the string "Local"
  421.     // For remote policy objects, it is the computername
  422.     //
  423.     // pszName contains the name on return
  424.     // cchMaxLength is the max number of characters that can be stored in pszName
  425.     //
  426.     function GetName(pszName: LPOLESTR; cchMaxLength: Integer): HRESULT; stdcall;
  427.     //
  428.     // Returns the friendly display name for this Group Policy Object
  429.     //
  430.     // pszName contains the name on return
  431.     // cchMaxLength is the max number of characters that can be stored in pszName
  432.     //
  433.     function GetDisplayName(pszName: LPOLESTR; cchMaxLength: Integer): HRESULT; stdcall;
  434.     //
  435.     // Sets the friendly display name for this Group Policy Object
  436.     //
  437.     // pszName is the new display name
  438.     //
  439.     function SetDisplayName(pszName: LPOLESTR): HRESULT; stdcall;
  440.     //
  441.     // Returns the path to the Group Policy Object
  442.     //
  443.     //
  444.     // If the GPO is an Active Directory object, the path is in ADSI name format.
  445.     // If the GPO is a machine object, it is a file system path
  446.     //
  447.     // pszPath contains the path on return
  448.     // cchMaxPath is the max number of characters that can be stored in pszPath
  449.     //
  450.     function GetPath(pszPath: LPOLESTR; cchMaxPath: Integer): HRESULT; stdcall;
  451.     //
  452.     // Returns the Active Directory path to the root of the request section.
  453.     // The path is in DN name format.
  454.     //
  455.     // dwSection is one of the GPO_SECTION_* flags
  456.     // pszPath contains the path on return
  457.     // cchMaxPath is the max number of characters that can be stored in pszPath
  458.     //
  459.     function GetDSPath(dwSection: DWORD; pszPath: LPOLESTR; cchMaxPath: Integer): HRESULT; stdcall;
  460.     //
  461.     // Returns the UNC path to the root of the requested section.
  462.     //
  463.     // dwSection is one of the GPO_SECTION_* flags
  464.     // pszPath contains the path on return
  465.     // cchMaxPath is the number of characters that can be stored in pszPath.
  466.     //
  467.     function GetFileSysPath(dwSection: DWORD; pszPath: LPOLESTR; cchMaxPath: Integer): HRESULT; stdcall;
  468.     //
  469.     // Returns a registry key handle for the requested section.  The returned
  470.     // key is the root of the registry, not the Policies subkey.  To set / read
  471.     // a value in the Policies subkey, you will need to call RegOpenKeyEx to
  472.     // open SoftwarePolicies subkey first.
  473.     //
  474.     // The handle has been opened with ALL ACCESS rights.  Call RegCloseKey
  475.     // on the handle when finished.
  476.     //
  477.     // If the GPO was loaded / created without the registry being loaded
  478.     // this method will return E_FAIL.
  479.     //
  480.     // dwSection is either GPO_SECTION_USER or GPO_SECTION_MACHINE
  481.     // hKey contains the registry key on return
  482.     //
  483.     function GetRegistryKey(dwSection: DWORD; var hKey: HKEY): HRESULT; stdcall;
  484.     //
  485.     // Returns any options for this Group Policy Object
  486.     //
  487.     // dwOptions receives the GPO_OPTION_* flags
  488.     //
  489.     function GetOptions(var dwOptions: DWORD): HRESULT; stdcall;
  490.     //
  491.     // Sets any options for this Group Policy Object
  492.     //
  493.     // This method sets any options for this GPO.  To change
  494.     // an option, that flag must be set in the mask field.
  495.     // If the flag is in the mask field, then the dwOptions
  496.     // field is read for the current state.
  497.     //
  498.     // For example:  to disable the GPO, make this call
  499.     //
  500.     //    SetOptions (GPO_OPTION_DISABLED, GPO_OPTION_DISABLED);
  501.     //
  502.     // dwOptions specifies one or more GPO_OPTION_* flags
  503.     // dwMask specificies which of the dwOptions to change
  504.     //
  505.     function SetOptions(dwOptions, dwMask: DWORD): HRESULT; stdcall;
  506.     //
  507.     // Returns the type of GPO being edited.
  508.     //
  509.     // The three types are:  a GPO in the Active Directory, the GPO on the local machine,
  510.     // and the GPO on a remote machine.
  511.     //
  512.     // Machine GPOs only have file system storage (no Active Directory storage available).
  513.     // If GetDSPath is called for a machine GPO, the function will succeed
  514.     // and the returned buffer will be the empty string ""
  515.     //
  516.     // Active Directory GPOs have both file system and Active Directory storage available to them.
  517.     //
  518.     // gpoType receives one of the type flags
  519.     //
  520.     function GetType(var gpoType: GROUP_POLICY_OBJECT_TYPE): HRESULT; stdcall;
  521.     //
  522.     // Returns the machine name of the remote GPO
  523.     //
  524.     // This method returns the name passed to OpenRemoteMachineGPO.
  525.     //
  526.     // pszName contains the name on return
  527.     // cchMaxLength is the max number of characters that can be stored in pszName
  528.     //
  529.     function GetMachineName(pszName: LPOLESTR; cchMaxLength: Integer): HRESULT; stdcall;
  530.     //
  531.     // Returns an array of property sheet pages and the number of pages
  532.     // in the array
  533.     //
  534.     // Note, this method will allocate memory for the array with
  535.     // LocalAlloc.  When finished, the caller should free the array
  536.     // with LocalFree
  537.     //
  538.     // hPages address of the pointer for the array of property sheet pages
  539.     // uPageCount receives the number of pages in the array
  540.     //
  541.     function GetPropertySheetPages(var hPages: PHPROPSHEETPAGE; var uPageCount: UINT): HRESULT; stdcall;
  542.     
  543.   end;
  544.   {$EXTERNALSYM IGroupPolicyObject}
  545.   LPGROUPPOLICYOBJECT = ^IGroupPolicyObject;
  546.   {$EXTERNALSYM LPGROUPPOLICYOBJECT}
  547. //
  548. // RSOP flags
  549. //
  550. const
  551.   RSOP_INFO_FLAG_DIAGNOSTIC_MODE = $00000001; // Running in diagnostic mode vs planning mode
  552.   {$EXTERNALSYM RSOP_INFO_FLAG_DIAGNOSTIC_MODE}
  553. type
  554.   IRSOPInformation = interface (IUnknown)
  555.   ['{9A5A81B5-D9C7-49EF-9D11-DDF50968C48D}']
  556.     // *** IRSOPInformation methods ***
  557.     //
  558.     // Returns the namespace for the RSOP data
  559.     //
  560.     // dwSection is either GPO_SECTION_USER or GPO_SECTION_MACHINE
  561.     // pszName contains the namespace on return
  562.     // cchMaxLength is the max number of characters that can be stored in pszName
  563.     //
  564.     function GetNamespace(dwSection: DWORD; pszName: LPOLESTR; cchMaxLength: Integer): HRESULT; stdcall;
  565.     //
  566.     // Returns information about the RSOP session
  567.     //
  568.     // pdwFlags points to a DWORD which contains the flags on return
  569.     //
  570.     function GetFlags(var pdwFlags: DWORD): HRESULT; stdcall;
  571.     //
  572.     // Returns the event log text for a specific entry
  573.     //
  574.     // lpEventSource - event log source name
  575.     // lpEventLogName - event log name
  576.     // lpEventTime - event log time in WMI datetime format
  577.     // dwEventID - event ID
  578.     // lpText - Receives a pointer to a buffer containing the text.
  579.     //          The caller should free this buffer with CoTaskMemFree.
  580.     //
  581.     function GetEventLogEntryText(pszEventSource, pszEventLogName, pszEventTime: LPOLESTR;
  582.       dwEventID: DWORD; out ppszText: LPOLESTR): HRESULT; stdcall;
  583.   end;
  584.   {$EXTERNALSYM IRSOPInformation}
  585.   LPRSOPINFORMATION = IRSOPInformation;
  586.   {$EXTERNALSYM LPRSOPINFORMATION}
  587. //=============================================================================
  588. //
  589. // CreateGPOLink
  590. //
  591. // Creates a link to a GPO for the specified Site, Domain, or Organizational Unit
  592. //
  593. // lpGPO         - ADSI path to the GPO
  594. // lpContainer   - ADSI path to the Site, Domain, or Organizational Unit
  595. // fHighPriority - Create the link as the highest or lowest priority
  596. //
  597. // Returns:  S_OK if successful
  598. //
  599. //=============================================================================
  600. function CreateGPOLink(lpGPO, lpContainer: LPOLESTR; fHighPriority: BOOL): HRESULT; stdcall;
  601. {$EXTERNALSYM CreateGPOLink}
  602. //=============================================================================
  603. //
  604. // DeleteGPOLink
  605. //
  606. // Deletes a link to a GPO for the specified Site, Domain, or Organizational Unit
  607. //
  608. // lpGPO         - ADSI path to the GPO
  609. // lpContainer   - ADSI path to the Site, Domain, or Organizational Unit
  610. //
  611. // Returns:  S_OK if successful
  612. //
  613. //=============================================================================
  614. function DeleteGPOLink(lpGPO, lpContainer: LPOLESTR): HRESULT; stdcall;
  615. {$EXTERNALSYM DeleteGPOLink}
  616. //=============================================================================
  617. //
  618. // DeleteAllGPOLinks
  619. //
  620. // Deletes all GPO links for the specified Site, Domain, or Organizational Unit
  621. //
  622. // lpContainer   - ADSI path to the Site, Domain, or Organizational Unit
  623. //
  624. // Returns:  S_OK if successful
  625. //
  626. //=============================================================================
  627. function DeleteAllGPOLinks(lpContainer: LPOLESTR): HRESULT; stdcall;
  628. {$EXTERNALSYM DeleteAllGPOLinks}
  629. //=============================================================================
  630. //
  631. // BrowseForGPO
  632. //
  633. // Displays the GPO browser dialog
  634. //
  635. // lpBrowseInfo   - Address of a GPOBROWSEINFO structure
  636. //
  637. // Returns:  S_OK if successful
  638. //
  639. //=============================================================================
  640. //
  641. // Flags passed in the dwFlags field of the GPOBROWSEINFO structure
  642. //
  643. const
  644.   GPO_BROWSE_DISABLENEW          = $00000001;   // Disables the New GPO functionality on all pages except "All"
  645.   {$EXTERNALSYM GPO_BROWSE_DISABLENEW}
  646.   GPO_BROWSE_NOCOMPUTERS         = $00000002;   // Removes the Computers tab
  647.   {$EXTERNALSYM GPO_BROWSE_NOCOMPUTERS}
  648.   GPO_BROWSE_NODSGPOS            = $00000004;   // Removes the Domain/OU and Sites tabs
  649.   {$EXTERNALSYM GPO_BROWSE_NODSGPOS}
  650.   GPO_BROWSE_OPENBUTTON          = $00000008;   // Change the Ok button to say Open
  651.   {$EXTERNALSYM GPO_BROWSE_OPENBUTTON}
  652.   GPO_BROWSE_INITTOALL           = $00000010;   // Initialize the dialog focused on the All pane
  653.   {$EXTERNALSYM GPO_BROWSE_INITTOALL}
  654. type
  655.   tag_GPOBROWSEINFO = record
  656.     dwSize: DWORD;                      // [in] Initialized to the size of this structure
  657.     dwFlags: DWORD;                     // [in] Flags defined above
  658.     hwndOwner: HWND;                    // [in] Parent window handle (can be NULL)
  659.     lpTitle: LPOLESTR;                  // [in] Title bar text.  If NULL, "Browse for a Group Policy Object" will be the default text
  660.     lpInitialOU: LPOLESTR;              // [in] Initial Domain/Organizational Unit to open focus on
  661.     lpDSPath: LPOLESTR;                 // [in/out] Pointer to the buffer that receives the Active Directory GPO path
  662.     dwDSPathSize: DWORD;                // [in] Size in characters of buffer given in lpDSPath
  663.     lpName: LPOLESTR;                   // [in/out] Pointer to a buffer that receives either the computer name or
  664.                                         //          the friendly name of the GPO (can be NULL)
  665.     dwNameSize: DWORD;                  // [in] Size in characters of buffer given in lpName
  666.     gpoType: GROUP_POLICY_OBJECT_TYPE;  // [out] Specifies the type of GPO
  667.     gpoHint: GROUP_POLICY_HINT_TYPE;    // [out] Specifies a hint of the GPO association
  668.   end;
  669.   {$EXTERNALSYM tag_GPOBROWSEINFO}
  670.   GPOBROWSEINFO = tag_GPOBROWSEINFO;
  671.   {$EXTERNALSYM GPOBROWSEINFO}
  672.   LPGPOBROWSEINFO = ^GPOBROWSEINFO;
  673.   TGpoBrowseInfo = GPOBROWSEINFO;
  674.   PGpoBrowseInfo = LPGPOBROWSEINFO;
  675. function BrowseForGPO(var lpBrowseInfo: GPOBROWSEINFO): HRESULT; stdcall;
  676. {$EXTERNALSYM BrowseForGPO}
  677. //=============================================================================
  678. //
  679. // ImportRSoPData
  680. //
  681. // Imports a data file generated by ExportRSoPData
  682. //
  683. // lpNameSpace   - Namespace to place the data in
  684. // lpFileName    - Filename containing the data
  685. //
  686. // Returns:  S_OK if successful
  687. //
  688. // Notes:    The namespace specified in lpNameSpace must exist prior to calling
  689. //           this function.
  690. //
  691. //=============================================================================
  692. function ImportRSoPData(lpNameSpace, lpFileName: LPOLESTR): HRESULT; stdcall;
  693. {$EXTERNALSYM ImportRSoPData}
  694. //=============================================================================
  695. //
  696. // ExportRSoPData
  697. //
  698. // Exports a WBEM namespace containing RSoP information to a data file.
  699. // This data file can be imported to a WBEM namespace using ImportRSoPData.
  700. //
  701. // lpNameSpace   - Namespace to read the data from
  702. // lpFileName    - Filename to receive the data
  703. //
  704. // Returns:  S_OK if successful
  705. //
  706. // Notes:    This function should be called twice.  Once for the user data
  707. //           and once for the computer data.
  708. //
  709. //=============================================================================
  710. function ExportRSoPData(lpNameSpace, lpFileName: LPOLESTR): HRESULT; stdcall;
  711. {$EXTERNALSYM ExportRSoPData}
  712. implementation
  713. const
  714.   gpeditlib = 'gpedit.dll';
  715. {$IFDEF DYNAMIC_LINK}
  716. var
  717.   _CreateGPOLink: Pointer;
  718. function CreateGPOLink;
  719. begin
  720.   GetProcedureAddress(_CreateGPOLink, gpeditlib, 'CreateGPOLink');
  721.   asm
  722.     mov esp, ebp
  723.     pop ebp
  724.     jmp [_CreateGPOLink]
  725.   end;
  726. end;
  727. {$ELSE}
  728. function CreateGPOLink; external gpeditlib name 'CreateGPOLink';
  729. {$ENDIF DYNAMIC_LINK}
  730. {$IFDEF DYNAMIC_LINK}
  731. var
  732.   _DeleteGPOLink: Pointer;
  733. function DeleteGPOLink;
  734. begin
  735.   GetProcedureAddress(_DeleteGPOLink, gpeditlib, 'DeleteGPOLink');
  736.   asm
  737.     mov esp, ebp
  738.     pop ebp
  739.     jmp [_DeleteGPOLink]
  740.   end;
  741. end;
  742. {$ELSE}
  743. function DeleteGPOLink; external gpeditlib name 'DeleteGPOLink';
  744. {$ENDIF DYNAMIC_LINK}
  745. {$IFDEF DYNAMIC_LINK}
  746. var
  747.   _DeleteAllGPOLinks: Pointer;
  748. function DeleteAllGPOLinks;
  749. begin
  750.   GetProcedureAddress(_DeleteAllGPOLinks, gpeditlib, 'DeleteAllGPOLinks');
  751.   asm
  752.     mov esp, ebp
  753.     pop ebp
  754.     jmp [_DeleteAllGPOLinks]
  755.   end;
  756. end;
  757. {$ELSE}
  758. function DeleteAllGPOLinks; external gpeditlib name 'DeleteAllGPOLinks';
  759. {$ENDIF DYNAMIC_LINK}
  760. {$IFDEF DYNAMIC_LINK}
  761. var
  762.   _BrowseForGPO: Pointer;
  763. function BrowseForGPO;
  764. begin
  765.   GetProcedureAddress(_BrowseForGPO, gpeditlib, 'BrowseForGPO');
  766.   asm
  767.     mov esp, ebp
  768.     pop ebp
  769.     jmp [_BrowseForGPO]
  770.   end;
  771. end;
  772. {$ELSE}
  773. function BrowseForGPO; external gpeditlib name 'BrowseForGPO';
  774. {$ENDIF DYNAMIC_LINK}
  775. {$IFDEF DYNAMIC_LINK}
  776. var
  777.   _ImportRSoPData: Pointer;
  778. function ImportRSoPData;
  779. begin
  780.   GetProcedureAddress(_ImportRSoPData, gpeditlib, 'ImportRSoPData');
  781.   asm
  782.     mov esp, ebp
  783.     pop ebp
  784.     jmp [_ImportRSoPData]
  785.   end;
  786. end;
  787. {$ELSE}
  788. function ImportRSoPData; external gpeditlib name 'ImportRSoPData';
  789. {$ENDIF DYNAMIC_LINK}
  790. {$IFDEF DYNAMIC_LINK}
  791. var
  792.   _ExportRSoPData: Pointer;
  793. function ExportRSoPData;
  794. begin
  795.   GetProcedureAddress(_ExportRSoPData, gpeditlib, 'ExportRSoPData');
  796.   asm
  797.     mov esp, ebp
  798.     pop ebp
  799.     jmp [_ExportRSoPData]
  800.   end;
  801. end;
  802. {$ELSE}
  803. function ExportRSoPData; external gpeditlib name 'ExportRSoPData';
  804. {$ENDIF DYNAMIC_LINK}
  805. end.