jschneider
Goto Top

Script zur Verknüpfung von GPOs zu OUs (erweitern)

eigentliche Funktion vorhanden, aber keine "Stapelverarbeitung"

Hallo,

ich habe hier ein nettes Script (von MS) welches ein vorhandenes GPO-Objekt zu einer OU verlinkt.

Soweit so gut.

Ich brauch es so,dass dieses Scripteine TXT-Datei schaut in der meinetwegen 20 OU's drin stehen die dann nach und nach vom Script abgearbeitet werden

wie dies Quell-OU Textdatei formatiert ist nicht vorgegeben - da bin ich alo frei

So hier sieht das Script aus, welches ich aber schon etwas erweitert habe:

Dim OUType
Dim OUFile
Dim GPOStatus

OUType = inputbox("Waehlen Sie die gewünschte OU zum verlinken aus" & vbnewline & vbnewline & "1 = Alle Benutzer OUs" & vbnewline & "2 = Alle Desktop OUs" & vbnewline & "3 = Alle Desktop -Windows2000 OUs" & vbnewline & "4 = Alle Desktop -WindowsXP OUs" & vbnewline & "5 = Alle Desktop -WindowsVista OUs" & vbnewline & "6 = Alle Notebook OUs" & vbnewline & "7 = Alle Notebook -Windows2000 OUs" & vbnewline & "8 = Alle Notebook -WindowsXP OUs" & vbnewline & "9 = Alle Notebook -WindowsVista OUs" ,"GPO zu OUs Verlinken")  

if OUType ="" then  
msgbox "Ohne Eingabe wird das Script beendet",16,"Hinweis"  
WScript.Quit
end if

if isnumeric(OUType) = false then
msgbox "Bitte nur einzelne Zahlen eingeben",16,"Hinweis"  
WScript.Quit
else
end if

if OUType > 9 or OUtype = 0 then
msgbox "Bitte nur zwischen 1 und 9 wählen",16,"Hinweis"  
WScript.Quit
else
end if

if OUType = 1 then 
OUFile="C:\01-Alle-BenutzerOUs.txt"  
end if


if OUType = 2 then 
	OUFile="C:\02-Alle-DesktopOUs.txt"  
end if

if OUType = 3 then 
	OUFile="C:\03-Alle-DesktopW2kOUs.txt"  
end if

if OUType = 4 then 
	OUFile="C:\04-Alle-DesktopXPOUs.txt"  
end if

if OUType = 5 then 
OUFile="C:\05-Alle-DesktopVistaOUs.txt"  
end if

if OUType = 6 then 
	OUFile="C:\06-Alle-NotebookOUs.txt"  
end if

if OUType = 7 then 
	OUFile="C:\07-Alle-NotebookW2kOUs.txt"  
end if

if OUType = 8 then 
OUFile="C:\08-Alle-NotebookXPOUs.txt"  
end if

if OUType = 9 then 
OUFile="C:\09-Alle-NotebookVistaOUs.txt"  
end if


wscript.echo "OUs aus der Datei " & OUfile & " werden benutzt."  


GPOStatus = inputbox("Bitte geben Sie den Status der verlinkten GPO an" & vbnewline & vbnewline & "1 = deaktiviert" & vbnewline & "2 = aktiviert","Eingabe der Richtlinie")  

if GPOStatus ="" then  
	msgbox "Ohne Eingabe wird das Script beendet",16,"Hinweis"  
	WScript.Quit
end if

if isnumeric(GPOStatus) = false then
	msgbox "Bitte nur einzelne Zahlen eingeben",16,"Hinweis"  
	WScript.Quit
else
end if

if GPOStatus > 2 or GPOStatus = 0 then
	msgbox "Bitte nur 1 oder 2 wählen",16,"Hinweis"  
	WScript.Quit
else
end if

if GPOStatus = 1 then 
	strGPOLinkOptions = 1
end if


if GPOStatus = 2 then 
	strGPOLinkOptions = 2
end if



GPOName = inputbox("Bitte geben Sie den Namen der zu verlinkenden Richtlinie ein" ,"Eingabe der Richtlinie")  





On Error Resume Next

Set objContainer = GetObject _
    ("LDAP://ou=99-ClientMigTest,DC=ADS,DC=meinedomain,DC=NET")   
 
strExistingGPLink = objContainer.Get("gPLink")  
 
