micneu
Goto Top

VBScript - Gruppen Abfragen eines Windows Server (AD)

Hallo Leute,

ich habe ein script in VBScript geschrieben und habe jetzt nur ein kleines Problem:
Ich kann die Security Groups nicht abfragen.

Also das ziel ist es das alle Domain user über die Gruppen zugehörigkeit ihren Drucker zugewisen bekommen.
Für Netzlaufwerke habe ich es schon hinbekommen, dort nutze ich auch Gruppen, für die Drucker habe ich aber Security Groups genommen.
Wie kann ich das abfragen, hier mein script:

Ab Zeile 34 werte ich die Gruppen aus, wie kann ich es jetzt einbauen das er auch die Security Groups auswertet?

Option Explicit
Dim arNETLW, iz, zaehler, X64
Dim FSO, NetLW, colDrives, objNetwork, Network, USERNAME
Set FSO = CreateObject("Scripting.FileSystemObject")  
Set Network = Wscript.CreateObject("Wscript.Network")  

ShowPrinter
' Drucker zuweisung   
	if ValidateADGroup("Drucker 1") Then  
		PrinterPath = "\\SBSSERVER\Drucker 1"  
		PrinterDriver = "HP Universal Printing PS"  
		Network.AddWindowsPrinterConnection PrinterPath, PrinterDriver
	End If	
	if ValidateADGroup("Drucker 1 STD") Then  
		Network.SetDefaultPrinter "\\SBSSERVER\Drucker 1"  
	End If
	
Function ShowPrinter()
	wscript.echo "ShowPrinter"  
	Dim strComputer, objWMIService, colInstalledPrinters, objPrinter
	strComputer = "localhost"  
	Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
	Set colInstalledPrinters =  objWMIService.ExecQuery _
    ("Select * from Win32_Printer")  
	
	For Each objPrinter In colInstalledPrinters
		If InStr(1, objPrinter.Name, "\\", 1) Then  
			WScript.Echo "Name: " & objPrinter.Name  
		End If		
	Next
End Function

' Abfrage der AD Gruppen  
Function ValidateADGroup(AD_PACKAGE_GROUP) 
	Dim message 
	Dim objADSysInfo : Set objADSysInfo = CreateObject("ADSystemInfo")   
	Dim strUser : strUser = objADSysInfo.UserName 
	Dim strGroup 
	Dim objGroup 
	Dim objUser : Set objUser = GetObject("LDAP://" & strUser)   
	For Each strGroup in objUser.memberOf 
		Set objGroup = GetObject("LDAP://" & strGroup)   
		If InStr(objGroup.CN, AD_PACKAGE_GROUP) <> 0 Then 
			ValidateADGroup = True 
			Set objGroup = nothing 
			Exit Function
		Else 
			ValidateADGroup = False 
			Set objGroup = nothing 
		End If
	Next 
End Function

kann ich die zeile 44 so verändern das eine art or bedingung security groups mit abfragt?
könnte es so gehen?
If InStr(objGroup.CN, AD_PACKAGE_GROUP or ADS_GROUP_TYPE_SECURITY) <> 0 Then 

oder muss die funktion komplett neu geschrieben werden?

gruß michael

Content-ID: 160463

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

Ausgedruckt am: 23.11.2024 um 10:11 Uhr

60730
60730 09.02.2011 um 15:30:14 Uhr
Goto Top
Salü,

ganz dumme Gegenfrage - wenn du schreibst für die Drucker nimmst du aber Security Groups - was hast du für die Netzwerklaufwerke genommen?
Distributiongroups?

Die Frage, warum so was "banales" wie ein Loginscript mit VBS zu schreiben, verkneife ich mir face-wink

Gruß
bastla
bastla 09.02.2011 um 15:32:45 Uhr
Goto Top
Hallo micneu!

Was verstehst Du in diesem Fall unter "Security Group"?
Abgesehen davon prüft Deine Function die Mitgliedschaft bei der als Parameter übergebenen Gruppe - wenn mehrere Gruppenmitgliedschaften geprüft werden sollen, musst Du die Function mehrmals aufrufen oder eben alle zu prüfenden Gruppen übergeben.

Um mehrere Gruppen mit einmaligem Einlesen der Mitgliedschaften prüfen zu können, würde ich sie in einem String nach dem Muster
#Gruppe1#Gruppe2#Gruppe3#
zusammenfassen und dann die "InStr"-Abfrage umkehren:
<code type="plain"">If InStr(AD_PACKAGE_GROUP, "#" & objGroup.CN & "#") <> 0 Then

Grüße
bastla
micneu
micneu 09.02.2011 um 15:49:37 Uhr
Goto Top
Hallo bastla,

