2012-04-04 177 views
0

我需要通過組策略部署我的vb.net應用程序。我在這裏找到了一些關於如何在http://windowsdevcenter.com/pub/a/windows/2006/11/14/how-to-deploy-software-using-group-policy.html處執行此操作的信息。如何以編程方式創建GPO?

現在我需要做相同的編程。 請在此建議一些鏈接,文檔或教程。

+0

任何你不能使用GP GUI的理由? – 2012-04-04 13:40:26

+0

我需要一個用於我的客戶的過程的自動化系統。這就是我需要通過組策略或任何登錄腳本部署的編程方式的原因。 – Harsh 2012-04-04 13:43:30

+1

@GeekOnDemand這比你想象的要複雜得多。我必須以編程方式創建一個軟件安裝gpo,並很快發現沒有真正的方法來做到這一點。您*可以*使用各種庫(GPMGMT)來創建一個空的GPO,但就設置實際設置而言,沒有好處。您必須編輯註冊表(根據所討論的GPO,該註冊表不會始終有效),或者執行以下操作:手動創建GPO,將其導出到xml文件,然後在代碼中將您的XML與GPO遷移表來配置設置。醜陋但「有用」。祝你好運。 – 2012-04-04 15:13:46

回答

1

好,

我不認爲有記錄API來創建GPO。您可以手動創建它,然後使用 CreateGPOLink函數將其鏈接到OU的

剛剛發現PS腳本,想創造新的GPO的,認爲這可能是幫助你http://blogs.technet.com/b/heyscriptingguy/archive/2009/02/11/how-can-i-create-new-group-policy-objects.aspx

我認爲你的問題在這裏回答C# linking group policy in AD

+0

然後你必須'P/Invoke'。 OP要求'C#'。 – 2012-04-04 14:13:24

+0

是的,你說得對。使用interop和GPMGMT庫顯然有更好的方法。 – Zilog 2012-04-04 14:40:45

1

希望這會有所幫助。就像我說的那樣,它很醜,但很有效。您可能必須安裝組策略管理控制檯,以便您可以添加對GPMGMTLib.dll的引用。這是直接從我的代碼,所以你必須與它玩,但它應該讓你在正確的方向前進:

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

,和本是創建遷移表的功能。對於我的測試,我使用了test.domain,但正如你所看到的,我在合併XML之前將其替換爲當前域。請注意,XML必須是utf-16或這不起作用。

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 
相關問題