strGPODisplayName = GPOName

strNewGPLink = "[" & GetGPOADsPath & ";" & strGPOLinkOptions & "]"  
 
objContainer.Put "gPLink", strExistingGPLink & strNewGPLink  
objContainer.Put "gPOptions", "0"  
 
objContainer.SetInfo
 
Function GetGPOADsPath
    Set objConnection = CreateObject("ADODB.Connection")    
    objConnection.Open "Provider=ADsDSOObject;"     
 
    Set objCommand = CreateObject("ADODB.Command")  
    objCommand.ActiveConnection = objConnection
 
    objCommand.CommandText = _
      "<LDAP://cn=Policies,cn=System,DC=ADS,DC=meinedomain,DC=NET>;;" & _  
          "distinguishedName,displayName;onelevel"  
    Set objRecordSet = objCommand.Execute
 
    Do Until objRecordSet.EOF
        If objRecordSet.Fields("displayName") = strGPODisplayName Then  
          GetGPOADsPath = "LDAP://" & objRecordSet.Fields("distinguishedName")  
          objConnection.Close
          Exit Function
        End If
        objRecordSet.MoveNext
    Loop
    objConnection.Close
End Function

müsste ich halt "irgendwie" so haben, dass dieser Wert aus der Textdatei ausgelesen und verarbeitet wird Bis die Datei keine weiteren Einträge mehr aufweisst. Die Übergabe des Dateinamens habe ich schon, nur wie auslesen und abarbeiten ?

Und da das für Euch Profis natürlich Zuuu einfach wäre face-smile ... hier noch was

Ich frage ja nach der EIngabe des GPO-namens der verlinkt werden soll - wer hier eine Idee hat zur Abfrage ob diese GPO überhaupt existiert (wegen falscheingaben)....

(editiert weil ich mit den abfragen schon etwas weiter gekommen bin)

Vielen Dank für Eure Mithilfe

Jan

Content-ID: 71267

Url: https://administrator.de/contentid/71267

Ausgedruckt am: 25.11.2024 um 18:11 Uhr

bastla
bastla 19.10.2007 um 00:03:00 Uhr
Goto Top
Hallo jschneider!

Da ich das "nette Script (von MS)" einerseits nicht in Frage stellen und andererseits auch nicht testen mochte face-wink, habe ich nur einen Vorschlag für das "Drumherum":
Do
	OUType = InputBox("Waehlen Sie die gewünschte OU zum Verlinken aus" & vbnewline & vbnewline & _  
		"1 = Alle Benutzer OUs" & vbnewline & _  
		"2 = Alle Desktop OUs" & vbnewline & _  
		"3 = Alle Desktop -Windows2000 OUs" & vbnewline & _  
		"4 = Alle Desktop -WindowsXP OUs" & vbnewline & _  
		"5 = Alle Desktop -WindowsVista OUs" & vbnewline & _  
		"6 = Alle Notebook OUs" & vbnewline & _  
		"7 = Alle Notebook -Windows2000 OUs" & vbnewline & _  
		"8 = Alle Notebook -WindowsXP OUs" & vbnewline & _  
		"9 = Alle Notebook -WindowsVista OUs" & vbnewline & vbnewline & _  
		"0 = Abbruch", _  
		"GPO zu OUs Verlinken")  

	blnOK = True
	If OUType = "" Then OUType = "0"  

	If Not IsNumeric(OUType) Then
		blnOK = False
		MsgBox "Nur eine Zahl zwischen 0 und 9 eingeben!", vbCritical, "Hinweis"  
	Else
		OUType = Abs(CInt(OUType))
		Select Case OUType
		Case 0: WScript.Quit
		Case 1: OUFile="C:\01-Alle-BenutzerOUs.txt"  
		Case 2: OUFile="C:\02-Alle-DesktopOUs.txt"  
		Case 3: OUFile="C:\03-Alle-DesktopW2kOUs.txt"  
		Case 4: OUFile="C:\04-Alle-DesktopXPOUs.txt"  
		Case 5: OUFile="C:\05-Alle-DesktopVistaOUs.txt"  
		Case 6: OUFile="C:\06-Alle-NotebookOUs.txt"  
		Case 7: OUFile="C:\07-Alle-NotebookW2kOUs.txt"  
		Case 8: OUFile="C:\08-Alle-NotebookXPOUs.txt"  
		Case 9: OUFile="C:\09-Alle-NotebookVistaOUs.txt"  
		Case Else
			blnOK = False
			MsgBox "Nur eine Zahl zwischen 0 und 9 eingeben!", vbCritical, "Hinweis"  
		End Select
	End If
