Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Server aus AD auslesen und verarbeiten VBS

Frage Entwicklung VB for Applications

Mitglied: NICSteve

NICSteve (Level 1) - Jetzt verbinden

16.03.2009, aktualisiert 15:02 Uhr, 6857 Aufrufe, 17 Kommentare

Guten Tag an Alle,

ich hab ein Problem mit einem Script und komme nicht weiter:
Folgendes soll gemacht werden:
Aus einem AD sollen alle Server ausgelesen werden - Diese sollen dann einzeln nach den lokalen Administratoren abgefragt werden und in eine SQL-DB geschrieben werden.


Was funktioniert bisher:
-> AD auslesen
-> Lokale Administratoren auslesen

Was funktioniert nicht:
Wenn ein lokaler Admin gefunden wurde, werden alle lokalen Admins(und der Server 1x ) in eine DB geschrieben. Nur geht die Schleife dann nicht zum nächsten PC und fragt dort die lokalen Admins ab sondern läuft weiter mit den lokalen Admins von dem einen PC ab. Sprich ich hab irgendwie ne Schleife drin=> ich will von dem PC jeden lokalen Admin nur 1x haben und dann gehts zum nächsten PC der abgefragt wird.

Ich hoffe ihr könnt mir helfen? Wo hab ich meinen Fehler?


Mein bisheriges Script:

01.
Option Explicit 
02.
       'specified Database - make connection to db and select 
03.
       Const adOpenStatic = 3 
04.
       Const adLockOptimistic = 3 
05.
 
06.
       Set objConnection = CreateObject("ADODB.Connection") 
07.
       Set objRecordSet = CreateObject("ADODB.Recordset") 
08.
 
09.
      'Oeffnen der Datenbank - Verbindung 
10.
       objConnection.Open _ 
11.
            "Provider=SQLOLEDB;Data Source=SQL-Server; Initial Catalog=DB; User ID=DB_User; Password=PW" 
12.
		 
13.
Dim Computerliste, Computer, Benutzer, objConnection, objConnectionAD, objRecordset, objRecordset1, objCommand1, ID_Host, ID, Computername, Hostname, objRecordSet2, ID_Server, Hostzahl, objCommand, PCName, PC, Name 
14.
'Abgefrage Computer 
15.
Const ADS_SCOPE_SUBTREE = 2 
16.
 
17.
Hostzahl = 0 
18.
 
19.
Set objConnectionAD = CreateObject("ADODB.Connection") 
20.
Set objCommand =   CreateObject("ADODB.Command") 
21.
objConnectionAD.Provider = "ADsDSOObject" 
22.
objConnectionAD.Open "Active Directory Provider" 
23.
Set objCOmmand.ActiveConnection = objConnectionAD 
24.
objCommand.CommandText = _ 
25.
    "Select Name, Location from 'LDAP://DC=Domäne,DC=Domäne' " _ 
26.
        & "Where objectClass='computer'"   
27.
objCommand.Properties("Page Size") = 1000 
28.
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE  
29.
Set objRecordSet = objCommand.Execute 
30.
objRecordSet.MoveFirst 
31.
 
32.
Do Until objRecordSet.EOF 
33.
	Computer = objRecordset.Fields("Name").Value 
34.
	Wscript.Echo "Computer Name: " & Computer 
35.
    Wscript.Echo "Location: " & objRecordSet.Fields("Location").Value 
36.
 
37.
On Error Resume Next 
38.
 
39.
Wscript.Echo ("In Schleife: ") 
40.
	Wscript.Echo 
41.
	Wscript.Echo ("Computer: ") & Computer 
42.
	For Each Benutzer In GetObject("WinNT://" & Computer & "/Administratoren").Members 
43.
     
44.
	    	    Wscript.Echo ("lokale Adminstratoren: ") & Benutzer.name 
45.
		 
46.
		If Err.Number <> 0 Then 
47.
		     Wscript.Echo("Lokale Admingruppe nicht vorhanden") 
48.
		    Wscript.Echo("Error Anzahl:") &Err.Number 
49.
					 
50.
		else 
51.
 
52.
		    'Überprüfung ob Hostname = Computer dann Hostzahl = 1 
53.
		    objRecordSet.Open "SELECT Count(Hostname) as Hostzahl FROM tbl_Hosts WHERE Hostname = ('" & Computer & "')" , objConnection, dOpenStatic,          adLockOptimistic 
54.
		     Hostzahl = objRecordset.Fields.Item("Hostzahl") 
55.
		    objRecordSet.close 
56.
					 
57.
				 
58.
		   Wscript.Echo("Hostzahl: ") & Hostzahl 
59.
									 
60.
					 
61.
 
62.
		   'Wenn Hostzahl 1 ist der Hostname schon in der tbl_Hosts vorhanden 
63.
		        if Hostzahl = 1 THEN	 
64.
					 
65.
		   Wscript.Echo("Computer: ") & Computer 
66.
		   Wscript.Echo("Computername: ") & Computername 
67.
		   Wscript.Echo("Error Anzahl:") &Err.Number 
68.
		    'Suchen der HostID und in Variable schreiben 
69.
		    objRecordset.Open "SELECT ID from tbl_Hosts WHERE Hostname = ('" & Computer & "')" , objConnection, adOpenStatic, adLockOptimistic 
70.
		    ID_Server = objRecordset.Fields.Item("ID") 
71.
	                        objRecordSet.close 
72.
	   	  'Ausfueren des INSERTs auf die Tabelle tbl_administratoren						 
73.
                                              objRecordSet.Open "INSERT tbl_Administratoren (Admin, ID_Host) VALUES ('" & Benutzer.Name & "', '" & ID_Server &"')", objConnection, adOpenStatic, adLockOptimistic 
74.
		   WScript.Echo "Eintrag DB: " & Benutzer.Name & "   " & ID_Host 
75.
		    'objRecordset.MoveNext 
76.
					 
77.
		else 
78.
		    'Eintragen des Hostnamens 
79.
		    objRecordSet.Open "INSERT tbl_Hosts (Hostname) VALUES ('" & Computer & "')", objConnection, adOpenStatic, adLockOptimistic 
80.
		    'Auslesen der Host_ID der Tabelle tbl_Hosts 
81.
	                         objRecordSet.Open "SELECT ID FROM tbl_Hosts where Hostname = '" & Computer & "' " , objConnection, adOpenStatic, adLockOptimistic 
82.
		   ' geht an das erste Recordset 
83.
		   objRecordset.MoveFirst 
84.
		   ID_Host = objRecordset.Fields.Item("ID") 
85.
		   Wscript.Echo("ID: ") & ID_Host 
86.
		   Wscript.Echo("Error Anzahl:") &Err.Number 
87.
		    objRecordSet.close 
88.
		    'Ausfueren des INSERTs auf die Tabelle tbl_administratoren 
89.
		  objRecordSet.Open "INSERT tbl_Administratoren (Admin, ID_Host) VALUES ('" & Benutzer.Name & "', '" & ID_Host &"')", objConnection, adOpenStatic, adLockOptimistic 
90.
		   WScript.Echo "Eintrag DB: " & Benutzer.Name & "   " & ID_Host 
91.
		    objConnectionAD.close 
92.
		    'objConnection.close 
93.
		    'Hostzahl = 0 
94.
		end if 
95.
	   end if			 
96.
					 
97.
	Next 
98.
	WScript.Echo	 
99.
					 
100.
objRecordSet.MoveNext 
101.
Loop 
102.
 
103.
objConnection.close
Ergänzung: Im Falle des wir z.B. einen englischen Server haben, und des die Gruppe Administratoren nicht gibt, wird der nächste Server abgefragt. Das Script funktioniert also so lange die Gruppe Administratoren nicht vorhanden ist. Dann wechselt er von Server zu Server. Aber wenn die Gruppe gefunden wird, läuft er in eine Schleife beim eintragen der lokalen Admins in die DB.
Gruß Steve
Mitglied: problemsolver
16.03.2009 um 14:24 Uhr
Hallo,

1. dein Quellcode ist sehr unübersichtlich. Bitte benutze den code-Tag. Rücke deinen Quellcode ein.
2. Bitte benenne die Recordsets bei Dir eindeutig - das hilft Dir schon mal sehr weiter. Die Zeile fast am Schluss deine Codes "objRecordSet.MoveNext" wird wohl deine gewünschte Reaktion niemals zeigen...