ich habe das netzt übernommen und es waren schon einige gruppen angelegt.
Mir wurde vorgegeben das z.b.:
LW x: ist netzlaufwerk \\sbsserver\bla1
LW z: ist netzlaufwerk \\sbsserver\bla2

diese laufwerke bekommen alle die in der gruppe HUSTEN sind.

und für die Drucker Sollte ich unter Security Groups, eine Gruppe "Drucker 1", "Drucker 2" usw. einrichten
der Gruppenbereich ist bei allen "Global" und Gruppentyp ist Sicherheit"

Ist jetzt ein User in der Gruppe "Drucker 1" bekommt er den auch zugewiesen als Standard drucker.
hoffe es ist jetzt verständlicher

jetzt frage ich noch anderst, wie kann ich in vbscript abfragen welchen typ eine gruppe ist?

gruß michael
micneu
micneu 09.02.2011 um 16:02:58 Uhr
Goto Top
kann es was damit zu tun haben wo meine gruppe im ad liegt?

hier ein beispiel:

domain.local/MyBusiness/Security Groups/Drucker/Drucker 1
domain.local/MyBusiness/Users/SBSUsers/HUSTEN

husten klappt für die netzlaufwerke, nur drucker 1 ja nicht.

gruß michael
60730
60730 09.02.2011 um 17:33:25 Uhr
Goto Top
Moin,

ganz kurz, weil jetzt das Kinderl dran ist..

Es gibt Verteilergruppen - Sicherheitsgruppen und Organsationseinheiten....

Nur bei AD Abfragen der Ous sind die Orte, wo die hingelegt wurden interessant...

Von daher bitte beantworte doch mal meine großgeschriebene und Bastlas Frage nach "welcher Zusammenhang Sicherheitsgruppe" denn mit der Problematik zu tun hat.

Sorry mehr Zeit hab ich jetzt nicht, aber der eigene Genpool geht vor.
bastla
bastla 09.02.2011 um 19:15:52 Uhr
Goto Top
Hallo micneu!
jetzt frage ich noch anderst, wie kann ich in vbscript abfragen welchen typ eine gruppe ist?
Brauchst Du nicht, wenn Du ohnehin nur Sicherheitsgruppen verwendest.
husten klappt für die netzlaufwerke, nur drucker 1 ja nicht.
Lässt sich "klappt nicht" noch etwas näher ausführen (etwa mittels einer Fehlermeldung)?
Wenn Du einfach einmal nur die (direkte) Gruppenmitgliedschaft kontrollieren willst:
strUser = CreateObject("ADSystemInfo").UserName  
Groups = "Gruppen:"  
For Each strGroup in GetObject("LDAP://" & strUser).memberOf   
    Groups = Groups & vbCrLf & GetObject("LDAP://" & strGroup).cn  
Next 
WScript.Echo Groups
Grüße
bastla
DerWoWusste
DerWoWusste 12.02.2011 um 16:39:16 Uhr
Goto Top
Lass mal bitte kurz schauen, wie Dein Konzept aussieht, wenn Du Folgendes in Betracht ziehst:

Nur Admins oder (in winxp) Hauptbenutzer können Drucker installieren, somit ist ohne Änderungen von einstellungen nur eine Zuweisung an Computerobjekte möglich. Das macht man wiederum am besten über GPOs (möglich ab 2003 R2 DCs), es sei denn man möchte wirklich Benutzern zuweisen (die an mehreren Rechnern sitzen und unabhängig vom Standort die selben Drucker haben sollen, während andere am selben Rechner auch andere Drucker bekommen sollen).
micneu
micneu 19.04.2011 um 10:51:51 Uhr
Goto Top
Hallo Leute,

habe jetzt eine lösung.

Hier mein code:
' Login.vbs  
' Login script mit Gruppenabfrage und Drucker zuweisung  
' michael.neumann@itech-consulting.net  
' Kunde: Teravolt / QTom  
' Stand: 21.02.2011  
' ====================================================  
' Deklaration der Variablen  
Option Explicit
Dim arNETLW, iz, zaehler, X64
Dim FSO, NetLW, colDrives, objNetwork, Network, USERNAME
Dim PrinterPath, PrinterDriver, AD_GRP_1, AD_GRP_2, PRINTER_PATH, PRINTER_DRV
Set FSO = CreateObject("Scripting.FileSystemObject")  
Set Network = Wscript.CreateObject("Wscript.Network")  

