Hoffe das hilft. Wie ich schon sagte, es ist hässlich, aber es funktioniert. Sie müssen wahrscheinlich die Gruppenrichtlinien-Verwaltungskonsole installieren, um einen Verweis auf GPMGMTLib.dll hinzuzufügen. Dies ist direkt von meinem Code, so dass Sie mit ihm spielen müssen werden, aber es sollte Sie in die richtige Richtung bekommen:
Dim GPM As New GPMGMTLib.GPM
Dim GPMConst As GPMGMTLib.GPMConstants = GPM.GetConstants
Dim GPMDomain As GPMGMTLib.GPMDomain = GPM.GetDomain(Environment.GetEnvironmentVariable("USERDNSDOMAIN"), "", GPMConst.UseAnyDC)
Dim RootDSE As New DirectoryServices.DirectoryEntry("LDAP://RootDSE")
'Dim GPMSOM As GPMGMTLib.GPMSOM = GPMDomain.GetSOM("OU name") 'to link to specific OU
Dim GPMSOM As GPMGMTLib.GPMSOM = GPMDomain.GetSOM(RootDSE.Properties("defaultNamingContext").Value.ToString()) '//DC=domain,DC=test
'//=======================
'//see if we already exist
'//=======================
Dim GPMSearchExisting As GPMGMTLib.GPMSearchCriteria = GPM.CreateSearchCriteria
GPMSearchExisting.Add(GPMConst.SearchPropertyGPODisplayName, GPMGMTLib.GPMSearchOperation.opEquals, "Agent_Installation")
Dim GPOListExisting As GPMGMTLib.GPMGPOCollection = GPMDomain.SearchGPOs(GPMSearchExisting)
If GPOListExisting.Count <> 0 Then
MsgBox("GPO already exists.")
Exit Sub
End If
'//=============================================================================
'//copy compressed GPO template from embedded resources to filesystem then unzip
'//=============================================================================
lblStatus.Text += "Copying embedded GPO template to filesystem..." & vbNewLine
lblStatus.Refresh()
My.Computer.FileSystem.WriteAllBytes("c:\Agent_Installation_GPO.zip", My.Resources.Agent_Installation_GPO, False)
lblStatus.Text += "Extracting GPO template from archive..." & vbNewLine
lblStatus.Refresh()
Call UnZip("c:\Agent_Installation_GPO.zip", "c:\")
'//=========================================================================================
'//need to create a GPO migration table on the fly. see Create_Migration_Table() for details
'//=========================================================================================
lblStatus.Text += "Creating GPO migration table..." & vbNewLine
lblStatus.Refresh()
Call Create_Migration_Table("c:\Agent_Installation_GPO.migtable")
lblStatus.Text += "Creating GPO..." & vbNewLine
lblStatus.Refresh()
Dim GPO As GPMGMTLib.GPMGPO = GPMDomain.CreateGPO
GPO.DisplayName = "Agent_Installation"
lblStatus.Text += "Linking GPO to domain..." & vbNewLine
lblStatus.Refresh()
'//===========================
'//links the GPO to the domain
'//===========================
GPMSOM.CreateGPOLink(-1, GPO)
Dim GPMSearchCriteria As GPMGMTLib.GPMSearchCriteria = GPM.CreateSearchCriteria
GPMSearchCriteria.Add(GPMConst.SearchPropertyGPODisplayName, GPMGMTLib.GPMSearchOperation.opEquals, "Agent_Installation")
Dim GPOList As GPMGMTLib.GPMGPOCollection = GPMDomain.SearchGPOs(GPMSearchCriteria)
Dim GPMGPO As GPMGMTLib.GPMGPO = GPOList.Item(1)
lblStatus.Text += "Importing settings from template..." & vbNewLine
lblStatus.Refresh()
'//========================================================
'//link migration table to template and import all settings
'//========================================================
Dim GPMBackupDir As GPMGMTLib.GPMBackupDir = GPM.GetBackupDir("C:\Agent_Installation_GPO")
Dim GPMBackup As GPMGMTLib.GPMBackup = GPMBackupDir.GetBackup("{193E0BEE-B37E-4472-A032-F297C4A5D8E1}")
Dim GPMMigrationTable As GPMGMTLib.GPMMigrationTable = GPM.GetMigrationTable("c:\Agent_Installation_GPO.migtable")
Dim GPMResult As GPMGMTLib.GPMResult = GPMGPO.Import(0, GPMBackup, GPMMigrationTable)
lblStatus.Text += "Done"
lblStatus.Refresh()
Und dies ist die Funktion, die die Migrationstabelle erstellt. Für meinen Test habe ich test.domain verwendet, aber wie Sie sehen können, ersetze ich dies durch die aktuelle Domain, bevor ich das XML zusammenführe. Beachten Sie, dass die XML-Datei utf-16 sein muss oder nicht.
Using objWriter As New System.IO.StreamWriter(strPath, False, System.Text.Encoding.Unicode) '//must be utf-16
objWriter.WriteLine("<?xml version=""1.0"" encoding=""utf-16""?>")
objWriter.WriteLine("<MigrationTable xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns=""http://www.microsoft.com/GroupPolicy/GPOOperations/MigrationTable"">")
objWriter.WriteLine(" <Mapping>")
objWriter.WriteLine(" <Type>UNCPath</Type>")
objWriter.WriteLine(" <Source>\\test.domain\netlogon</Source>")
objWriter.WriteLine(" <Destination>\\" & Environment.GetEnvironmentVariable("USERDNSDOMAIN") & "\netlogon</Destination>")
objWriter.WriteLine(" </Mapping>")
objWriter.Write("</MigrationTable>")
objWriter.Close()
End Using
Gibt es einen Grund, warum Sie nicht einfach GP GUI verwenden können? –
Ich brauche ein automatisiertes System für den Prozess für meinen Kunden. Aus diesem Grund benötige ich eine programmatische Methode zur Bereitstellung über Gruppenrichtlinien oder ein beliebiges Anmeldeskript. – Harsh
@GeekOnDemand das ist so viel komplizierter, als Sie sich vorstellen können. Ich musste eine Software-Installation gpo programmatisch erstellen und fand schnell heraus, dass es keinen wirklichen Weg dafür gibt. Sie * CAN * verwenden verschiedene Bibliotheken (GPMGMT), um ein leeres Gruppenrichtlinienobjekt zu erstellen, aber soweit das Einstellen der tatsächlichen Einstellungen nicht sinnvoll ist. Sie müssen entweder die Registrierung bearbeiten (was je nach dem betreffenden Gruppenrichtlinienobjekt nicht immer funktioniert) oder das tun, was ich getan habe: Erstellen Sie das Gruppenrichtlinienobjekt manuell, exportieren Sie es in eine XML-Datei und fügen Sie es anschließend in Ihren Code ein eine GPO-Migrationstabelle zum Konfigurieren der Einstellungen. Hässlich, aber es funktioniert. Viel Glück. –