Nimm es uns (wenn ich einfach mal hier für uns alle sprechen darf) nicht übel, aber bitte editier deinen Beitrag oben und beherzige diese wenigen Tipps, da es sonst schwierig ist, die Funktionsweise nachzuvollziehen.
Ich schau es mir dann auch noch einmal danach an - versprochen!

Gruß

Markus
Bitte warten ..
Mitglied: NICSteve
16.03.2009 um 14:43 Uhr
Hi Markus,

ich habs mal geändert, hast recht, ist mit <code> schon übersichtlicher. War mir der Funktion nicht so ganz bewusst. Ich hoffe nun schauts besser aus.

Recordsets hab ich ja nur 2.

Gruß Steve

PS: ohne das objRecordset.MoveNext am Ende geht er erst garnicht zum 2. PC sondern ist dann in der Schleife mit dem ersten PC-Namen
Und noch eine zusätzliche Frage:
Gibt es eine Variable für die Gruppe "lokale Administratoren"? Weil ich hab Geräte die in verschiedenen Sprachen installiert sind. Für UK wär es ja "Administrators" auf deutsch "Administratoren" usw. gibt es dafür eine Variable?
Bitte warten ..
Mitglied: Logan000
16.03.2009 um 16:28 Uhr
Moin Moin

Recordsets hab ich ja nur 2.
Deklariert hast du 3, benutz aber nur 1.

Abm besten verwendest Du für DB und AD Zugriff unterschiedliche Objekte.
z.B.:
01.
Dim objConnectionDB, objRecordsetDB, objCommandDB 
02.
Dim objConnectionAD, objRecordsetAD,  objCommandAD 
03.
....
PS: ohne das objRecordset.MoveNext am Ende geht er erst garnicht zum 2. PC sondern ist dann in der Schleife mit dem ersten PC-Namen
Was ja auch dein Problem ist wenn ich deinen Post richtig verstanden habe.
So wie Du das objrecordset einsetzt kann ich nicht mit sicherheit sagen was es beim movenext überhaupt enhält.

Gibt es eine Variable für die Gruppe "lokale Administratoren"? Weil ich hab Geräte die in verschiedenen Sprachen installiert sind. Für UK wär es ja "Administrators" auf deutsch "Administratoren" usw. gibt es dafür eine Variable?
Nicht das ich wüste.

Gruß L.
Bitte warten ..
Mitglied: NICSteve
16.03.2009 um 16:56 Uhr
Hi,

dann muss ich mein Script wohl ein bisschen "ausdünnen". Das Problem ist, das ich einiges versucht hab und viele Variablen deklariert habe.

