如何迭代 AD 域中给定 GPO(使用名称或 GUID)中的可用和/或设置设置?无需使用 powershell 等导出到 XML/HTML。
我正在使用 C# (.NET 4.0)。
如何迭代 AD 域中给定 GPO(使用名称或 GUID)中的可用和/或设置设置?无需使用 powershell 等导出到 XML/HTML。
我正在使用 C# (.NET 4.0)。
这个问题让我很兴奋,所以我去研究它。所以+1
我发现的一些解决方案从上到下是最好的,到底层是最差的
我遇到了类似的问题,不想下载和安装 Microsoft GPO 库 (Microsoft.GroupPolicy.Management)。我想用 System.DirectoryServices 来完成这一切。它需要一点点挖掘,但它可以完成。
首先使用 DirectorySearcher 检索您的容器。您需要已经打开一个目录条目才能传递给搜索器。你想要的过滤器是:
string filter = "(&" + "(objectClass=organizationalUnit)" + "(OU=" + container + "))";
并且您感兴趣的属性名为“gPLink”,因此请创建一个包含该属性的数组:
string[] requestProperties = { "gPLink" };
现在检索结果,并拉出 gPLink(如果可用)。
using (var searcher = new DirectorySearcher(directory, filter, properties, SearchScope.Subtree))
{
SearchResultCollection results = searcher.FindAll();
DirectoryEntry entry = results[0].GetDirectoryEntry();
string gpLink = entry.Properties["gPLink"].Value;
如果 gpLink 为空,则没有与容器 (OU) 关联的 GPO。否则,gpLink 将包含如下字符串:
"[LDAP://cn={31B2F340-016D-11D2-945F-00C04FB984F9},cn=policies,cn=system,DC=Test,DC=Domain;0]"
在上面的文本中,您可以看到 GPO 的 CN。我们现在需要做的就是从 DC 中检索 GPO。
为此,我们使用如下所示的过滤器:
string filter = "(&" +
"(objectClass=groupPolicyContainer)" +
"(cn={31B2F340-016D-11D2-945F-00C04FB984F9}))";
您需要创建一个包含以下内容的 Properties 数组:
Properties = { "objectClass", "cn", "distinguishedName", "instanceType", "whenCreated",
"whenChanged", "displayName", "uSNCreated", "uSNChanged", "showInAdvancedViewOnly",
"name", "objectGUID", "flags", "versionNumber", "systemFlags", "objectCategory",
"isCriticalSystemObject", "gPCFunctionalityVersion", "gPCFileSysPath",
"gPCMachineExtensionNames", "dSCorePropagationData", "nTSecurityDescriptor" };
现在使用 DirectorySearcher 检索 GPO。您将在包含 Properties 集合中所有上述字段的结果中返回一个 DirectoryEntry。有些是 COM 对象,因此您必须适当地处理它们。
这是一个比上面更好,更完整的示例。
class Program
{
static void Main(string[] args)
{
DirectoryEntry rootDse = new DirectoryEntry("LDAP://rootDSE");
DirectoryEntry root = new DirectoryEntry("GC://" + rootDse.Properties["defaultNamingContext"].Value.ToString());
DirectorySearcher searcher = new DirectorySearcher(root);
searcher.Filter = "(objectClass=groupPolicyContainer)";
foreach (SearchResult gpo in searcher.FindAll())
{
var gpoDesc = gpo.GetDirectoryEntry().Properties["distinguishedName"].Value.ToString();
Console.WriteLine($"GPO: {gpoDesc}");
DirectoryEntry gpoObject = new DirectoryEntry($"LDAP://{gpoDesc}");
try
{
Console.WriteLine($"DisplayName: {gpoObject.Properties["displayName"].Value.ToString()}");
}
catch
{
}
try
{
Console.WriteLine($"PCFileSysPath: {gpoObject.Properties["gPCFileSysPath"].Value.ToString()}");
}
catch
{
}
try
{
Console.WriteLine($"VersionNumber: {gpoObject.Properties["versionNumber"].Value.ToString()}");
}
catch
{
}
try
{
Console.WriteLine($"UserExtensionNames: {gpoObject.Properties["gPCUserExtensionNames"].Value.ToString()}");
}
catch
{
}
try
{
Console.WriteLine($"MachineExtensionNames: {gpoObject.Properties["gPCMachineExtensionNames"].Value.ToString()}");
}
catch
{
}
try
{
Console.WriteLine($"PCFunctionality: {gpoObject.Properties["gPCFunctionalityVersion"].Value.ToString()}");
}
catch
{
}
}
Console.ReadKey();
}
}
更新:工作副本。您现在可以使用 c# 来读取和解析给定的 GPO,而无需使用 Powershell 或将任何内容写入磁盘。
using Microsoft.GroupPolicy;
var guid = new Guid("A7DE85DE-1234-F34D-99AD-5AFEDF7D7B4A");
var gpo = new GPDomain("Centoso.local");
var gpoData = gpo.GetGpo(guid);
var gpoXmlReport = gpoData.GenerateReport(ReportType.Xml).ToString();
using (XmlReader reader = XmlReader.Create(new StringReader(gpoXmlReport)))
{
string field;
while (reader.MoveToNextAttribute())
{
foreach (string attr in attributes)
{
// do something
}
}
}
这使用组策略管理控制台 (GPMC) 工具: https ://msdn.microsoft.com/en-us/library/windows/desktop/aa814316(v=vs.85).aspx
Microsoft.GroupPolicy 命名空间 https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.grouppolicy(v=vs.85).aspx