On Error Resume Next
	Dim WshShell
	Dim OsType
	
	Set WshShell = CreateObject("WScript.Shell")  
	OsType = WshShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PROCESSOR_ARCHITECTURE")  
	If OsType = "x86" then  
		'wscript.echo "Windows 32bit system detected"  
		X64 = "NO"  
	elseif OsType = "AMD64" then  
		'wscript.echo "Windows 64bit system detected"  
		X64 = "YES"		  
	end if

IF X64 = "YES" THEN  
	'NICHTS  
ELSE
	'ShowPrinter  
	RemoveNetPrinter	
'	SW-MFP-PS  
	NetUsePrinters "SW-MFP-PS","SW-MFP-PS_STD","\\SRV-01\SW-MFP-PS","HP Universal Printing PS"  
'	PCenter SW PS  
	NetUsePrinters "PCenter-SW-PS","PCenter-SW-PS_STD","\\SRV-01\PCenter-SW-PS","HP Universal Printing PS"	  
'	PCenter SW PCL6  
	NetUsePrinters "PCenter-SW-PCL6","PCenter-SW-PCL6_STD","\\SRV-01\PCenter-SW-PCL6","HP Universal Printing PCL6"  
	ShowPrinter
END IF

Function ShowPrinter	
	Dim strComputer, objWMIService, colInstalledPrinters, objPrinter
	strComputer = "localhost"  
	Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
	Set colInstalledPrinters =  objWMIService.ExecQuery _
    ("Select * from Win32_Printer")  
	
	For Each objPrinter In colInstalledPrinters
		If InStr(1, objPrinter.Name, "\\", 1) Then  
			WScript.Echo "Name: " & objPrinter.Name  
		End If		
	Next
End Function

' Abfrage der AD Gruppen  
Function ValidateADGroup(AD_PACKAGE_GROUP) 
	Dim message 
	Dim objADSysInfo : Set objADSysInfo = CreateObject("ADSystemInfo")   
	Dim strUser : strUser = objADSysInfo.UserName 
	Dim strGroup 
	Dim objGroup 
	Dim objUser : Set objUser = GetObject("LDAP://" & strUser)   
	For Each strGroup in objUser.memberOf 
		Set objGroup = GetObject("LDAP://" & strGroup)   
		If InStr(objGroup.CN, AD_PACKAGE_GROUP) <> 0 Then 
			ValidateADGroup = True 
			Set objGroup = nothing 
			Exit Function
		Else 
			ValidateADGroup = False 
			Set objGroup = nothing 
		End If
	Next 
End Function

Function NetUsePrinters(AD_GRP_1,AD_GRP_2,PRINTER_PATH,PRINTER_DRV)
	if ValidateADGroup(AD_GRP_1) Then
		PrinterPath = PRINTER_PATH
		PrinterDriver = PRINTER_DRV		
		Network.AddWindowsPrinterConnection PrinterPath, PrinterDriver		
	ELSE
		' nichts		  
	End If
	if ValidateADGroup(AD_GRP_2) Then	
		Network.SetDefaultPrinter PrinterPath
	ELSE
		' nichts		  
	End If
End Function

Function RemoveNetPrinter
	wscript.echo "RemoveNetPrinter"  
	Dim strComputer, objWMIService, colInstalledPrinters, objPrinter
	strComputer = "localhost"  
	Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
	Set colInstalledPrinters =  objWMIService.ExecQuery _
    ("Select * from Win32_Printer")  
	
	For Each objPrinter In colInstalledPrinters
		' Sucht drucker die mit "\\" anfangen  
		If InStr(1, objPrinter.Name, "\\", 1) Then			  
			Network.RemovePrinterConnection + objPrinter.Name
		End If		
	Next
End Function
DerWoWusste
DerWoWusste 19.04.2011 um 13:08:08 Uhr
Goto Top
Und wie machst Du das bei schwachen Benutzern? Haben alle Adminrechte UND die UAC ist aus? Nur dann läuft Dein Skript (in Standardeinstellungen).
micneu
micneu 26.04.2011 um 15:26:46 Uhr
Goto Top
getestet hatte ich es unter windows xp sp3 und die benutzer hatten nur benutzerechte.
mit windows vista und windows 7 hatte ich es nicht getestet.

die user waren entsprechend in den gruppern der drucker drinn.

habe kein zugriff mehr auf die domain in der ich das erstellt habe, kann es deshalb nicht mehr testen.
hast du eine gpo erstell in dem du das script beim anmelden ausführst?

gruß michael
DerWoWusste
DerWoWusste 26.04.2011 um 15:32:45 Uhr
Goto Top
Es wird unter Win7 nicht laufen.
Ich nutze keine Skripte sondern die GPO-interne Druckerzuweisung, die DCs ab 2003 R2 verfügbar machen, sobald die Rolle Druckserver installiert ist.