Vielleicht hab ich das Problem nicht 100%ig richtig rübergebracht.
Ich lese aus dem AD z.B. 10 Server aus
1) Ich nehm Servername Nr1. und fang an zu überprüfen ob die Gruppe "administratoren" vorhanden ist. Ist es dann ein englischer Server, findet er die Gruppe nicht(hat ne err.Number und nutzt dann das objRecordSet.MoveNext. Dann geht er zum Servername Nr2 und prüft. DAS funktioniert auch(quasi der "Fehlerfall" wenn keine Gruppe Administratoren vorhanden ist.

Problemfall aber:
2) Ich nehm Servername Nr1. und fang an zu überprüfen ob die Gruppe "administratoren" vorhanden ist. Ist es dann ein deutscher Server, ist die Gruppe vorhanden: Dann soll überprüft werden ob der Server schon in der Datenbank steht. Ist er noch nicht in der Datenbank enthalten dann schreibe ich den Servernamen in eine Tabelle. Dort bekommt der Servereintrag automatisch noch eine ID. Dann schreibt er in eine zweite Tabelle die passende ID vom Server(Ich will jeden Server ja nur 1x in der DB haben) + die ausgelesenen Administratoren.
Die werden dann auch artig abgearbeitet. Nur er arbeitet mir dann immer die administratoren ab und geht nicht zum nächsten PC. Daher ja die Schleife, die mir dann 100er Einträge von den administratoren in die DB schreib. => HAb ich 3 lokale administratoren, werden diese immer wieder abgearbeitet. Ich hätte aber gerne, das er die 3 lokalen administratoren 1x in die DB schreib und dann den nächsten Server abfragt und wieder von vorne anfängt. So hab ich dann die Zuordnung in der Datenbank Server zu den lokalen Administratoren.

Problem wie gesagt, er geht mit aus der Schleife mit den administratoren nicht raus, wenn er die mal abgearbeitet hat, sondern fängt immer wieder mit den lokalen administratoren an und geht nicht zum nächsten PC-Name

Ich hoffe das ist etwas verständlicher.
Gruß Steve
Bitte warten ..
Mitglied: problemsolver
16.03.2009 um 17:06 Uhr
Hallo,

ich habe mal den Anfang von Dir kopiert und die SQL Server Verbindung auskommentiert... Dies packst Du am besten in die unten stehende Funktion... Der Vorteil:
Du behältst den Überblick, wenn Du in Funktionen bzw. Subs unterteilst... naja... und die Variablen kommen sich auch nicht in die Quere... normalerweise ...

Vielleicht bringt Dir das ja weiter... ich hatte nur keine Lust, den gesamten Quelltext neu zu designen... es sollte aber nach diesem Ansatz auf jeden Fall funktionieren:
01.
Option Explicit 
02.
       'specified Database - make connection to db and select 
03.
       Const adOpenStatic = 3 
04.
       Const adLockOptimistic = 3 
05.
 
06.
       Set objConnection = CreateObject("ADODB.Connection") 
07.
       Set objRecordSet = CreateObject("ADODB.Recordset") 
08.
 
09.
      'Oeffnen der Datenbank - Verbindung 
10.
       'objConnection.Open "Provider=SQLOLEDB;Data Source=SQL-Server; Initial Catalog=DB; User ID=DB_User; Password=PW" 
11.
		 
12.
Dim Computerliste, Computer, Benutzer, objConnection, objConnectionAD, objRecordset, objRecordset1, objCommand1, ID_Host, ID, Computername, Hostname, objRecordSet2, ID_Server, Hostzahl, objCommand, PCName, PC, Name 
13.
'Abgefrage Computer 
14.
Const ADS_SCOPE_SUBTREE = 2 
15.
 
16.
Hostzahl = 0 
17.
 
18.
Set objConnectionAD = CreateObject("ADODB.Connection") 
19.
Set objCommand =   CreateObject("ADODB.Command") 
20.
objConnectionAD.Provider = "ADsDSOObject" 
21.
objConnectionAD.Open "Active Directory Provider" 
22.
Set objCOmmand.ActiveConnection = objConnectionAD 
23.
objCommand.CommandText = "Select Name, Location from 'LDAP://DC=DOMAENE,DC=local' Where objectClass='computer'"   
24.
objCommand.Properties("Page Size") = 1000 
25.
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE  
26.
Set objRecordSet = objCommand.Execute 
27.
objRecordSet.MoveFirst 
28.
 
29.
Do Until objRecordSet.EOF 
30.
	Computer = objRecordset.Fields("Name").Value 
31.
	hole_admins(Computer) 
32.
	objRecordSet.MoveNext 
33.
loop 
34.
 
35.
function hole_admins(computername) 
36.
wscript.echo computername 
37.
	For Each Benutzer In GetObject("WinNT://" & Computer & "/Administratoren").Members 
38.
		if Benutzer.name <> "" then 
39.
			schreibe_datensatz_in_deine_db(computername,Benutzer.Name) 
40.
		end if 
41.
	Next 
42.
end function 
43.
 
44.
function schreibe_datensatz_in_deine_db(computername, adminaccount) 
45.
'Baue DB Verbindung auf 
46.
'Frage deine Tabellen ab...oder bastel hier deine Recordsets und inserts und alles andere rein ;-)  
47.
'Prüfe Einträge vorhanden...ggf. schreiben oder auch nicht... 
48.
'Blablubb und so weiter...  
49.
'Schließe den Recordset 
50.
'Baue die DB Verbindung wieder ab 
51.
end function
Gruß

Markus
Bitte warten ..
Mitglied: NICSteve
16.03.2009 um 17:42 Uhr
Hi,
interessanter Ansatz. Das werde ich morgen früh mal testen und Rückmeldung geben

Schonmal Danke und Grüßle,
Steve
Bitte warten ..
Mitglied: NICSteve
17.03.2009 um 11:00 Uhr
Hi,

mit deinem Ansatz funktionierts THX
Und das Problem mit den verschiedenen Sprachen werd ich mit ner Schleife löse, das ich verschiedene "Administrators", "Administratoren" etc abfrage oder auch mit ner select case.

Gruß Steve
Bitte warten ..
Mitglied: NICSteve
19.03.2009 um 11:39 Uhr
Hallo zusammen,

ich habe noch eine Zusatzfrage, die mir hoffentlich beantwortet werden kann!
Problem ist ja, das verschiedensprachige Windows, verschiedene Namen für die Gruppe Administratoren haben! Das ganze kann ja auch über die SID gemacht werden

Nun hab ich aber noch ein Problem bei der Abfrage. Und zwar wird die SID der Admingruppe nicht abgefragt :/ bin mir nicht auch nicht sicher, ob der die SID in den richtigen Gruppennamen umwandelt.

Meine function tut leider nicht :/

01.
 function hole_admins(computername)  
02.
Wscript.Echo "Computer Name: " & Computer  
03.
' Setzen des WMI-Dienstes für den Computer 
04.
SET objWMIDienst = GetObject("winmgmts:{impersonationlevel=impersonate}!\\" & Computer & "\root\cimv2") 
05.
' Abfrage fuer WMI zusammensetzen 
06.
 strWMIAbfrage = "Select * from Win32_Group Where LocalAccount = True" 
07.
' Verbindung WMI und Ausfuehrung Abfrage 
08.
 Set colGruppen = objWMIDienst.ExecQuery(strWMIAbfrage) 
09.
' Setzen assoziierte Sammlung 
10.
SET colAssoziationen = objWMIDienst.ExecQuery("Associators of {Win32_Group.Domain='" & objGruppe.Domain & "',Name='" & objGruppe.Name & "'} " & " Where AssocClass=Win32_GroupUser") 
11.
				   
12.
IF objGruppe.SID = "S-1-5-32-544" THEN 
13.
          WScript.Echo ("Lokale Gruppe ")  & objGruppe.Name  
14.
               For Each Benutzer In GetObject("WinNT://" & Computer & "/ & objGruppe.Name &,group")                                 
15.
                    if Benutzer.name <> "" then  
16.
                        schreibe_datensatz_in_deine_db'(computername,Benutzer.Name)                   
17.
                    end if  
18.
end if   
19.
 
20.
 
Kann mir jemand helfen?
Gruß
Bitte warten ..
Mitglied: problemsolver
19.03.2009 um 12:42 Uhr
Hallo,

vergleiche mal Deinen Quellcode mit meinem und Du wirst verstehen, warum meiner funktioniert... Bei Dir sind etliche Fehler enthalten.

Mein Tipp: Prüfe bestimmte Inhalte mit z.B. Wscript.Echo bevor Du Neuen Code einfügst... gliedere mehrfach vorkommende Bereich als Sub oder Function aus... (Auch For Each ist immer seeehr nützlich )
Falls Du Access zur Verfügung hast, programmiere dort und übertrage dann den Code in dein VBS-Script... das dürfte dir viel Zeit ersparen in Zukunft:

Aber trotzdem... dein gedanklicher Ansatz mit der SID ist schon einmal sehr lobenswert. WEITER SO!

01.
Function hole_admins(computer) 
02.
ergebnis = "Lokale Administratoren auf Computer : " & computer 
03.
' Setzen des WMI-Dienstes für den Computer 
04.
Set objWMIDienst = GetObject("winmgmts:{impersonationlevel=impersonate}!\\" & computer & "\root\cimv2") 
05.
' Abfrage fuer WMI zusammensetzen 
06.
strWMIAbfrage = "Select * from Win32_Group Where LocalAccount = True" 
07.
' Verbindung WMI und Ausfuehrung Abfrage 
08.
Set colGruppen = objWMIDienst.ExecQuery(strWMIAbfrage) 
09.
' Setzen assoziierte Sammlung 
10.
For Each objGruppe In colGruppen 
11.
    If objGruppe.SID = "S-1-5-32-544" Then 
12.
            'wscript.Echo ("Lokale Gruppe ") & objGruppe.Name 
13.
                For Each Benutzer In GetObject("WinNT://" & computer & "/" & objGruppe.Name).Members 
14.
                    If Benutzer.Name <> "" Then 
15.
                        ergebnis = ergebnis & chr(13) & Benutzer.Name 
16.
                        'schreibe_datensatz_in_deine_db'(computername,Benutzer.Name) 
17.
                    End If 
18.
                Next 
19.
    End If 
20.
Next 
21.
hole_admins = ergebnis 
22.
End Function 
23.
 
24.
wscript.echo hole_admins ("DEINRECHNER")
Gruß und immer weiter so!

Gruß

Markus
Bitte warten ..
Mitglied: NICSteve
19.03.2009 um 14:23 Uhr
Hi Markus,

hast mir mal wieder geholfen, DANKE

Bin eher aus dem administrativen Bereich und mir fehlen da einfach die Kentnisse, siehe oben ;). Gibts da nen gutes Buch oder ähnliches? oder eher mit der Hilfedatei arbeiten?

Access hab ich zur Verfügung, was bringt das?

Gruß Steve
Bitte warten ..
Mitglied: problemsolver
19.03.2009 um 19:48 Uhr
Hallo Steve,

administrativer Bereich ist ein weites Thema genauso wie es Bücher auf dem Markt gibt
vbs bedeutet nichts anderes wie Visual Basic Script... dementsprechend ist es selbstredend, dass VBA (Visual Basic for Applications) dem sehr nahe liegt und man fast alles 1 zu 1 übernehmen kann.
Und in Access kannst Du wunderbar, anstatt
"wscript.echo variablenname"
zum Beispiel ein
"docmd.runsql("INSERT INTO DeineTabelle VALUES ('" & variablenname & "');")
machen...
Ich denke, dass DIr das jetzt schon mal etwas sagt.

Zum Thema Bücher... sofern Du Dich ein wenig mit Programmierung auskennst... ein objektorientiertes Denken mitbringst... und ordentlich Basteltrieb mitbringst, sollte Dir die Hilfe ausreichen. Die MSDN von Microsoft hilft Dir auch weiter... Dazu gibt es zahlreiche Foren und andere Seiten. (z.B. www.vbarchiv.de) und ähnliche. Empfehlen kann ich auch noch "Hey! Scripting Guy" auf den Seiten von Microsoft und wenn Du , so wie es aussieht WMI Abfragen benötigst... mmh.. dann nehme den Scriptomatic mal unter die Lupe...
http://www.microsoft.com/technet/scriptcenter/createit.mspx Natürlich ohne Vollständigkeit... waren nur so spontane Sachen, die mir eingefallen sind.

