簡體   English   中英

使用C#讀取組策略設置

[英]Reading Group Policy Settings using C#

如何在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為null,則表示沒有與容器(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對象,因此您必須妥善處理這些對象。

更新:工作副本。 您現在可以使用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/aa814316v = vs。85) 。aspx

Microsoft.GroupPolicy命名空間https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.grouppolicy(v=vs.85).aspx

這是一個更好,更完整的例子。

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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM