2012-04-04 18 views
0

Ich muss meine vb.net-Anwendung über Gruppenrichtlinien bereitstellen. Ich habe einige Informationen darüber gefunden, wie man das hier macht http://windowsdevcenter.com/pub/a/windows/2006/11/14/how-to-deploy-software-using-group-policy.html.Wie programmgesteuert GPO erstellen?

Jetzt muss ich das gleiche programmatisch tun. Bitte schlagen Sie einen Link, ein Dokument oder eine Anleitung zu diesem Thema vor.

+0

Gibt es einen Grund, warum Sie nicht einfach GP GUI verwenden können? –

+0

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

+1

@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. –

Antwort

1

Nun,

Ich glaube nicht, dass es API GPO erstellen dokumentiert. Sie können es manuell erstellen und dann CreateGPOLink Funktion verwenden, um es OU zu verknüpfen

Gerade PS Skript gefunden, die neue GPO erstellen annehmen, dachte, es Hilfe für Sie sein kann http://blogs.technet.com/b/heyscriptingguy/archive/2009/02/11/how-can-i-create-new-group-policy-objects.aspx

Ich glaube, Ihre Frage hier beantwortet C# linking group policy in AD

+0

Sie müssten es dann "P/Invoke". Das OP fragte nach "C#". –

+0

Yup, du hast Recht. Es gibt offensichtlich viel besseren Weg mit Interop und GPMGMT-Bibliothek. – Zilog

1

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