Meistens sind viele deiner Probleme schon irgendwann einmal programmiert worden.

Wenn Du unbedingt gute Bücher lesen möchtest, kann ich o'Reilly immer empfehlen bzw. kann man sich auch auf die Meinung von amzaon Kunden verlassen.

Allerdings stehen wir hier natürlich immer gerne mit Rat und Tat zur Seite - denn jeder hat mal "klein" angefangen...

Das wichtigste jedoch ist - versuch nicht einfach Quelltext zu kopieren, sondern ihn zu verstehen... Der nächste Schritt ist dann logischerweise, dass Du es auch schreiben kannst

Gruß und noch viel Erfolg!

Markus
Bitte warten ..
Mitglied: NICSteve
24.03.2009 um 14:27 Uhr
Hi Markus,

dann bräuchte ich nochmal einen Rat

Ziel des Programmes ist es, lokale Admins aus den Geräten einer Domäne auszuelsen und in eine DB zu schreiben. Dann festlegen wer auf welchem Gerät lokaler Admin sein darf und das ganze wieder zurück schreibt(aus den Werten der DB).

Bisher lese ich ja die ganzen Mitglieder der Gruppe "lokale Administratoren" aus, doch da fehlt der Domainstring für die Domainuser. Das wird nämlich ein Problem wenn die die Admins aus der Tabelle wieder in die lokalen Admins schreibe. Kann ich daher bei den User den Domainstring(wenn vorhanden, also Domainuser/Gruppe) mit auslesen?

Muss das ganze ggf. dann über WMI gemacht werden?
Würd mich auf eine Antwort freuen.

Gruß Steve
Bitte warten ..
Mitglied: problemsolver
24.03.2009 um 17:28 Uhr
Hallo,

