18

ADドメインの特定のGPO(名前またはGUIDを使用)で使用可能な設定や設定を繰り返すにはどうすればよいですか?PowerShellなどを使用してXML/HTMLにエクスポートする必要はありません。

C#(.NET 4.0)を使用しています。

4

4 に答える 4

10

その質問は私を誇大宣伝させたので、私はそれを研究しに行きました。だから+1

私が見つけたいくつかの解決策は、上から下に向かって最高であり、最悪です

于 2011-03-16T04:04:07.283 に答える
5

同様の問題が発生し、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を取得します。プロパティコレクションの上記のすべてのフィールドを含む結果にDirectoryEntryが返されます。一部はCOMオブジェクトであるため、それらを適切に処理する必要があります。

于 2015-04-15T14:47:47.460 に答える
1

更新:作業コピー。これで、C#を使用して、Powershellを使用したり、ディスクに何かを書き込んだりすることなく、特定のGPOの読み取りと解析を行うことができます。

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

于 2016-05-03T23:09:25.047 に答える
1

上記よりも優れた、より完全な例を次に示します。

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();
    }
}
于 2016-10-11T19:19:04.677 に答える