Loop Until blnOK

Set fso = CreateObject("Scripting.FileSystemObject")  
If Not fso.FileExists(OUFile) Then
	MsgBox "Datei " & OUFile & " wurde nicht gefunden - " & vbCrLF & _  
		"bitte benachrichtigen Sie ...", _  
		vbCritical, "Hinweis"  
	WScript.Quit
End If

WScript.Echo "OUs aus der Datei " & OUfile & " werden benutzt."  

Do
	GPOStatus = InputBox("Bitte geben Sie den Status der verlinkten GPO an" & vbnewline & vbnewline & _  
		"1 = deaktiviert" & vbnewline & _  
		"2 = aktiviert" & vbnewline & vbnewline & _  
		"0 = Abbruch", _  
		"Eingabe der Richtlinie")  

	blnOK = True
	If GPOStatus = "" Then GPOStatus = "0"  

	If Not IsNumeric(GPOStatus) Then
		blnOK = False
		MsgBox "Nur eine Zahl zwischen 0 und 2 eingeben!", vbCritical, "Hinweis"  
	Else
		GPOStatus = Abs(CInt(GPOStatus))
		Select Case GPOStatus
		Case 0: WScript.Quit
		Case 1, 2: strGPOLinkOptions = CStr(GPOStatus)
		Case Else
			blnOK = False
			MsgBox "Nur eine Zahl zwischen 0 und 2 eingeben!", vbCritical, "Hinweis"		  
		End Select
	End If
Loop Until blnOK

Do
	GPOName = InputBox("Bitte geben Sie den Namen der zu verlinkenden Richtlinie ein" & vbCrLF & vbCrLF & _  
		"oder wählen Sie 'Abbrechen'!", _  
		"Eingabe der Richtlinie")  

	If GPOName = "" Then WScript.Quit  
	
	blnOK = True
	strGPODisplayName = GPOName
	strGPOADsPath = GetGPOADsPath
	If strGPOADsPath = "" Then  
		blnOK = False
		MsgBox GPOName & " wurde nicht gefunden!", vbCritical, "Hinweis"  
	End If
Loop Until blnOK = True

strNewGPLink = "[" & strGPOADsPath & ";" & strGPOLinkOptions & "]"  

On Error Resume Next
aOU = Split(fso.OpenTextFile(OUFile, 1).ReadAll, vbCrLF)
For Each strOU In aOU
	Set objContainer = GetObject _
		("LDAP://ou=" & strOU & ",DC=ADS,DC=meinedomain,DC=NET")   
	strExistingGPLink = objContainer.Get("gPLink")  

	objContainer.Put "gPLink", strExistingGPLink & strNewGPLink  
	objContainer.Put "gPOptions", "0"  
	objContainer.SetInfo
Next

MsgBox "Verlinkungen vorgenommen.", vbInformation  

'########## Ende Hauptprogramm ##########  

Function GetGPOADsPath
    Set objConnection = CreateObject("ADODB.Connection")    
    objConnection.Open "Provider=ADsDSOObject;"     
 
    Set objCommand = CreateObject("ADODB.Command")  
    objCommand.ActiveConnection = objConnection
 
    objCommand.CommandText = _
      "<LDAP://cn=Policies,cn=System,DC=ADS,DC=meinedomain,DC=NET>;;" & _  
          "distinguishedName,displayName;onelevel"  
    Set objRecordSet = objCommand.Execute
 
    Do Until objRecordSet.EOF
        If objRecordSet.Fields("displayName") = strGPODisplayName Then  
          GetGPOADsPath = "LDAP://" & objRecordSet.Fields("distinguishedName")  
          objConnection.Close
          Exit Function
        End If
        objRecordSet.MoveNext
    Loop
    objConnection.Close
End Function

... eine Idee (hat) zur Abfrage ob diese GPO überhaupt existiert (wegen falscheingaben)....
Meine Idee dazu war eigentlich nur:
strGPOADsPath = GetGPOADsPath
If strGPOADsPath = "" Then ... 'nicht gefunden  

Grüße
bastla