probiere das mal aus...

01.
Function getFullName(username) 
02.
   arrayU = Split(username,"/") 
03.
   arraylen = UBound(arrayU) 
04.
   getFullName = arrayU(arraylen - 1) & "/" & arrayU(arraylen) 
05.
End Function 'getFullName  
06.
 
07.
Function hole_admins(computer) 
08.
ergebnis = "Lokale Administratoren auf Computer : " & computer & chr(13) 
09.
' Setzen des WMI-Dienstes für den Computer 
10.
Set objWMIDienst = GetObject("winmgmts:{impersonationlevel=impersonate}!\\" & computer & "\root\cimv2") 
11.
' Abfrage fuer WMI zusammensetzen 
12.
strWMIAbfrage = "Select * from Win32_Group Where LocalAccount = True AND SID='S-1-5-32-544'" 
13.
' Verbindung WMI und Ausfuehrung Abfrage 
14.
Set colGruppen = objWMIDienst.ExecQuery(strWMIAbfrage) 
15.
' Setzen assoziierte Sammlung 
16.
For Each objGruppe In colGruppen 
17.
    set oGroup = GetObject("WinNT://" & computer & "/" & objGruppe.Name & ",group") 
18.
		For Each oMember In oGroup.Members 
19.
			'wscript.echo oMember.adspath 
20.
			ergebnis = ergebnis  & oMember.Name & vbtab & getFullName(oMember.adspath) & chr(13)  
21.
		Next 
22.
Next 
23.
hole_admins = ergebnis 
24.
End Function 
25.
 
26.
wscript.echo hole_admins (".")
Spätestens beim zurückschreiben auf den Rechner wirst Du Probleme bekommen... aber probiere ruhig erstmal weiter aus...

Gruß

Markus
Bitte warten ..
Mitglied: NICSteve
25.03.2009 um 08:21 Uhr
Hi Markus,

danke für deine Hilfe, werd ich gleich mal testen!

Warum denkst du, das es probleme beim zurückschreiben gibt? Ich hab's nur mal lokal getestet und das hat zumindest funktioniert mit nem kleinen Script. So lange der User der das Script ausfrührt, Domain Admin ist und die Gruppe Domain Admins immer in den lokalen Admins ist, würde mir da kein Problem auffallen. Wo liegen deine Bedenken?

Gruß Steve
Bitte warten ..
Mitglied: problemsolver
25.03.2009 um 08:30 Uhr
Hallo,

dann ist ja gut, dass es ohne Probleme funktioniert.
Ich würde mich darüber freuen, wenn Du dein fertiges Script am Schluss hier mit reinstellst.

Ggf wäre es auch interessant für andere

Gruß

Markus
Bitte warten ..
Mitglied: NICSteve
26.03.2009 um 09:01 Uhr
Guten Morgen,

nun hab ich das ganze leicht abgeändert aber dein Ansatz hat funktioniert
Wenn das Script fertig ist, kann ich das hier gerne bereitstellen.

Nun zum schreiben der neuen lokalen Administratoren.
Ich bin mir noch nicht ganz sicher, aber ich denk folgender Ablauf wäre gut:

Server wieder aus dem AD auslesen
-> DB öffnen und nach dem Server suchen
-> Wenn vorhanden, lösche alle Einträge aus den lokalen Administratore nur die Domain Admins nicht
-> Schreibe die Admins aus der DB in die lokalen Admins

Gruß Steve
Bitte warten ..
Mitglied: NICSteve
01.04.2009 um 17:08 Uhr
Hallo an Alle,

folgendes Problem ist noch offen. Ich lese nun aus dem AD wieder alle Server aus, prüfe ob diese in der DB stehen und fang dann an zu bearbeiten. Alle Admins in der DB die zum Server passen, also lokale Admins schreiben. Das Problem besteht darin, das er den ersten User ausliest, diesen verarbeitet und dann aber nicht zum zweiten Benutzer wechselt sondern gleich zum nächsten PC :/ Er soll mir aber erst alle Admins schreiben und dann zum nächsten PC wechseln.

Ich hoffe ihr könnt mir helfen
Gruß Steve


01.
Function Eintrag 
02.
On Error Resume Next 
03.
WScript.Echo "In Function Eintrag..." 
04.
 
05.
 
06.
objRecordSet.Open "Select ID FROM tbl_Hosts where Hostname = ('" & Computer & "')" , objConnection, adOpenStatic, adLockOptimistic 
07.
                ID_Host = objRecordset.Fields.Item("ID") 
08.
                wscript.Echo "Host ID: " & ID_Host 
09.
 
10.
objRecordSet.close         
11.
 
12.
objRecordSet.Open "Select * FROM tbl_Administratoren where ID_Host = ('"& ID_Host &"')", objConnection, adOpenStatic, adLockOptimistic 
13.
                  
14.
				Admins = Array(objRecordset.Fields.Item("Admin")) 
15.
                 
16.
				objRecordset.MoveNext 
17.
                wscript.Echo "Admins: " & Admins 
18.
                Wscript.Echo "Combjuder: " & computer 
19.
objRecordSet.close 
20.
                                                                
21.
Set objWMIDienst = GetObject("winmgmts:{impersonationlevel=impersonate}!\\" & computer & "\root\cimv2")  
22.
WScript.Echo "in WMI:" & strWMIAbfrage 
23.
' Abfrage fuer WMI zusammensetzen  
24.
strWMIAbfrage = "Select * from Win32_Group Where LocalAccount = True AND SID='S-1-5-32-544'"  
25.
' Verbindung WMI und Ausfuehrung Abfrage 
26.
WScript.Echo "nach WMI:" & strWMIAbfrage 
27.
Set colGruppen = objWMIDienst.ExecQuery(strWMIAbfrage)  
28.
Pos1 = 0 
29.
'Prüfen ob lokaler oder Domainuser 
30.
Pos1=Instr(Admins, Computer) 
31.
Wscript.Echo "Abgleich: " &Pos1 
32.
'Benutzername ohne Domainstring basteln 
33.
MeineZf = Admins 
34.
MeinDatenfeld = Split(MeineZf, "\", -1, 1) 
35.
' MeinDatenfeld(0) enthält "VBScript". 
36.
Admins = MeinDatenfeld(1) '& " " & MeinDatenfeld(1) 
37.
'Meldung = Meldung & " " & MeinDatenfeld(2) 
38.
 
39.
 
40.
 
41.
 
42.
	If Pos1 = 0 THEN 
43.
	'Domainuser 
44.
		For Each objGruppe In colGruppen  
45.
		set oGroup = GetObject("WinNT://" & computer & "/" & objGruppe.Name & ",group")                                
46.
								   ' Setzen assoziierte Sammlung  
47.
												   Wscript.Echo "Computer: " & Computer 
48.
								   Set objGroup = GetObject("WinNT://" & Computer & "/" & objGruppe.Name & ",group") 
49.
												   Wscript.Echo "Admins: " & Admins 
50.
								   Set objUser = GetObject("WinNT://*Domain*/" & Admins ) 
51.
								   objGroup.ADD(objUser.ADsPath) 
52.
								   Wscript.Echo "DomainUser hinzugefügt: " 
53.
		next  
54.
	else 
55.
	'lokaler Benutzer 
56.
			For Each objGruppe In colGruppen  
57.
			set oGroup = GetObject("WinNT://" & computer & "/" & objGruppe.Name & ",group")                                
58.
								   ' Setzen assoziierte Sammlung  
59.
												   Wscript.Echo "Computer: " & Computer 
60.
								   Set objGroup = GetObject("WinNT://" & Computer & "/" & objGruppe.Name & ",group") 
61.
												   Wscript.Echo "Admins: " & Admins 
62.
								   Set objUser = GetObject("WinNT://" & Computer & "/" & Admins ) 
63.
								   objGroup.ADD(objUser.ADsPath) 
64.
								   Wscript.Ech "Lokaler User hinzugefügt:" 
65.
								    
66.
			next 
67.
			 
68.
	end if 
69.
 
70.
end function
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Server-Hardware
NAS-Server Platten auslesen (4)

Frage von Roeder zum Thema Server-Hardware ...

Windows Server
Windows Server 2012 R2 Benutzerkonto für Zugriff auf AD Benutzer (2)

Frage von JulianOhm zum Thema Windows Server ...

VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Batch & Shell
Eventlog Druckjobs mit VBS auslesen (2)

Frage von joni2000de zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...