Automatisieren von TCP/IP-Netzwerken auf Clients

Teil 5: Skripterstellung für DNS auf Clients

Veröffentlicht: 07. Dez 2004

DNS (Domain Name System) ist der primäre Mechanismus für die Namensauflösung bei den meisten TCP/IP-Netzwerken sowie das standardmäßige Namensauflösungsprotokoll für Windows 2000, Windows XP und Windows Server 2003. Bei der Zusammenarbeit mit DHCP-Servern können DNS-Server, die die dynamische DNS-Aktualisierung verwenden, nun viele Aspekte der Namensauflösung automatisieren, die zuvor durch manuell konfigurierte HOSTS-Dateien ausgeführt wurden. DNS kann auch in Active Directory integriert werden, um die Namensauflösung mit der Verzeichnisverwaltung zu verbinden.

Wenn Clients DHCP verwenden, können sie die DNS-Konfiguration vom DHCP-Server abrufen. Abbildung 10 zeigt das Dialogfeld Eigenschaften von Internetprotokoll (TCP/IP) (Zugriff darauf über Netzwerkverbindungen). Darin können Sie diese Einstellung angeben, indem Sie auf das Optionsfeld DNS-Serveradresse automatisch beziehen klicken. In diesem Fall hilft Ihnen DHCP beim Automatisieren von DNS-Einstellungen auf Clients und verwendet dazu keine Skripts.

05ATNC01.gif

Abbildung 10 Automatisieren der DNS-Einstellungen auf Clients über die Windows-Benutzeroberfläche
Bild maximieren

Das Befehlszeilentool Ipconfig.exe kann DNS-Clienteinstellungen ebenfalls abrufen und Aufgaben wie das Leeren des DNS-Clientauflösungscaches ausführen.

Es kann jedoch vorkommen, dass Sie DNS-Clients remote oder in Gruppen konfigurieren müssen – beispielsweise, wenn Sie alte DNS-Server durch neue ersetzen, Änderungen an Servern vornehmen oder Subnetzanordnungen ändern. Wenn dann jeder einzelne Host manuell konfiguriert wird, beansprucht dieser Vorgang unnötig viel Verwaltungszeit. In derartigen Fällen stellt WMI wie bei anderen TCP/IP-Protokollen Methoden und Eigenschaften der Klasse Win32_NetworkAdapterConfiguration bereit, mit denen sich die DNS-Clientkonfiguration automatisieren lässt.

Beachten Sie, dass die Klasse Win32_NetworkAdapterConfiguration keine Eigenschaft oder Methode bereitstellt, die der Einstellung DNS-Serveradresse automatisch beziehen explizit entspricht. Die DNSServerSearchOrder-Eigenschaft zeigt die IP-Adressen aller auf dem Client konfigurierten DNS-Server an – unabhängig davon, ob diese lokal festgelegt oder vom DHCP-Server abgerufen wurden.

Optional können Sie einen Wert entsprechend der Einstellung DNS-Serveradresse automatisch beziehen abrufen oder festlegen. Zu diesem Zweck verwenden Sie die beiden Registrierungseinträge DhcpNameServer und NameServer, die unter der folgenden Adresse zu finden sind:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
\ {AdapterIdentifier}

Wenn NameServer den Wert 0 hat, versucht der Client, eine DNS-Serveradresse vom DHCP-Server automatisch abzurufen. Wenn NameServer eine IP-Adresse als Wert enthält, setzt diese Adresse jede vom DHCP-Server erhaltene DNS-Serveradresse außer Kraft. In diesem Fall wird ein im Registrierungseintrag DhcpNameServer angegebener Wert im Dialogfeld nicht angezeigt.

WMI umfasst auch einen DNS-Serveranbieter (zuerst im Windows 2000 Resource Kit enthalten, jetzt Teil des Betriebssystems Windows Server 2003), der Ihnen das Automatisieren von Servervorgängen mit Skripts ermöglicht. Informationen zur Skripterstellung für den DNS-Serveranbieter würden den Rahmen dieses Dokumentes jedoch überschreiten.

Das Befehlszeilentool Dnscmd.exe stellt umfangreiche Optionen für die DNS-Serverkonfiguration bereit.

In diesem Abschnitt werden die Schritte zur Skripterstellung und Beispielskripts für diese Aufgaben bereitgestellt:

Anzeigen von DNS-Clientinformationen

Aktivieren von DNS

Ändern der Suchreihenfolge für DNS-Server, der DNS-Domäne, der Suchreihenfolge für DNS-Domänensuffixe und der DNS-Registrierungseinstellungen

Auf dieser Seite
Anzeigen von DNS-ClientinformationenAnzeigen von DNS-Clientinformationen
Aktivieren von DNSAktivieren von DNS
Ändern der Suchreihenfolge für DNS-ServerÄndern der Suchreihenfolge für DNS-Server
Ändern der DNS-DomäneÄndern der DNS-Domäne
Ändern der Suchreihenfolge für DNS-DomänensuffixeÄndern der Suchreihenfolge für DNS-Domänensuffixe
Ändern der Einstellungen für dynamische DNS-RegistrierungÄndern der Einstellungen für dynamische DNS-Registrierung
Szenario: Ändern von DNS-Servern und -DomänenSzenario: Ändern von DNS-Servern und -Domänen
Tools zur Skripterstellung für DNS auf ClientsTools zur Skripterstellung für DNS auf Clients

Anzeigen von DNS-Clientinformationen

Wie bei DHCP besteht der erste Schritt beim Verwalten von DNS auf Clients normalerweise darin, die aktuellen Einstellungen zu ermitteln. Abbildung 11 zeigt die Registerkarte DNS des Dialogfelds Erweiterte TCP/IP-Einstellungen, die eine Möglichkeit zum Zugreifen auf diese Einstellungen über die Windows-Benutzeroberfläche bietet.

05ATNC02.gif

Abbildung 11 Anzeigen der aktuellen DNS-Einstellungen über die Windows-Benutzeroberfläche
Bild maximieren

Bei Skripts, die WMI verwenden, bietet die Klasse Win32_NetworkAdapterConfiguration mehrere Eigenschaften, die Ihnen das Erstellen von Skripts für die DNS-Clientkonfiguration ermöglichen. In Tabelle 13 werden diese DNS-Eigenschaften beschrieben.

Tabelle 13 DNS-Eigenschaften von "Win32_NetworkAdapterConfiguration"

EigenschaftTypBeschreibung

DNSDomain

Zeichenfolge

Der Organisationsname, gefolgt von einem Punkt und einer Erweiterung, die den Typ der Organisation angibt, z. B. microsoft.com. Der Name kann aus einer beliebigen Kombination der Buchstaben A–Z, der Ziffern 0–9 sowie des Bindestrichs (-) bestehen; dazu kommt der Punkt (.) als Trennzeichen.

Beispiel: "microsoft.com"

DNSDomainSuffixSearchOrder

Zeichenfolge

Durch Leerzeichen getrennte Liste der DNS-Domänensuffixe, die während der Namensauflösung an Hostnamen angehängt werden. Wenn ein vollqualifizierter Domänenname (FQDN) von einem Hostnamen aufgelöst wird, wird der lokale Domänenname angehängt. Falls der Domänenname nicht angehängt werden kann, werden anhand der Domänensuffixliste zusätzliche FQDNs in der aufgelisteten Reihenfolge erstellt und die DNS-Server für jeden einzelnen abgefragt.

Beispiel: "samples.microsoft.com example.microsoft.com"

DNSEnabledForWINSResolution

Boolean-Wert

TRUE gibt an, dass DNS für die Namensauflösung über WINS (Windows Internet Name Service) aktiviert ist. Wenn der Name mithilfe von DNS nicht aufgelöst werden kann, wird die Anforderung an WINS weitergeleitet.

DNSHostName

Zeichenfolge

Der Hostname, der zum Identifizieren des lokalen Computers für die Authentifizierung durch einige Dienstprogramme verwendet wird. Andere TCP/IP-basierte Dienstprogramme können diesen Wert verwenden, um den Namen des lokalen Computers zu ermitteln. Die Hostnamen werden auf DNS-Servern in einer Tabelle gespeichert, die Namen IP-Adressen zur Verwendung durch DNS zuordnet. Der Name kann aus einer beliebigen Kombination der Buchstaben A–Z, der Ziffern 0–9 sowie des Bindestrichs (-) bestehen; dazu kommt der Punkt (.) als Trennzeichen. Standardmäßig ist dieser Wert der Microsoft-Netzwerkcomputername; der Netzwerkadministrator kann jedoch einen anderen Hostnamen zuweisen, ohne den Computernamen zu ändern.

Beispiel: "corpdns"

DNSServerSearchOrder

Zeichenfolgenarray

Array von Server-IP-Adressen, die für DNS-Serverabfragen verwendet werden.

DomainDNSRegistrationEnabled

Boolean-Wert

TRUE gibt an, dass die IP-Adressen für diese Verbindung in DNS – zusätzlich zu ihrer Registrierung unter dem vollständigen DNS-Namen des Computers – unter dem Domänennamen der Verbindung registriert sind. Der Domänenname der Verbindung wird mithilfe der SetDNSDomain()-Methode festgelegt oder durch DHCP zugewiesen. Der registrierte Name ist der Hostname des Computers mit dem angehängten Domänennamen. Diese Eigenschaft ist neu bei Windows XP.

FullDNSRegistrationEnabled

Boolean-Wert

TRUE gibt an, dass die IP-Adressen für diese Verbindung in DNS unter dem vollständigen DNS-Namen des Computers registriert sind. Der vollständige DNS-Name des Computers wird auf der Registerkarte Netzwerkidentifikation der Anwendung System in der Systemsteuerung angezeigt. Diese Eigenschaft ist neu bei Windows XP.

Alle Eigenschaften in der vorstehenden Tabelle sind schreibgeschützt.

In Tabelle 14 werden die Win32_NetworkAdapterConfiguration-Methoden zum Erstellen von Skripts für die DNS-Clientkonfiguration beschrieben.

Tabelle 14 DNS-Methoden von "Win32_NetworkAdapterConfiguration"

MethodeParameterBeschreibung

EnableDNS

DNSHostName – Zeichenfolge
DNSDomain – Zeichenfolge
DNSServerSearchOrder – Array von Zeichenfolgen
DNSDomainSuffixSearchOrder – Zeichenfolge

Aktiviert DNS auf dem Client.

SetDNSDomain

DNSDomain – Zeichenfolge

Ermöglicht das Festlegen der DNS-Domäne. Dieser instanzabhängige Methodenaufruf gilt auf Adapterbasis. Unter Windows 2000 gilt die Einstellung für den Zieladapter. Unter Windows NT 4.0 ist diese Einstellung global.

SetDNSServerSearchOrder

DNSServerSearchOrder – Array von Zeichenfolgen

Verwendet ein Array von Zeichenfolgenelementen zum Festlegen der Suchreihenfolge für Server. Wenn Sie alle DNS-Server aus der Suchreihenfolge entfernen möchten, müssen Sie Null statt einer leeren Zeichenfolge verwenden. Dieser instanzabhängige Methodenaufruf gilt auf Adapterbasis. Nachdem statische DNS-Server angegeben wurden, um die Verwendung von DHCP statt statischer DNS-Server einzuleiten, können Sie die Methode aufrufen, ohne Parameter für "in" angeben zu müssen. Unter Windows 2000 gilt die Einstellung für den Zieladapter. Unter Windows NT 4.0 ist die Einstellung global.

SetDNSSuffixSearchOrder

DNSDomainSuffixSearchOrder – Zeichenfolge

Statische Methode. Verwendet ein Array von Zeichenfolgenelementen zum Festlegen der Suchreihenfolge für Suffixe. Nur unter Windows NT: Dieser instanzabhängige Methodenaufruf gilt für alle Adapter.

SetDynamicDNSRegistration

FullDNSRegistrationEnabled – Boolean-Wert
DomainDNSRegistrationEnabled – Boolean-Wert

Gibt den Modus der dynamischen DNS-Registrierung von IP-Adressen für den IP-Adapter an.

Alle Methoden in der vorstehenden Tabelle geben eine positive ganze Zahl zurück:

0 bedeutet: erfolgreicher Abschluss.

1 bedeutet: erfolgreicher Abschluss, Neustart erforderlich.

Zahlen größer als 1 bedeuten, dass ein Problem aufgetreten ist und die Methode nicht abgeschlossen werden konnte. Im WMI-SDK werden die Bedeutungen der Rückgabewerte für diese Methoden aufgeführt.

Das folgende Skript, Dnssettings.vbs, gibt die DNS-Einstellungen aus, die von der Klasse Win32_NetworkAdapterConfiguration bereitgestellt werden. In diesem Fall wird die DNSEnabledForWINSResolution-Eigenschaft, die nur bei Verwendung der NetBIOS-Namensauflösung sinnvoll ist, in das Einstellungsskript einbezogen, das im Abschnitt zu WINS dieses Dokumentes beschrieben wird. Unter Windows Server 2003 können Sie den Hostnamen auch der DNSHostName-Eigenschaft der Klasse Win32_ComputerSystem entnehmen. Unter älteren Betriebssystemen gibt diese Name-Eigenschaft möglicherweise den NetBIOS-Namen zurück, wenn er anders als der DNS-Name lautet; dies hängt von der Client- und Netzwerkkonfiguration ab.

Schritte zur Skripterstellung

Das Skript in Listing 28 zeigt die DNS-Clienteinstellungen für die einzelnen Netzwerkadapterkonfigurationen auf einem Computer an.

1.

Erstellen Sie eine Variable, und weisen Sie ihr den Namen eines Computers zu. Geben Sie für den lokalen Computer einfach "." als Computernamen an. Wenn Sie dieses Skript remote ausführen möchten, geben Sie den Namen eines verfügbaren Remotecomputers im Netzwerk an, für den Sie Administratorrechte besitzen. Der Name kann aus einem Hostnamen oder einer IP-Adresse bestehen.

2.

Verwenden Sie einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest.

3.

Verwenden Sie die ExecQuery-Methode zum Abfragen der Klasse Win32_NetworkAdapterConfiguration, wobei die WQL-Abfrage nach "WHERE IPEnabled = True" gefiltert wird.

Die zurückgegebene Auflistung besteht aus allen Netzwerkadapterkonfigurationen auf dem Computer, für die IP aktiviert ist.

4.

Führen Sie für jede Netzwerkadapterkonfiguration in der Auflistung die folgenden Aufgaben aus.

5.

Weisen Sie die Win32_NetworkAdapterConfiguration-Eigenschaften DNSHostName, Index, Description, DNSDomain, DomainDNSRegistrationEnabled und FullDNSRegistrationEnabled Variablen zu.

6.

Führen Sie eine Iteration durch die von den Eigenschaften DNSDomainSuffixSearchOrder und DNSServerSearchOrder zurückgegebenen Arrays durch, und konvertieren Sie sie in formatierte Zeichenfolgen.

7.

Verketten Sie die Variablen und Bezeichnungen in eine Zeichenfolge. Verketten Sie bei jeder Iteration durch einen anderen Netzwerkadapter die zugehörigen Zeichenfolgen mit der ursprünglichen Zeichenfolge.

8.

Zeigen Sie den Hostnamen und die Einstellungen für jeden Adapter an.

Listing 28 Dnssettings.vbs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
46
47
48
On Error Resume Next

 strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

For Each objNicConfig In colNicConfigs
  strDNSSuffixSO = ""
  strDNSServerSO = ""
  strDNSHostName = objNicConfig.DNSHostName
  strIndex = objNicConfig.Index
  strDescription = objNicConfig.Description
  strDNSDomain = objNicConfig.DNSDomain
  strDNSSuffixSO = ""
  If Not IsNull(objNicConfig.DNSDomainSuffixSearchOrder) Then
    For Each strDNSSuffix In objNicConfig.DNSDomainSuffixSearchOrder
      strDNSSuffixSO = strDNSSuffixSO & VbCrLf & String(37, " ") & _
 strDNSSuffix
    Next
  End If
  strDNSServerSO = ""
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      strDNSServerSO = strDNSServerSO & VbCrLf & String(37, " ") & _
 strDNSServer
    Next
  End If
  strDomainDNSRegistrationEnabled = _
 objNicConfig.DomainDNSRegistrationEnabled
  strFullDNSRegistrationEnabled = objNicConfig.FullDNSRegistrationEnabled
  strDNSSettings = strDNSSettings & VbCrLf & VbCrLf & _
   "  Network Adapter " & strIndex & VbCrLf & _
   "    " & strDescription & VbCrLf & VbCrLf & _
   "    DNS Domain:                      " & strDNSDomain & VbCrLf & _
   "    DNS Domain Suffix Search Order:" & strDNSSuffixSO & VbCrLf & _
   "    DNS Server Search Order:" & strDNSServerSO & VbCrLf & _
   "    Domain DNS Registration Enabled: " & _
   strDomainDNSRegistrationEnabled & VbCrLf & _
   "    Full DNS Registration Enabled:   " & _
   strFullDNSRegistrationEnabled

Next

 WScript.Echo VbCrLf & "DNS Settings" & VbCrLf & VbCrLf & _
 "Host Name: " & strDNSHostName & strDNSSettings

Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt:

C:\scripts>dnssettings.vbs

DNS Settings

Host Name: client1

Network Adapter 1

3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Packet

Scheduler Miniport

DNS Domain:

DNS Domain Suffix Search Order:

DNS Server Search Order:

192.168.0.1

Domain DNS Registration Enabled:

Full DNS Registration Enabled:

Aktivieren von DNS

Für Situationen, in denen DNS auf Hosts aktiviert werden muss, z. B. bei der Aktualisierung eines Netzwerks von einem anderen Namensauflösungssystem wie WINS, stellt die Klasse Win32_NetworkAdapterConfiguration die EnableDNS()-Methode bereit.

Die Methode verwendet vier optionale Parameter: DNSHostName, DNSDomain, DNSServerSearchOrder und DNSDomainSuffixSearchOrder. Die Datentypen der ersten beiden sowie des letzten Parameters sind Zeichenfolgen; DNSServerSearchOrder ist ein Array von Zeichenfolgen.

Die Klasse Win32_ComputerSystem umfasst eine Rename()-Methode, mit der Sie auch den Computernamen ändern können. Zur Verwendung der Rename()-Methode müssen Sie der lokalen Gruppe Administratoren angehören. Beachten Sie, dass mit dieser Methode keine Remotehosts umbenannt werden können, die einer Domäne angehören. Diese Klasse stellt außerdem die Methoden JoinDomainOrWorkgroup() und UnjoinDomainOrWorkgroup() bereit. Alle drei Methoden sind neu bei Windows XP und Windows Server 2003.

Schritte zur Skripterstellung

caution.gif Vorsicht
Dieses Skript nimmt möglicherweise Änderungen an der Computerkonfiguration vor. Führen Sie es deshalb nur auf einem Testcomputer aus, und notieren Sie sich vor der Skriptausführung die davon betroffenen Einstellungen.

Das Skript in Listing 29 aktiviert DNS für alle Netzwerkadapter auf einem Computer. Dabei wird der Hostname auf client1, die DNS-Domäne auf fabrikam.com, die Suchreihenfolge für DNS-Server als 192.168.0.1 und 192.168.0.2 sowie die Suffixe für die DNS-Suchreihenfolge als fabrikam.com und na.fabrikam.com konfiguriert.

Führen Sie dazu die folgenden Schritte im Skript aus:

1.

Erstellen Sie Variablen zur Angabe des Computernamens und der Parameter, der/die an die EnableWINS-Methode übergeben werden soll(en).

2.

Verwenden Sie einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest.

3.

Verwenden Sie die ExecQuery-Methode zum Abfragen der Klasse Win32_NetworkAdapterConfiguration, die nach den Instanzen gefiltert wird, bei denen IP aktiviert ist.

Die zurückgegebene Auflistung besteht aus allen Netzwerkadapterkonfigurationen auf dem Computer.

4.

Führen Sie für jede Netzwerkadapterkonfiguration in der Auflistung die folgenden Aufgaben aus.

5.

Zeigen Sie die Indexnummer und Beschreibung für den Netzwerkadapter an.

6.

Rufen Sie die EnableDNS-Methode auf, und übergeben Sie ihr die Variablen, die bereits mit dem Hostnamen, der Domäne, der Suchreihenfolge für DNS-Server und der Suchreihenfolge für DNS-Domänensuffixe initialisiert wurden.

7.

Überprüfen Sie den von der Methode zurückgegebenen Wert, und zeigen Sie eine Erfolgsnachricht oder eine Fehlermeldung an.

8.

Fragen Sie die Klasse Win32_NetworkAdapterConfiguration erneut ab, und zeigen Sie die Konfiguration nach dem Vorgang an.

Listing 29 Dns-enable.vbs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
On Error Resume Next

 strComputer = "."
strDNSHostName = "client1"
strDNSDomain = "fabrikam.com"
arrDNSServerSearchOrder = Array("192.168.0.1", "192.168.0.2")
arrDNSDomainSuffixSearchOrder = Array("hr.fabrikam.com", "contoso.com")

 Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objNicConf = objWMIService.Get("Win32_NetworkAdapterConfiguration")

 WScript.Echo VbCrLf & "DNS Host Name: " & strDNSHostName & VbCrLf & _
 "  Attempting to enable DNS"
intEnableDNS = objNicConf.EnableDNS(strDNSHostName, strDNSDomain, _
 arrDNSServerSearchOrder, arrDNSDomainSuffixSearchOrder)
If intEnableDNS = 0 Then
  WScript.Echo "  Successfully enabled DNS."
ElseIf intEnableDNS = 1 Then
  WScript.Echo "  Successfully enabled DNS." & VbCrLf & "    Must reboot."
Else
  WScript.Echo "  Unable to enable DNS."
End If

 WScript.Echo VbCrLf & String(80,"-")

 Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

 For Each objNicConfig In colNicConfigs
  strDNSHostName = objNicConfig.DNSHostName
Next
WScript.Echo VbCrLf & "DNS Host Name: " & strDNSHostName

 For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index & _
 VbCrLf &   "    " & objNicConfig.Description
  WScript.Echo "    DNS Domain: " & objNicConfig.DNSDomain
  WScript.Echo "    DNS Server Search Order:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
  WScript.Echo "    DNS Domain Suffix Search Order:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSDomainSuffix In objNicConfig.DNSDomainSuffixSearchOrder
      WScript.Echo "        " & strDNSDomainSuffix
    Next
  End If
Next

Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt:

C:\scripts>dns-enable.vbs

DNS Host Name: client1

Attempting to enable DNS

Unable to enable DNS.

--------------------------------------------------------------------------------

DNS Host Name: client1

Network Adapter 1

3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Packet

Scheduler Miniport

DNS Domain:

DNS Server Search Order:

192.168.0.1

DNS Domain Suffix Search Order:

hr.fabrikam.com

contoso.com

Ändern der Suchreihenfolge für DNS-Server

Wenn Sie die DNS-Server für einen Client nicht mithilfe von DHCP ermitteln, können Sie jeden Client mit einer Liste eines oder mehrerer DNS-Server, geordnet nach Priorität, konfigurieren, um ihn für die DNS-Namensauflösung einzusetzen. Die Klasse Win32_NetworkAdapterConfiguration stellt die DNSServerSearchOrder-Eigenschaft, in der die Liste in einem Array von Zeichenfolgen enthalten ist, sowie die SetDNSServerSearchOrder-Methode zur Änderung dieser Eigenschaft bereit.

Für die Eigenschaft und Methode ist der erste Server in der Liste der primäre DNS-Server für den Netzwerkadapter. Mithilfe dieser Methode können Sie die Liste der DNS-Server durch eine neue Liste ersetzen, oder Sie können ein oder mehrere Mitglieder an einer beliebigen Position entfernen oder ersetzen. Die Verfahren zur Skripterstellung für diese Änderungen sind je nach der auszuführenden Variation unterschiedlich. Wenn Sie alle DNS-Server aus der Suchreihenfolge entfernen möchten, müssen Sie Null statt einer leeren Zeichenfolge verwenden.

In diesem Abschnitt werden die Schritte zur Skripterstellung und Beispielskripts für diese Aufgaben bereitgestellt:

Ersetzen der gesamten Liste mit der Suchreihenfolge für DNS-Server

Ersetzen eines DNS-Servers durch einen anderen DNS-Server

Hinzufügen eines DNS-Servers am Ende oder Anfang der Suchreihenfolge

Ersetzen der Liste mit der Suchreihenfolge für DNS-Server

Wenn die Suchreihenfolge für DNS-Server geändert werden muss, besteht die einfachste Alternative darin, die gesamte Liste durch eine neue Liste mit der Suchreihenfolge zu ersetzen.

Schritte zur Skripterstellung

caution.gif Vorsicht
Dieses Skript nimmt möglicherweise Änderungen an der Computerkonfiguration vor. Führen Sie es deshalb nur auf einem Testcomputer aus, und notieren Sie sich vor der Skriptausführung die davon betroffenen Einstellungen.

Bei jedem Netzwerkadapter ersetzt das Skript in Listing 30 die aktuelle Suchreihenfolge für DNS-Server durch eine neue Liste.

1.

Erstellen Sie eine Variable zur Angabe des Computernamens.

2.

Weisen Sie IP-Adressen einem Array zu, das die neue Suchreihenfolge für DNS-Server darstellt. Beachten Sie, dass Sie zum Entfernen aller DNS-Server aus der Suchreihenfolge den Wert Null statt einer leeren Zeichenfolge verwenden müssen.

3.

Verwenden Sie einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest.

4.

Verwenden Sie die ExecQuery-Methode zum Abfragen der Klasse Win32_NetworkAdapterConfiguration, wobei die WQL-Abfrage nach "WHERE IPEnabled = True" gefiltert wird.

Die zurückgegebene Auflistung besteht aus allen Netzwerkadapterkonfigurationen auf dem Computer, für die IP aktiviert ist.

5.

Führen Sie für jede Netzwerkadapterkonfiguration in der Auflistung die folgenden Aufgaben aus.

6.

Zeigen Sie den Index und die aktuelle Liste mit der Suchreihenfolge für DNS-Server des Netzwerkadapters an.

7.

Rufen Sie die SetDNSServerSearchOrder-Methode der Klasse Win32_NetworkAdapterConfiguration auf, und übergeben Sie ihr als Parameter das Array von IP-Adressen, das die neue Suchreihenfolge für DNS-Server darstellt.

8.

Überprüfen Sie den von der Methode zurückgegebenen Wert, und zeigen Sie eine Erfolgsnachricht oder eine Fehlermeldung an.

9.

Fragen Sie die Klasse Win32_NetworkAdapterConfiguration erneut ab, und zeigen Sie die neue Suchreihenfolge für DNS-Server an.

Listing 30 Dns-replaceserverlist.vbs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
On Error Resume Next

 strComputer = "."
arrNewDNSServerSearchOrder = Array("192.168.0.1", "192.168.0.2")

 Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

 WScript.Echo VbCrLf & "Computer: " & strComputer

 For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  WScript.Echo "    DNS Server Search Order - Before:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
  intSetDNSServers = _
   objNicConfig.SetDNSServerSearchOrder(arrNewDNSServerSearchOrder)
  If intSetDNSServers = 0 Then
    WScript.Echo "    Replaced DNS server search order list."
  Else
    WScript.Echo "    Unable to replace DNS server search order list."
  End If
Next

 WScript.Echo VbCrLf & String(80, "-")

 Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

 For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  WScript.Echo "    DNS Server Search Order - After:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
Next

Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt:

C:\scripts>dns-replaceserverlist.vbs

Computer: .

Network Adapter 1

DNS Server Search Order - Before:

192.168.0.1

Replaced DNS server search order list.

--------------------------------------------------------------------------------

Network Adapter 1

DNS Server Search Order - After:

192.168.0.1

192.168.0.2

Ersetzen eines DNS-Servers durch einen anderen

Wenn nur ein DNS-Server geändert wurde und die anderen DNS-Server weiterhin gültig sind, können Sie die IP-Adresse des alten Servers einfach durch die IP-Adresse des neuen Servers ersetzen und die Adresse an derselben Position in der Suchreihenfolge beibehalten. Dies wird möglicherweise erforderlich, wenn ein auf alter Hardware ausgeführter DNS-Server durch einen neuen Computer ersetzt wird. Nach Abschluss der Änderung müssen die Clients des ersetzten Servers mit der IP-Adresse des neuen Servers neu konfiguriert werden.

Schritte zur Skripterstellung

caution.gif Vorsicht
Dieses Skript nimmt möglicherweise Änderungen an der Computerkonfiguration vor. Führen Sie es deshalb nur auf einem Testcomputer aus, und notieren Sie sich vor der Skriptausführung die davon betroffenen Einstellungen.

Das Skript in Listing 31 überprüft, ob sich die IP-Adresse eines bestimmten Servers in der Liste mit der Suchreihenfolge für DNS-Server (in einem Zeichenfolgenarray der DNSServerSearchOrder-Eigenschaft enthalten) für jede Netzwerkadapterkonfiguration auf einem Computer befindet. Wird die IP-Adresse gefunden, wird sie durch das Skript entfernt und stattdessen die IP-Adresse des neuen Servers mithilfe der SetDNSServerSearchOrder-Methode hinzugefügt.

1.

Erstellen Sie eine Variable zur Angabe des Computernamens.

2.

Weisen Sie IP-Adressen den Variablen zu, die für den alten zu ersetzenden DNS-Server und den neuen Server stehen.

3.

Verwenden Sie einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest.

4.

Verwenden Sie die ExecQuery-Methode zum Abfragen der Klasse Win32_NetworkAdapterConfiguration, wobei die WQL-Abfrage nach "WHERE IPEnabled = True" gefiltert wird.

Die zurückgegebene Auflistung besteht aus allen Netzwerkadapterkonfigurationen auf dem Computer, für die IP aktiviert ist.

5.

Führen Sie für jede Netzwerkadapterkonfiguration in der Auflistung die folgenden Aufgaben aus.

6.

Zeigen Sie den Index und die aktuelle Liste mit der Suchreihenfolge für DNS-Server des Netzwerkadapters an.

7.

Führen Sie eine Iteration durch die Liste der IP-Adressen des DNS-Servers mit einer For-Schleife durch. Wenn die zu ersetzende IP-Adresse gefunden wird, ersetzen Sie sie durch die neue IP-Adresse, und setzen Sie ein boolesches Flag.

8.

Wenn das Flag auf True gesetzt ist, rufen Sie die SetDNSServerSearchOrder-Methode der Klasse Win32_NetworkAdapterConfiguration auf, und übergeben Sie ihr als Parameter das aktualisierte Array von IP-Adressen, das die neue Suchreihenfolge für DNS-Server darstellt.

9.

Überprüfen Sie den von der Methode zurückgegebenen Wert, und zeigen Sie eine Erfolgsnachricht oder eine Fehlermeldung an.

10.

Wenn die zu ersetzende IP-Adresse nicht gefunden wird, zeigen Sie eine Meldung an.

11.

Fragen Sie die Klasse Win32_NetworkAdapterConfiguration erneut ab, und zeigen Sie die neue Suchreihenfolge für DNS-Server an.

Listing 31 Dns-replaceserver.vbs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
On Error Resume Next

 strComputer = "."
strOldDNSServer = "192.168.0.2"
strNewDNSServer = "192.168.0.5"

 Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

 WScript.Echo VbCrLf & "Computer: " & strComputer

 For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  arrDNSServerSearchOrder = objNicConfig.DNSServerSearchOrder
  WScript.Echo "    DNS Server Search Order - Before:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
  blnFound = 0
  For i = 0 to UBound(arrDNSServerSearchOrder)
    If arrDNSServerSearchOrder(i) = strOldDNSServer Then
      arrDNSServerSearchOrder(i) = strNewDNSServer
      blnFound = 1
    End If
  Next
  If blnFound Then
    retSetDNS = objNicConfig.SetDNSServerSearchOrder(arrDNSServerSearchOrder)
    If retSetDNS = 0 Then
      WScript.Echo "    Replaced " & strOldDNSServer & " with " & _
       strNewDNSServer & " in DNS search order."
    Else
      WScript.Echo "    Unable to change DNS server search order."
    End If
  Else
    WScript.Echo "    DNS server " & strOldDNSServer & " not found."
  End If
Next

 WScript.Echo VbCrLf & String(80, "-")

 Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

 For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  WScript.Echo "    DNS Server Search Order - After:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
Next

Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt:

C:\scripts>dns-replaceserver.vbs

Computer: .

Network Adapter 1

DNS Server Search Order - Before:

192.168.0.3

192.168.0.1

192.168.0.2

192.168.0.4

Replaced 192.168.0.2 with 192.168.0.5 in DNS search order.

--------------------------------------------------------------------------------

Network Adapter 1

DNS Server Search Order - After:

192.168.0.3

192.168.0.1

192.168.0.5

192.168.0.4

Hinzufügen eines DNS-Servers am Ende der Suchreihenfolge

Statt in der Liste mit der Suchreihenfolge für DNS-Server die IP-Adresse eines alten DNS-Servers durch die IP-Adresse eines neuen Servers zu ersetzen, können Sie den neuen Server am Ende der Liste hinzufügen. Dieses Skript zeigt die dazu erforderliche Vorgehensweise.

Schritte zur Skripterstellung

caution.gif Vorsicht
Dieses Skript nimmt möglicherweise Änderungen an der Computerkonfiguration vor. Führen Sie es deshalb nur auf einem Testcomputer aus, und notieren Sie sich vor der Skriptausführung die davon betroffenen Einstellungen.

Das Skript in Listing 32 fügt einen neuen DNS-Server am Ende der Liste mit der Suchreihenfolge für DNS-Server für jede Netzwerkadapterkonfiguration auf einem Computer hinzu.

1.

Erstellen Sie eine Variable zur Angabe des Computernamens.

2.

Weisen Sie der Variablen, die für den neuen DNS-Server steht, eine neue IP-Adresse zu.

3.

Verwenden Sie einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest.

4.

Verwenden Sie die ExecQuery-Methode zum Abfragen der Klasse Win32_NetworkAdapterConfiguration, wobei die WQL-Abfrage nach "WHERE IPEnabled = True" gefiltert wird.

Die zurückgegebene Auflistung besteht aus allen Netzwerkadapterkonfigurationen auf dem Computer, für die IP aktiviert ist.

5.

Führen Sie für jede Netzwerkadapterkonfiguration in der Auflistung die folgenden Aufgaben aus.

6.

Erstellen Sie die Variable intNewArraySize, und setzen Sie sie am Anfang der Schleife auf 0, um Werte aus vorherigen Iterationen zu löschen.

7.

Zeigen Sie den Index und die aktuelle Liste mit der Suchreihenfolge für DNS-Server des Netzwerkadapters an.

8.

Weisen Sie das von der DNSServerSearchOrder-Eigenschaft zurückgegebene Array der Variablen arrDNSServerSearchOrder zu.

9.

Dimensionieren Sie arrDNSServerSearchOrder in Zeile 22 (mit der VBScript-Anweisung ReDim) neu, wobei Sie die Anzahl der Arrayelemente um 1 inkrementieren, um die neue IP-Adresse des DNS-Servers bereitzustellen. Beachten Sie, dass die von der ReDim-Anweisung in VBScript verwendete Zahl um 1 niedriger als die resultierende Arraygröße ist.

10.

Weisen Sie die IP-Adresse des neuen DNS-Servers dem letzten Arrayelement zu.

11.

Rufen Sie die SetDNSServerSearchOrder-Methode der Klasse Win32_NetworkAdapterConfiguration auf, und übergeben Sie ihr das geänderte Array von IP-Adressen.

12.

Überprüfen Sie den von der Methode zurückgegebenen Wert, und zeigen Sie eine Erfolgsnachricht oder eine Fehlermeldung an.

13.

Fragen Sie die Klasse Win32_NetworkAdapterConfiguration erneut ab, und zeigen Sie die neue Suchreihenfolge für DNS-Server an.

Listing 32 Dns-addserver-end.vbs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
On Error Resume Next

 strComputer = "."
strNewDNSServer = "192.168.0.4"

 Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

 WScript.Echo VbCrLf & "Computer: " & strComputer

 For Each objNicConfig In colNicConfigs
  intNewArraySize = 0
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  arrDNSServerSearchOrder = objNicConfig.DNSServerSearchOrder
  WScript.Echo "    DNS Server Search Order - Before:"
  If Not IsNull(arrDNSServerSearchOrder) Then
    For Each strDNSServer In arrDNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
  WScript.Echo "    Adding " & strNewDNSServer & " to end of " & _
   "DNS search order."
  intNewArraySize = UBound(arrDNSServerSearchOrder) + 1
  ReDim Preserve arrDNSServerSearchOrder(intNewArraySize)
  arrDNSServerSearchOrder(intNewArraySize) = strNewDNSServer
  intSetDNS = _
   objNicConfig.SetDNSServerSearchOrder(arrDNSServerSearchOrder)
  If intSetDNS = 0 Then
    WScript.Echo "    Added " & strNewDNSServer & _
     " to end of DNS search order."
  Else
    WScript.Echo "    Unable to change DNS server search order."
  End If
Next

 WScript.Echo VbCrLf & String(80, "-")

 Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

 For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  WScript.Echo "    DNS Server Search Order - After:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
Next

Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt:

C:\scripts>dns-addserver-end.vbs

Computer: .

Network Adapter 1

DNS Server Search Order - Before:

192.168.0.1

192.168.0.2

Adding 192.168.0.4 to end of DNS search order.

Added 192.168.0.4 to end of DNS search order.

--------------------------------------------------------------------------------

Network Adapter 1

DNS Server Search Order - After:

192.168.0.1

192.168.0.2

192.168.0.4

Hinzufügen eines DNS-Servers am Anfang der Suchreihenfolge

Wenn Sie einen neuen DNS-Server am Anfang der Liste mit der Suchreihenfolge hinzufügen möchten, sind die dazu erforderlichen Schritte im folgenden Skript enthalten. In diesem Fall besteht die wichtigste Änderung darin, die eine Codezeile, mit der eine neue IP-Adresse am Ende des Arrays in Dns-addserver-end.vbs (Zeile 21) hinzugefügt wird, durch vier Zeilen zu ersetzen, die jedes Element im Array nach unten verschieben und die neue IP-Adresse am Anfang hinzuzufügen (Zeilen 21–24).

Schritte zur Skripterstellung

caution.gif Vorsicht
Dieses Skript nimmt möglicherweise Änderungen an der Computerkonfiguration vor. Führen Sie es deshalb nur auf einem Testcomputer aus, und notieren Sie sich vor der Skriptausführung die davon betroffenen Einstellungen.

Das Skript in Listing 33 fügt einen neuen DNS-Server am Anfang der Liste mit der Suchreihenfolge für DNS-Server für jede Netzwerkadapterkonfiguration auf einem Computer hinzu.

1.

Erstellen Sie eine Variable zur Angabe des Computernamens.

2.

Weisen Sie der Variablen, die für den neuen DNS-Server steht, eine neue IP-Adresse zu.

3.

Verwenden Sie einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest.

4.

Verwenden Sie die ExecQuery-Methode zum Abfragen der Klasse Win32_NetworkAdapterConfiguration, wobei die WQL-Abfrage nach "WHERE IPEnabled = True" gefiltert wird.

Die zurückgegebene Auflistung besteht aus allen Netzwerkadapterkonfigurationen auf dem Computer, für die IP aktiviert ist.

5.

Führen Sie für jede Netzwerkadapterkonfiguration in der Auflistung die folgenden Aufgaben aus.

6.

Erstellen Sie die Variable intNewArraySize, und setzen Sie sie am Anfang der Schleife auf 0, um Werte aus vorherigen Iterationen zu löschen.

7.

Zeigen Sie den Index und die aktuelle Liste mit der Suchreihenfolge für DNS-Server des Netzwerkadapters an.

8.

Weisen Sie das von der DNSServerSearchOrder-Eigenschaft zurückgegebene Array der Variablen arrDNSServerSearchOrder zu.

9.

Dimensionieren Sie arrDNSServerSearchOrder in Zeile 22 (mit der VBScript-Anweisung ReDim) neu, wobei Sie die Anzahl der Arrayelemente um 1 inkrementieren, um die neue IP-Adresse des DNS-Servers bereitzustellen. Beachten Sie, dass die von der ReDim-Anweisung in VBScript verwendete Zahl um 1 niedriger als die resultierende Arraygröße ist.

10.

Durchlaufen Sie alle Arrayelemente mit Ausnahme des letzten (des neuen Elements, das weiterhin leer ist) in einer Schleife, und weisen Sie jedes Element dem folgenden Element im Array zu. Damit wird das gesamte Array um einen Schritt nach unten verschoben.

11.

Weisen Sie die IP-Adresse des neuen DNS-Servers dem ersten Arrayelement (mit dem Index 0) zu.

12.

Rufen Sie die SetDNSServerSearchOrder-Methode der Klasse Win32_NetworkAdapterConfiguration auf, und übergeben Sie ihr das geänderte Array von IP-Adressen.

13.

Überprüfen Sie den von der Methode zurückgegebenen Wert, und zeigen Sie eine Erfolgsnachricht oder eine Fehlermeldung an.

14.

Fragen Sie die Klasse Win32_NetworkAdapterConfiguration erneut ab, und zeigen Sie die neue Suchreihenfolge für DNS-Server an.

Listing 33 Dns-addserver-top.vbs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
30
41
42
43
44
45
46
47
48
49
50
51
52
53
On Error Resume Next

 strComputer = "."
strNewDNSServer = "192.168.0.3"

 Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

 WScript.Echo VbCrLf & "Computer: " & strComputer

 For Each objNicConfig In colNicConfigs
  intNewArraySize = 0
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  arrDNSServerSearchOrder = objNicConfig.DNSServerSearchOrder
  WScript.Echo "    DNS Server Search Order - Before:"
  If Not IsNull(arrDNSServerSearchOrder) Then
    For Each strDNSServer In arrDNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
  WScript.Echo "    Adding " & strNewDNSServer & " to top of " & _
   "DNS search order."
  intNewArraySize = UBound(arrDNSServerSearchOrder) + 1
  ReDim Preserve arrDNSServerSearchOrder(intNewArraySize)
  For i = (intNewArraySize - 1) To 0 Step -1
    arrDNSServerSearchOrder(i + 1) = arrDNSServerSearchOrder(i)
  Next
  arrDNSServerSearchOrder(0) = strNewDNSServer
  intSetDNS = objNicConfig.SetDNSServerSearchOrder(arrDNSServerSearchOrder)
  If intSetDNS = 0 Then
    WScript.Echo "    Added " & strNewDNSServer & _
     " to top of DNS search order."
  Else
    WScript.Echo "    Unable to change DNS server search order."
  End If
Next

 WScript.Echo VbCrLf & String(80, "-")

 Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

 For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index
  WScript.Echo "    DNS Server Search Order - After:"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      WScript.Echo "        " & strDNSServer
    Next
  End If
Next

Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt:

C:\scripts>dns-addserver-top.vbs

Computer: .

Network Adapter 1

DNS Server Search Order - Before:

192.168.0.1

192.168.0.2

192.168.0.4

Adding 192.168.0.3 to top of DNS search order.

Added 192.168.0.3 to top of DNS search order.

--------------------------------------------------------------------------------

Network Adapter 1

DNS Server Search Order - After:

192.168.0.3

192.168.0.1

192.168.0.2

192.168.0.4

Ändern der DNS-Domäne

Manchmal müssen Sie die DNS-Domäne auf mehreren Clients ändern – beispielsweise, wenn Sie eine untergeordnete Domäne hinzufügen oder zwei Domänen zusammenführen. Wenn dies viele oder weit verstreute Clients betrifft, kann die Skripterstellung eine zeitsparende und fehlerreduzierende Alternative zur manuellen Konfiguration sein.

In Windows 2000, Windows XP und Windows Server 2003 können Sie mithilfe der SetDNSDomain()-Methode der Klasse Win32_NetworkAdapterConfiguration die DNS-Domäne für einen bestimmten Netzwerkadapter festlegen. Sie müssen dieser Methode einen einzigen Parameter – eine Zeichenfolge zur Angabe des Namens der neuen DNS-Domäne – übergeben. Unter Windows NT Server 4.0 gilt die Win32_NetworkAdapterConfiguration-Einstellung global für alle Netzwerkadapter.

Unter Windows XP und Windows Server 2003 ermöglichen es Ihnen die Win32_ComputerSystem-Methoden JoinDomainOrWorkgroup() und UnjoinDomainOrWorkgroup(), einen Computer einer Active Directory-Domäne hinzuzufügen oder aus ihr zu entfernen. Bei diesen Methoden gelten die Änderungen für alle Netzwerkadapter. Wenn Sie die gleichen Änderungen über die Windows XP-Benutzeroberfläche vornehmen möchten, können Sie dazu den Assistenten für die Netzwerkanmeldung verwenden.

Win32_ComputerSystem umfasst auch die Eigenschaften Domain und DomainRole zur Rückgabe der Active Directory-Domänenmitgliedschaft sowie der Rolle, die der Computer dabei spielt – z. B. "Mitglied der Domäne/Arbeitsgruppe" oder "Domänencontroller". Sie müssen die Änderungen in DNS-Domänen möglicherweise mit entsprechenden Änderungen in Active Directory koordinieren.

Ändern der DNS-Domäne bei "Win32_NetworkAdapterConfiguration"

Das folgende Skript zeigt, wie die SetDNSDomain()-Methode der Klasse Win32_NetworkAdapterConfiguration verwendet wird, um die DNS-Domäne für alle Netzwerkadapter festzulegen. Weil diese Methode auf Adapterbasis funktioniert, könnten Sie damit auch die DNS-Domäne auf einem bestimmten Netzwerkadapter festlegen.

Schritte zur Skripterstellung

caution.gif Vorsicht
Dieses Skript nimmt möglicherweise Änderungen an der Computerkonfiguration vor. Führen Sie es deshalb nur auf einem Testcomputer aus, und notieren Sie sich vor der Skriptausführung die davon betroffenen Einstellungen.

1.

Erstellen Sie eine Variable zur Angabe des Computernamens.

2.

Erstellen Sie eine Variable zur Angabe des neuen DNS-Domänennamens.

3.

Verwenden Sie einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest.

4.

Verwenden Sie die ExecQuery-Methode zum Abfragen der Klasse Win32_NetworkAdapterConfiguration.

Die zurückgegebene Auflistung besteht aus allen Netzwerkadapterkonfigurationen auf dem Computer.

5.

Führen Sie für jede Netzwerkadapterkonfiguration in der Auflistung die folgenden Aufgaben aus.

6.

Zeigen Sie den Index, die Beschreibung des DNS-Hostnamens und die aktuelle DNS-Domäne des Netzwerkadapters an.

7.

Rufen Sie die SetDNSDomain-Methode der Klasse Win32_NetworkAdapterConfiguration auf, und übergeben Sie ihr die Variable mit dem neuen DNS-Domänennamen.

8.

Überprüfen Sie den von der Methode zurückgegebenen Wert, und zeigen Sie eine Erfolgsnachricht oder eine Fehlermeldung an.

9.

Fragen Sie die Klasse Win32_NetworkAdapterConfiguration erneut ab, und zeigen Sie die neue DNS-Domäne an.

Listing 34 Dns-setdomain.vbs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
On Error Resume Next

 strComputer = "."
strDNSDomain = "fabrikam.com"

 Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

 For Each objNicConfig In colNicConfigs
  strDNSHostName = objNicConfig.DNSHostName
Next
WScript.Echo VbCrLf & "DNS Host Name: " & strDNSHostName

 For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & _
   "  Network Adapter " & objNicConfig.Index & VbCrLf & _
   "    " & objNicConfig.Description & VbCrLf & _
   "    DNS Domain - Before: " & objNicConfig.DNSDomain
  intSetDomain = objNicConfig.SetDNSDomain(strDNSDomain)
  If intSetDomain = 0 Then
    WScript.Echo "    Successfully set DNS domain to " & strDNSDomain
  ElseIf intSetDomain = 1 Then
    WScript.Echo "    Successfully set DNS domain to " & strDNSDomain & _
     VbCrLf & "    Must reboot."
  Else
    WScript.Echo "    Unable to set DNS domain."
  End If
Next

 WScript.Echo VbCrLf & String(80, "-")

 Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

 For Each objNicConfig In colNicConfigs
  strDNSHostName = objNicConfig.DNSHostName
Next
WScript.Echo VbCrLf & "DNS Host Name: " & strDNSHostName

For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & _
   "  Network Adapter " & objNicConfig.Index & VbCrLf & _
   "    " & objNicConfig.Description & VbCrLf & _
   "    DNS Domain - After: " & objNicConfig.DNSDomain
Next

Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt:

C:\scripts>dns-setdomain.vbs

DNS Host Name: client1

Network Adapter 1

3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Packet

Scheduler Miniport

DNS Domain - Before:

Successfully set DNS domain to fabrikam.com

--------------------------------------------------------------------------------

DNS Host Name: client1

Network Adapter 1

3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Packet

Scheduler Miniport

DNS Domain - After: fabrikam.com

Ändern der Domäne bei "Win32_ComputerSystem"

Das folgende Skript zeigt, wie die JoinDomainOrWorkgroup()-Methode der Klasse Win32_ComputerSystem verwendet wird, um einen Computer einer Active Directory-Domäne hinzuzufügen. Anders als bei der SetDNSDomain()-Methode der Klasse Win32_NetworkAdapterConfiguration, die Änderungen nur auf jeden angegebenen Adapter anwendet, gelten die hier vorgenommenen Änderungen für alle Netzwerkadapter. Win32_ComputerSystem stellt auch eine UnjoinDomainOrWorkgroup()-Methode bereit. Sowohl die JoinDomainOrWorkgroup()-Methode als auch die UnjoinDomainOrWorkgroup()-Methode ist nur unter Windows XP und Windows Server 2003 verfügbar.

Sie müssen die Domänenänderungen möglicherweise mit den entsprechenden Änderungen in Active Directory koordinieren.

In Tabelle 15 werden die fünf Parameter beschrieben, die von der JoinDomainOrWorkgroup()-Methode akzeptiert werden.

Tabelle 15 Parameter für "JoinDomainOrWorkgroup()"

ParameterBeschreibung

Name

Der Name der hinzufügenden Domäne oder Arbeitsgruppe. Darf nicht den Wert NULL haben.

Kennwort

Muss angegeben werden, wenn ein alternativer Username-Parameter übergeben wird. Darf den Wert NULL haben, wenn kein Username-Parameter übergeben wird.

Username

NetBIOS-Name und -Benutzerkonto, im Format DOMÄNE\Benutzer. Wenn der Wert dieses Parameters NULL ist, werden die Anmeldeinformationen verwendet, unter denen das Skript ausgeführt wird.

AccountOU

Optional. Darf den Wert NULL haben. Der vollständige Distinguished Name der Active Directory-Organisationseinheit, z. B. OU=HR,DC=fabrikam,DC=com.

FJoinOptions

Eine Gruppe von Bitflags, die Optionen für das Hinzufügen einer Domäne oder Arbeitsgruppe angeben. Wenn Sie diesen Parameter nicht festlegen, wird der Standardwert 1 (Domäne beitreten) verwendet und der im ersten Parameter angegebene Name als Arbeitsgruppe angenommen. Sie können 0 oder weitere dieser Parameter gleichzeitig festlegen, indem Sie die erforderlichen Werte mithilfe von der Bitoperation OR verknüpfen, wie das folgende Skript zeigt.

In Tabelle 16 werden die Werte für den Parameter FJoinOptions der JoinDomainOrWorkgroup()-Methode beschrieben.

Tabelle 16 Werte für "FjoinOptions"

Wert: Dezimal und HexWertBedeutung

1

&h00001

Domäne beitreten

Standard. Fügt einen Computer einer Domäne hinzu. Falls dieser Wert nicht angegeben wird, wird der Computer einer Arbeitsgruppe hinzugefügt.

2

&h00002

Kontenerstellung

Erstellt ein Konto in einer Domäne.

4

&h00004

Kontenlöschung

Löscht ein Konto, wenn eine Domäne vorhanden ist.

16

&h00010

Win9X-Update

Der Beitrittsvorgang wird als Teil einer Aktualisierung von Windows 95 oder Windows 98 auf Windows NT 4.0 oder Windows 2000 durchgeführt.

32

&h00020

Domänenbeitritt falls beigetreten

Fügt einen Computer einer neuen Domäne hinzu, auch wenn er bereits Mitglied einer Domäne ist.

64

&h00040

Unsicherer Beitritt

Führt einen unsicheren Beitritt durch.

128

&h00080

Computerkennwort weitergeleitet

Das Kennwort für den Computer, nicht für den Benutzer, wird übergeben. Diese Option kann nur bei unsicheren Beitritten verwendet werden.

256

&h00100

Zurückgestellter SPN-Satz

Das Schreiben der Attribute SPN und DnsHostName auf dem Computerobjekt sollte bis zum Umbenennen nach dem Beitritt zurückgestellt werden.

262144

&h40000

Installationsaufruf

Die APIs wurden während der Installation aufgerufen.

Darüber hinaus enthält die Klasse Win32_ComputerSystem eine UnjoinDomainOrWorkgroup()-Methode (ebenfalls neu bei Windows XP), die einen Computer aus einer Domäne entfernt.

Schritte zur Skripterstellung

caution.gif Vorsicht
Dieses Skript nimmt möglicherweise Änderungen an der Computerkonfiguration vor. Führen Sie es deshalb nur auf einem Testcomputer aus, und notieren Sie sich vor der Skriptausführung die davon betroffenen Einstellungen.

Das Skript in Listing 35 ändert die Domäne global für das Computersystem.

1.

Definieren Sie die Konstante JOIN_DOMAIN Mit dem Wert 1.

note.gif Hinweis
Beachten Sie, dass dieser Wert einen Computer einer Domäne nur dann hinzufügt, wenn er nicht bereits Mitglied einer Domäne ist. Wenn Sie einen Computer, der bereits einer Domäne hinzugefügt wurde, einer neuen Domäne hinzufügen möchten, erstellen Sie die Konstante DOMAIN_JOIN_IF_JOINED mit dem Wert 32. Übergeben Sie die Konstante dann im Aufruf der JoinDomainOrWorkgroup-Methode als letzten Parameter anstelle von JOIN_DOMAIN.

2.

Erstellen Sie eine Variable zur Angabe des Computernamens.

3.

Erstellen Sie eine Variable zur Angabe des neuen DNS-Domänennamens.

4.

Verwenden Sie einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest.

5.

Verwenden Sie die ExecQuery-Methode zum Abfragen der Klasse Win32_ComputerSystem.

6.

Die zurückgegebene Auflistung besteht aus allen Computersystemen auf dem Computer. Nur ein Computersystem wird zurückgegeben.

7.

Führen Sie für jede Netzwerkadapterkonfiguration in der Auflistung die folgenden Aufgaben aus.

8.

Zeigen Sie den Computernamen und die aktuelle Domäne an.

9.

Rufen Sie die JoinDomainOrWorkgroup-Methode der Klasse Win32_ComputerSystem auf, und übergeben Sie ihr zwei Parameter: die Variable zur Darstellung des neuen Domänennamens und die Konstante JOIN_DOMAIN. Kennzeichnen Sie die Stellen für die leeren optionalen Parameter durch Kommas.

10.

Überprüfen Sie den von der Methode zurückgegebenen Wert, und zeigen Sie eine Erfolgsnachricht oder eine Fehlermeldung an.

11.

Fragen Sie die Klasse Win32_ComputerSystem erneut ab, und zeigen Sie die geänderte Domäne an.

12.

Verwenden Sie eine Select Case-Anweisung, um die durch die DomainRole-Eigenschaft zurückgegebene ganze Zahl in eine aussagekräftige Zeichenfolge zu konvertieren, und zeigen Sie diese an.

Listing 35 Dns-setdomain-global.vbs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
On Error Resume Next

 Const JOIN_DOMAIN = 1
strComputer = "."
strDomainName = "fabrikam.com"

 Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colCompSystems = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_ComputerSystem")

 For Each objCompSystem In colCompSystems
  WScript.Echo VbCrLf & "Computer Name: " & LCase(objCompSystem.Name)
  WScript.Echo "  Domain - Before: " & LCase(objCompSystem.Domain)
  intJoinDomain = objCompSystem.JoinDomainOrWorkgroup(strDomainName,,,, _
   JOIN_DOMAIN)
  If intJoinDomain = 0 Then
    WScript.Echo "    Joined computer to " & strDomainName & " domain."
  ElseIf intJoinDomain = 1 Then
    WScript.Echo "    Joined computer to " & strDomainName & " domain." & _
     VbCrLf & "    Must reboot."
  Else
    WScript.Echo "    Unable to join computer to " & strDomainName & _
     " domain."
WScript.Echo "Return value of JoinDomainOrWorkgroup method: " & intJoinDomain
  End If
Next

 WScript.Echo VbCrLf & String(80, "-")

 Set colCompSystems = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_ComputerSystem")

 For Each objCompSystem In colCompSystems
  WScript.Echo VbCrLf & "Computer Name: " & LCase(objCompSystem.Name)
  WScript.Echo "  Domain - After: " & LCase(objCompSystem.Domain)
  intDomainRole = objCompSystem.DomainRole
  Select Case intDomainRole
    Case 0 strDomainRole = "Standalone Workstation"
    Case 1 strDomainRole = "Member Workstation"
    Case 2 strDomainRole = "Standalone Server"
    Case 3 strDomainRole = "Member Server"
    Case 4 strDomainRole = "Backup Domain Controller"
    Case 5 strDomainRole = "Primary Domain Controller"
    Case Else strDomainRole = "Cannot determine domain role."
  End Select
  WScript.Echo "  Domain Role: " & strDomainRole
Next

Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt:

C:\scripts>dns-setdomain-global.vbs

Computer Name: client1

Domain - Before:

Joined computer to fabrikam.com domain.

--------------------------------------------------------------------------------

Computer Name: client1

Domain - After: fabrikam.com

Domain Role: Member Workstation

Ändern der Suchreihenfolge für DNS-Domänensuffixe

Außer dem Ändern der DNS-Domäne eines Computers können Sie auch die Suchreihenfolge für das DNS-Domänensuffix festlegen. Dies kann erforderlich sein, wenn der Host unvollständige Namen auf DNS-Servern in mehr als einer Domäne auflösen muss. Eine derartige Situation könnte eintreten, wenn ein Netzwerk mehrere sekundäre DNS-Server in unterschiedlichen Domänen umfasst oder wenn bei einem mehrfach vernetzten Computer jeder Netzwerkadapter einer anderen Domäne zugeordnet ist.

Das folgende Skript legt die DNS-Domänensuffixe fest, die denjenigen Namen entsprechen, die Sie auf der Registerkarte DNS des Dialogfelds Erweiterte TCP/IP-Einstellungen im Textfeld unter Diese DNS-Suffixe anhängen (in Reihenfolge) eingeben würden.

caution.gif Vorsicht
Dieses Skript nimmt möglicherweise Änderungen an der Computerkonfiguration vor. Führen Sie es deshalb nur auf einem Testcomputer aus, und notieren Sie sich vor der Skriptausführung die davon betroffenen Einstellungen.

SetDNSSuffixSearchOrder ist eine statische Methode, die für alle Instanzen der Klasse Win32_NetworkAdapterConfiguration (also für alle IP-Netzwerkadapter) gilt. Dies bedeutet, dass Sie die einfachere Get()-Methode des SwbemServices-Objekts (zurückgegeben durch den vorherigen GetObject-Aufruf an den winmgmts:-Moniker) verwenden können, um ein Objekt zur Darstellung der gesamten Klasse abzurufen, statt die komplexere ExecQuery()-Methode bei einer WQL-Abfrage zu verwenden, um eine Auflistung von Objekten zur Darstellung von Instanzen der Klasse abzurufen. Die Get()-Methode steht in Zeile 24:

Set objNetworkSettings = objWMIService.Get("Win32_NetworkAdapterConfiguration")

Statt die SetDNSSuffixSearchOrder-Methode einfach ohne Parameter aufzurufen, wie bei EnableDHCP, müssen Sie ihr ein Array von Zeichenfolgen mit den Suffixnamen übergeben.

Wenn Sie in einem Skript nur die SetDNSSuffixSearchOrder-Methode aufrufen müssten, könnten Sie kompaktere Möglichkeiten der Bindung an die Klasse Win32_NetworkAdapterConfiguration nutzen. Hier sind zwei Beispiele:

Set objNicConfig = GetObject("winmgmts:\\" & strComputer &_
 "\root\cimv2:Win32_NetworkAdapterConfiguration")
Set objNicConfig = GetObject("winmgmts:").Get _
 ("Win32_NetworkAdapterConfiguration")

Das in einem bestimmten Kontext beste Verfahren ergibt sich oftmals aus Ihrem Programmierstil oder den Organisationsstandards.

Schritte zur Skripterstellung

Das Skript in Listing 36 ersetzt die alte Liste mit der Suchreihenfolge für DNS-Domänensuffixe durch eine neue Liste für alle Netzwerkadapter.

1.

Erstellen Sie eine Variable zur Angabe des Computernamens.

2.

Erstellen Sie eine Arrayvariable zur Angabe der Liste von DNS-Domänensuffixen.

3.

Verwenden Sie einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest.

4.

Verwenden Sie die ExecQuery-Methode zum Abfragen der Klasse Win32_NetworkAdapterConfiguration, wobei die WQL-Abfrage nach "WHERE IPEnabled = True" gefiltert wird.

Die zurückgegebene Auflistung besteht aus allen Netzwerkadapterkonfigurationen auf dem Computer, für die IP aktiviert ist.

5.

Führen Sie für jede Netzwerkadapterkonfiguration in der Auflistung die folgenden Aufgaben aus.

6.

Überprüfen Sie, ob der Wert der DNSDomainSuffixSearchOrder-Eigenschaft nicht den Wert Null hat.

7.

Führen Sie eine Iteration durch das Array der Zeichenfolgen durch, die von der DNSDomainSuffixSearchOrder-Eigenschaft zurückgegeben werden.

8.

Verketten Sie die Arrayelemente in eine einzige Zeichenfolge.

9.

Zeigen Sie die Zeichenfolge mit der Liste der DNS-Domänensuffixe in der richtigen Reihenfolge an.

10.

Rufen Sie die SetDNSSuffixSearchOrder-Methode der Klasse Win32_NetworkAdapterConfiguration auf, und übergeben Sie ihr einen einzigen Parameter: das Array mit der Liste der DNS-Domänensuffixe.

11.

Überprüfen Sie den von der Methode zurückgegebenen Wert, und zeigen Sie eine Erfolgsnachricht oder eine Fehlermeldung an.

12.

Fragen Sie die Klasse Win32_NetworkAdapterConfiguration erneut ab, und zeigen Sie die geänderte Liste von DNS-Domänensuffixen an.

Listing 36 Dns-replacesuffixlist.vbs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
On Error Resume Next

 strComputer = "."
arrNewDNSSuffixSearchOrder = Array("hr.fabrikam.com", "contoso.com")

 Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

 For Each objNicConfig In colNicConfigs
  strDNSHostName = objNicConfig.DNSHostName
Next
WScript.Echo VbCrLf & "DNS Host Name: " & strDNSHostName

 For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & _
   "  Network Adapter " & objNicConfig.Index & VbCrLf & _
   "    " & objNicConfig.Description & VbCrLf & _
   "    DNS Domain Suffix Search Order - Before:"
  If Not IsNull(objNicConfig.DNSDomainSuffixSearchOrder) Then
    For Each strDNSSuffix In objNicConfig.DNSDomainSuffixSearchOrder
      WScript.Echo "      " & strDNSSuffix
    Next
  End If
Next

 WScript.Echo VbCrLf & String(80, "-")

 Set objNetworkSettings = _
 objWMIService.Get("Win32_NetworkAdapterConfiguration")
intSetSuffixes = _
 objNetworkSettings.SetDNSSuffixSearchOrder(arrNewDNSSuffixSearchOrder)
If intSetSuffixes = 0 Then
  WScript.Echo VbCrLf & "Replaced DNS domain suffix search order list."
ElseIf intSetSuffixes = 1 Then
  WScript.Echo VbCrLf & "Replaced DNS domain suffix search order list." & _
   VbCrLf & "    Must reboot."
Else
  WScript.Echo VbCrLf & "Unable to replace DNS domain suffix " & _
   "search order list."
End If

 WScript.Echo VbCrLf & String(80, "-")

 Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & _
   "  Network Adapter " & objNicConfig.Index & VbCrLf & _
   "    " & objNicConfig.Description & VbCrLf & _
   "    DNS Domain Suffix Search Order - After:"
  If Not IsNull(objNicConfig.DNSDomainSuffixSearchOrder) Then
    For Each strDNSSuffix In objNicConfig.DNSDomainSuffixSearchOrder
      WScript.Echo "      " & strDNSSuffix
    Next
  End If
Next

Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt:

C:\scripts>dns-replacesuffixlist.vbs

DNS Host Name: client1

Network Adapter 1

3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Packet

Scheduler Miniport

DNS Domain Suffix Search Order - Before:

--------------------------------------------------------------------------------

Replaced DNS domain suffix search order list.

--------------------------------------------------------------------------------

Network Adapter 1

3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Packet

Scheduler Miniport

DNS Domain Suffix Search Order - After:

hr.fabrikam.com

contoso.com

Ändern der Einstellungen für dynamische DNS-Registrierung

Da sich IP-Adressen bei DHCP-Clients ändern, automatisieren die DNS-Registrierung und die dynamische Aktualisierung den Prozess, mit dem die Änderung von Hostname und IP-Adresszuordnungen auf den DNS-Servern auf dem neuesten Stand gehalten wird. Obwohl dieser Aktualisierungsprozess von den Administratoren früher manuell ausgeführt werden musste, ermöglicht es die dynamische DNS-Aktualisierung (RFC 2136) Clients und DHCP-Servern, die Ressourceneinträge für Hosts (A) und Zeiger (PTR) auf dem DNS-Server ohne einen manuellen Vorgang auf dem neuesten Stand zu halten.

Wie gewöhnlich enthält die Klasse Win32_NetworkAdapterConfiguration schreibgeschützte Eigenschaften zum Bereitstellen der Einstellungen für die DNS-Registrierung und -Aktualisierung sowie eine Methode für deren Änderung. Die an die SetDynamicDNSRegistration-Methode zu übergebenden Parameter sowie die zwei davon festgelegten booleschen Eigenschaften entsprechen zwei Kontrollkästchen im unteren Bereich der Registerkarte DNS des Dialogfelds Erweiterte TCP/IP-Einstellungen. Dabei entspricht Adressen dieser Verbindung in DNS registrieren in der Windows-Benutzeroberfläche der FullDNSRegistrationEnabled-Eigenschaft und DNS-Suffix dieser Verbindung in DNS-Registrierung verwenden der DomainDNSRegistrationEnabled-Eigenschaft. Beide Eigenschaften und die Methode sind neu bei Windows XP und Windows Server 2003. Der Wert von DomainDNSRegistrationEnabled, deren Standardwert False ist, wird nur verwendet, wenn FullDNSRegistrationEnabled den Wert True aufweist; andernfalls wird er ignoriert.

Sie können auf der Windows-Benutzeroberfläche den Namen suchen, auf den sich die FullDNSRegistrationEnabled-Eigenschaft bezieht. Öffnen Sie die Systemsteuerung, klicken Sie auf System, dann auf die Registerkarte Computername, und zeigen Sie das Feld VollständigerComputername an. Der Wert in diesem Feld besteht aus dem Hostnamen mit angehängtem Domänennamen. Wenn die FullDNSRegistrationEnabled-Eigenschaft True lautet, werden die IP-Adressen für den Netzwerkadapter in DNS unter Verwendung dieses Namens registriert.

Lautet die DomainDNSRegistrationEnabled-Eigenschaft True, werden die IP-Adressen zusätzlich in DNS registriert und dazu die DNSDomain-Eigenschaft für den jeweiligen Netzwerkadapter verwendet.

So müssen Sie beispielsweise auf einem mehrfach vernetzten Computer, dessen Netzwerkadapter jeweils mit einem anderen Netzwerk mit einer anderen Domänenstruktur verbunden sind, bei der Domänenregistrierung verbindungsspezifische DNS-Suffixe verwenden. In solchen Fällen kann der Client für jede Netzwerkverbindung ein anderes Domänensuffix registrieren. Dies könnte durch Festlegen der Werte von FullDNSRegistrationEnabled und DomainDNSRegistrationEnabled auf True ermöglicht werden.

Schritte zur Skripterstellung

caution.gif Vorsicht
Dieses Skript nimmt möglicherweise Änderungen an der Computerkonfiguration vor. Führen Sie es deshalb nur auf einem Testcomputer aus, und notieren Sie sich vor der Skriptausführung die davon betroffenen Einstellungen.

Dieses Skript ändert die Einstellungen für die Durchführung der dynamischen DNS-Registrierung, indem es mithilfe der SetDynamicDNSRegistration()-Methode der Klasse Win32_NetworkAdapterConfiguration die Eigenschaften DomainDNSRegistrationEnabled und FullDNSRegistrationEnabled ändert.

Die Methode und die Eigenschaften sind neu bei Windows XP und Windows Server 2003. Das Skript überprüft nicht, welche Betriebssystemversion verwendet wird; wenn SetDynamicDNSRegistration jedoch nicht 0 (= erfolgreich) zurückgibt, fängt das Skript den Fehler auf und zeigt eine Meldung an.

1.

Erstellen Sie eine Variable zur Angabe des Computernamens.

2.

Erstellen Sie zwei boolesche Variablen zur Angabe der gewünschten Einstellungen für die Eigenschaften DomainDNSRegistrationEnabled und FullDNSRegistrationEnabled.

3.

Verwenden Sie einen GetObject-Aufruf zum Herstellen einer Verbindung zum WMI-Namespace root\cimv2, und legen Sie den Parameter "impersonationLevel" auf "impersonate" fest.

4.

Verwenden Sie die ExecQuery-Methode zum Abfragen der Klasse Win32_NetworkAdapterConfiguration, wobei die WQL-Abfrage nach "WHERE IPEnabled = True" gefiltert wird.

Die zurückgegebene Auflistung besteht aus allen Netzwerkadapterkonfigurationen auf dem Computer, für die IP aktiviert ist.

5.

Führen Sie für jede Netzwerkadapterkonfiguration in der Auflistung die folgenden Aufgaben aus.

6.

Zeigen Sie die aktuellen Einstellungen der dynamischen DNS-Registrierung an.

7.

Rufen Sie die SetDynamicDNSRegistration-Methode der Klasse Win32_NetworkAdapterConfiguration auf, und übergeben Sie ihr die beiden booleschen Parameter, die am Anfang des Skripts festgelegt wurden.

8.

Überprüfen Sie den von der Methode zurückgegebenen Wert, und zeigen Sie eine Erfolgsnachricht oder eine Fehlermeldung an.

9.

Fragen Sie die Klasse Win32_NetworkAdapterConfiguration erneut ab, und zeigen Sie die geänderten Einstellungen für die dynamische DNS-Registrierung an.

Listing 37 Dns-setdynreg.vbs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
On Error Resume Next

 strComputer = "."
blnFullDNSRegistrationEnabled = True
blnDomainDNSRegistrationEnabled = True

 Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

 For Each objNicConfig In colNicConfigs
  strDNSHostName = objNicConfig.DNSHostName
Next
WScript.Echo VbCrLf & "DNS Host Name: " & strDNSHostName

 For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & _
   "  Network Adapter " & objNicConfig.Index & VbCrLf & _
   "    " & objNicConfig.Description & VbCrLf & _
   "    DNS Full Registration Enabled - Before: " & _
   objNicConfig.FullDNSRegistrationEnabled & VbCrLf & _
   "    DNS Domain Registration Enabled - Before: " & _
   objNicConfig.DomainDNSRegistrationEnabled
  intDynReg = objNicConfig.SetDynamicDNSRegistration _
   (blnFullDNSRegistrationEnabled, blnDomainDNSRegistrationEnabled)
  If intDynReg = 0 Then
    WScript.Echo VbCrLf & "    Successfully set dynamic DNS registration."
  ElseIf intDynReg = 1 Then
    WScript.Echo VbCrLf & _
     "    Successfully set dynamic DNS registration." & _
     VbCrLf & "    Must reboot."
  Else
    WScript.Echo VbCrLf & "    Unable to set dynamic DNS registration."
  End If
Next

 WScript.Echo VbCrLf & String(80, "-")

 Set colNicConfigs = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

 For Each objNicConfig In colNicConfigs
  WScript.Echo VbCrLf & "  Network Adapter " & objNicConfig.Index & _
 VbCrLf &   "    " & objNicConfig.Description & VbCrLf & _
   "    DNS Full Registration Enabled - After: " & _
   objNicConfig.FullDNSRegistrationEnabled & VbCrLf & _
   "    DNS Domain Registration Enabled - After: " & _
   objNicConfig.DomainDNSRegistrationEnabled
Next

Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird im Befehlsfenster eine ähnliche Ausgabe wie die folgende angezeigt:

C:\scripts>dns-setdynreg.vbs

DNS Host Name: client1

Network Adapter 1

3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Packet

Scheduler Miniport

DNS Full Registration Enabled - Before:

DNS Domain Registration Enabled - Before:

Successfully set dynamic DNS registration.

--------------------------------------------------------------------------------

Network Adapter 1

3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible) - Packet

Scheduler Miniport

DNS Full Registration Enabled - After: True

DNS Domain Registration Enabled - After: True

Szenario: Ändern von DNS-Servern und -Domänen

Bei großen Veränderung in einem Unternehmen - zum Beispiel Fusionen, Übernahmen und Umstrukturierungen - kann sich die DNS-Domänenhierarchie eines Unternehmens ändern, und Hosts müssen möglicherweise neu konfiguriert werden, damit sie in der neuen Struktur funktionieren.

In diesem Szenario weist die IT-Abteilung bei Fabrikam, Inc., Clients, die sich zuvor in der Domäne der obersten Ebene, fabrikam.com, befanden, verschiedenen Unterdomänen zu: hr.fabrikam.com, it.fabrikam.com und ac.fabrikam.com. Der primäre DNS-Server für jede Unterdomäne dient außerdem zum Sichern der beiden anderen Unterdomänen.

Dieses Skript verwendet statt der EnableDNS()-Methodedie Methoden SetDNSDomain() und SetDNSServerSearchOrder() der Klasse Win32_NetworkAdapterConfiguration. Für EnableDNS() sind zwei weitere optionale Parameter erforderlich, die leer bleiben könnten; die beiden anderen Methoden legen die für dieses Beispiel benötigten Parameter exakt fest. Bei Bedarf könnten Sie das Skript problemlos erweitern, um auch die Einstellungen für die dynamische Registrierung der Hosts mithilfe der SetDynamicDNSRegistration()-Methode zu konfigurieren.

Denken Sie daran, dass bei einem Vorgang wie dem hier beschriebenen das Konfigurieren des Clients nur einen Teil der Aufgabe darstellt: Darüber hinaus müssen Sie die entsprechenden Änderungen auf den DNS-Servern vornehmen. Die Beschreibung der Skripterstellung für DNS-Server würde den Rahmen dieses Dokumentes jedoch überschreiten.

Schritte zur Skripterstellung

caution.gif Vorsicht
Dieses Skript nimmt möglicherweise Änderungen an der Computerkonfiguration vor. Führen Sie es deshalb nur auf einem Testcomputer aus, und notieren Sie sich vor der Skriptausführung die davon betroffenen Einstellungen.

Das Skript in Listing 38 verwendet eine Textdatei als Eingabe. Sie müssen diese Datei vor Ausführung des Skripts erstellen. Der Pfad zur Datei wird in einer Variablen angegeben; in diesem Beispiel lautet er C:\Scripts\Hosts.txt. Jede Zeile der Textdatei enthält einen Hostnamen und einen neuen Domänennamen, die durch ein Komma getrennt werden (Leerzeichen zwischen den Namen sind nicht zulässig). Die letzte Zeile in der Datei darf NICHT mit einem Eingabezeichen abgeschlossen werden, weil dann die folgende Zeile vom Skript als leerer Eintrag gelesen würde.

client1,hr
client2,it
server1,ac

Das Skript weist jedem Host den neuen Domänennamen und eine neue Suchreihenfolge für DNS-Server zu. Die neue Reihenfolge hängt von dem neuen Domänennamen ab: Jede Unterdomäne verfügt über einen eigenen primären DNS-Server, der als Sicherung für die anderen beiden Unterdomänen dient.

Das Skript erstellt eine CSV-Textdatei und protokolliert darin die Ergebnisse dieser Vorgänge. Der Pfad zur Datei wird in einer Variablen angegeben; in diesem Fall lautet er C:\Scripts\Newhosts.csv.

1.

Definieren Sie die notwendigen Konstanten für das Objekt FileSystemObject.

2.

Erstellen Sie Variablen zur Angabe der Pfade zu den Ein- und Ausgabedateien.

3.

Erstellen Sie Variablen zur Angabe des Namens der Domäne der obersten Ebene.

4.

Erstellen Sie drei Arrays von Zeichenfolgen mit der jeweiligen Suchreihenfolge für DNS-Server für jede Unterdomäne.

5.

Erstellen Sie ein FileSystemObject-Objekt, und verwenden Sie es zum Öffnen der Datei und zum Einlesen des Inhalts in eine Zeichenfolge.

6.

Rufen Sie die GetInput-Funktion auf, und übergeben Sie ihr den Namen der Eingabetextdatei. Die Funktion liest den Inhalt der Eingabedatei und gibt ihn als Zeichenfolge zurück.

7.

Verwenden Sie die VBScript-Funktion Split mit der VbCrLf-Konstante als Trennzeichen. um die Zeichenfolge aus der Eingabedatei in ein Array aufzuteilen, bei dem jedes Element aus einer Zeile der Textdatei besteht. Diese muss den Namen eines Computers und einer Unterdomäne enthalten.

8.

Überprüfen Sie, ob die angegebene Ausgabedatei vorhanden ist. Wenn dies zutrifft, öffnen Sie sie zum Anhängen. Andernfalls müssen Sie sie erstellen und zum Schreiben öffnen.

9.

Führen Sie eine Iteration durch jedes Arrayelement durch, das durch Aufteilen der Eingabedateizeilen zurückgegeben wurde.

10.

Verwenden Sie Split erneut, und teilen Sie jedes Element des Arrays beim Komma. Dabei wird der Hostname in eine Variable und der Name der Unterdomäne in eine andere Variable eingelesen.

11.

Verketten Sie den Namen der Unterdomäne mit dem Namen der Domäne der obersten Ebene, um den vollständigen Domänennamen zu erhalten.

12.

Zeigen Sie den Hostnamen an.

13.

Rufen Sie die PingClient-Funktion auf, und übergeben Sie ihr den Hostnamen.

14.

Wenn die Funktion eine Antwort empfängt, stellen Sie eine Verbindung zum WMI-Dienst her, und fangen Sie einen Fehler auf.

15.

Wenn beim Herstellen der Verbindung mit WMI kein Fehler auftritt, fragen Sie den WMI-Dienst nach der Auflistung aller IP-Netzwerkadapter ab.

16.

Rufen Sie die Unterroutine GetSettings auf, um aktuelle DNS-Einstellungen anzuzeigen und in die Ausgabedatei zu schreiben.

17.

Rufen Sie die ChangeDNS-Funktion auf. Diese nimmt die in der Eingabedatei angegebenen Änderungen an der Domäne und der DNS-Suchreihenfolge vor und protokolliert die Ergebnisse in der Ausgabedatei.

18.

Rufen Sie die Unterroutine GetSettings erneut auf, um die geänderten DNS-Einstellungen anzuzeigen und in die Ausgabedatei zu schreiben.

19.

Wenn beim Herstellen einer Verbindung mit WMI ein Fehler aufgetreten ist, zeigen Sie eine Fehlermeldung an.

20.

Wenn auf die Ping-Anforderung nicht reagiert wird, zeigen Sie eine Fehlermeldung an.

21.

Die GetInput-Funktion verwendet eine Zeichenfolge mit dem Namen der Eingabetextdatei als Parameter. Die Funktion gibt eine Zeichenfolge mit dem Text der Eingabedatei zurück. Wenn die Datei leer oder nicht zu finden ist, zeigt die Funktion eine Fehlermeldung an und beendet das Skript.

22.

Die PingClient-Funktion verwendet eine Zeichenfolge mit dem Namen eines Hostcomputers als Parameter. Die Funktion gibt True zurück, wenn auf die Ping-Anforderung reagiert wird; andernfalls gibt sie False zurück.

23.

Die Unterroutine GetSettings zeigt für jeden Netzwerkadapter die Indexnummer, Beschreibung, DNS-Domäne, Suchreihenfolge für DNS-Server, IP-Adressen und Subnetzmasken an.

24.

Die Unterroutine ChangeDNS wählt eine Suchreihenfolge für DNS-Server auf der Grundlage der Unterdomäne aus, die für den Host in der Eingabedatei angegeben wurde. Wenn es sich bei der Unterdomäne um eine der in der Logik der Select Case-Anweisung enthaltenen Unterdomänen handelt, versucht sie, die SetDNSDomain-Methode mit dem Namen der neuen Domäne aufzurufen. Wenn diese Methode erfolgreich ist, versucht die Unterroutine anschließend, die SetDNSServerSearchOrder-Methode mit der ausgewählten Suchreihenfolge für DNS-Server aufzurufen. Die Unterroutine protokolliert die Ergebnisse und eventuelle Fehler in der Ausgabedatei.

Listing 38 Dns-move.vbs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
On Error Resume Next

 ' Constants for FileSystemObject
Const FOR_READING = 1
Const FOR_WRITING = 2
Const FOR_APPENDING = 8

 ' Paths to input and output files. Input file must be text file with name
' of accessible machine, comma, and valid domain name on each line.
strFileInput = "c:\scripts\hosts.txt"
strFileOutput = "c:\scripts\newhosts.csv"

 ' Domain name and DNS servers corresponding to subdomains
strTopDomain = "fabrikam.com"
arrDNSSrv1 = Array("192.168.0.1", "192.168.0.2", "192.168.0.3") 'hr
arrDNSSrv2 = Array("192.168.0.2", "192.168.0.3", "192.168.0.1") 'it
arrDNSSrv3 = Array("192.168.0.3", "192.168.0.1", "192.168.0.2") 'ac

 ' Create a Script Runtime FileSystemObject.
Set objFSO = CreateObject("Scripting.FileSystemObject")

 ' If the input file exists, dump contents of input file into a string.
strInput = GetInput(strFileInput)

 ' Get computer info by breaking input stream into array at line breaks.
arrHosts = Split(strInput, VbCrLf)

 ' Check to see if the output file exists. If so, open it for appending.
' If not, create it and open it for writing.

 If objFSO.FileExists(strFileOutput) Then
  Set objOutputFile = objFSO.OpenTextFile (strFileOutput, FOR_APPENDING)
Else
  Set objOutputFile = objFSO.CreateTextFile(strFileOutput)
End If
If Err <> 0 Then
  Wscript.Echo "Unable to open " & strFileOutput & " for output."
  WScript.Quit
End If

 ' Write header for file.
objOutputFile.WriteLine "Inventory of computers moved to new domains." & _
 VbCrLf  & "Taken " & Now & VbCrLf & VbCrLf & String(120, "-") & VbCrLf

 For Each strHost In arrHosts

 ' Get names and domains by breaking each computer info array at commas.
  arrComputers = Split(strHost, ",")
  strComputer = arrComputers(0)
  strSubDomain = arrComputers(1)
  strDomain = strSubDomain & "." & strTopDomain
  WScript.Echo VbCrLf & "Host: " & strComputer & VbCrLf

 ' Ping remote computer. If no response display error message and end script
  blnPingSuccess = PingClient(strComputer)
  If blnPingSuccess = True Then

 ' Connect to the WMI service.
    Set objWMIService = GetObject("winmgmts:" _
     & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

     If Err = 0 Then

 ' Write header for each computer.
      objOutputFile.WriteLine "Host:,," & strComputer & VbCrLf & VbCrLf & _
       ", Settings before operations:" & VbCrLf

 ' Get current settings and write to output file.
      GetSettings
      objOutputFile.WriteLine VbCrLf & "," & String(60, "-")

 ' Change domain and DNS search order.
      ChangeDNS

 ' Get settings after changes and write to output file.
      objOutputFile.WriteLine VbCrLf & "," & String(60, "-") & VbCrLf & _
       VbCrLf & ",Settings after operations:" & VbCrLf
      GetSettings
      objOutputFile.WriteLine VbCrLf & String(120, "-") & VbCrLf

     Else

       objOutputFile.WriteLine "Host: " & strComputer & VbCrLf _
       & VbCrLf & "Error connecting to WMI service." & VbCrLf & _
       "Error Number: " & Err.Number & VbCrLf & _
       "Error Source: " & Err.Source & VbCrLf & _
       "Error Description: " & Err.Description & VbCrLf & VbCrLf & _
       String(120, "-") & VbCrLf
      Err.Clear

     End If

   Else

     objOutputFile.WriteLine "Host: " & strComputer & VbCrLf _
     & VbCrLf & ",Unable to connect." & VbCrLf & VbCrLf & _
     String(120, "-") & VbCrLf

   End If

 Next

 ' Write footer for file and close.
objOutputFile.WriteLine String(64, "=") & VbCrLf
objOutputFile.Close

 WScript.Echo "Inventory complete. Data written to " & strFileOutput & "."

 '************************************************************************

 Function GetInput(strFileInput)

 ' Check to see if the input file exists.
' If so, dump contents of input file into a string.

 If objFSO.FileExists(strFileInput) Then
  Set objInputFile = objFSO.GetFile(strFileInput)
  If objInputFile.Size > 0 Then
    Set objInputFile = objFSO.OpenTextFile(strFileInput, FOR_READING)
    strInputStream = objInputFile.ReadAll
    objInputFile.Close
    GetInput = strInputStream
  Else
    Wscript.Echo strFileInput & " is empty."
    WScript.Quit
  End If
Else
  WScript.Echo strFileInput & " does not exist on this computer."
  WScript.Quit
End If

 End Function

 '************************************************************************

 Function PingClient(strComputer)

 Set objShell = CreateObject("WScript.Shell")
Set objExec = objShell.Exec("ping -n 2 -w 1000 " & strComputer)
strPingResults = LCase(objExec.StdOut.ReadAll)
If InStr(strPingResults, "reply from") Then
  PingClient = True
Else
  PingClient = False
End If

 End Function

 '************************************************************************

 Sub GetSettings

 Set colCompSystems = objWMIService.ExecQuery _
("SELECT * FROM Win32_ComputerSystem")

 For Each objCompSystem in colCompSystems
  objOutputFile.WriteLine VbCrLf & ",Domain:,," & objCompSystem.Domain
Next

 Set colNicConfigs = objWMIService.ExecQuery("SELECT " & _
 "* FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True")

 For Each objNicConfig In colNicConfigs
  objOutputFile.WriteLine VbCrLf & ",Network Adapter " & _
   objNicConfig.Index & VbCrLf & _
   ",," & objNicConfig.Description & VbCrLf & _
   ",,DNS Domain:,," & objNicConfig.DNSDomain
  strRow = ",,DNS Server Search Order:,,"
  If Not IsNull(objNicConfig.DNSServerSearchOrder) Then
    For Each strDNSServer In objNicConfig.DNSServerSearchOrder
      strRow = strRow & strDNSServer & ",,"
    Next
  End If
  objOutputFile.WriteLine strRow
  strRow = ",,IP Addresses:,,"
  If Not IsNull(objNicConfig.IPAddress) Then
    For Each strIPAddress In objNicConfig.IPAddress
      strRow = strRow & strIPAddress & ",,"
    Next
  End If
  objOutputFile.WriteLine strRow
  strRow = ",,Subnet Masks:,,"
  If Not IsNull(objNicConfig.IPSubnet) Then
    For Each strIPSubnet In objNicConfig.IPSubnet
      strRow = strRow & strIPSubnet & ",,"
    Next
  End If
  objOutputFile.WriteLine strRow
Next

 End Sub

 '************************************************************************

 Sub ChangeDNS

 Set colNicConfigs = objWMIService.ExecQuery("SELECT " & _
 "* FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True")

 ' Test that child domain from input file is valid.
errSubDomain = False
Select Case strSubDomain
  Case "hr" arrDNSServers = arrDNSSrv1
  Case "it" arrDNSServers = arrDNSSrv2
  Case "ac" arrDNSServers = arrDNSSrv3
  Case Else errSubDomain = True
End Select

 If errSubDomain = False Then
  For Each objNicConfig In colNicConfigs
    objOutputFile.WriteLine VbCrLf & ",Network Adapter " & _
     objNicConfig.Index & VbCrLf & _
     ",," & objNicConfig.Description & VbCrLf & VbCrLf & _
     ",,Attempting to make changes in DNS configuration ..."
    intDomain = objNicConfig.SetDNSDomain(strDomain)
    If intDomain = 0 Then
      objOutputFile.WriteLine ",,Assigned new domain."
      intServers = objNicConfig.SetDNSServerSearchOrder _
       (arrDNSServers)
      If intServers = 0 Then
        objOutputFile.WriteLine ",,Assigned new DNS server " & _
         "search order."
      Else
        objOutputFile.WriteLine ",,Unable to assign new DNS " & _
         "server search order."
      End If
    Else
      objOutputFile.WriteLine ",,Unable to assign new domain or " & _
       "DNS server search order."
    End If
  Next
Else
  objOutputFile.WriteLine "Subdomain" & strSubDomain & _
  "could not be found."
End If

 End Sub

Wenn Sie Cscript.exe zur Ausführung dieses Skripts verwenden, wird die Ausgabe in der CSV-Textdatei C:\Scripts\Newhosts.csv angezeigt. Bei Ausführung des Skripts wird auf dem Bildschirm eine ähnliche Ausgabe wie die folgende angezeigt.

C:\scripts>dns-move.vbs

Host: client1

Host: client2

Host: server1

Inventory complete. Data written to c:\scripts\newhosts.csv.

Tools zur Skripterstellung für DNS auf Clients

In Tabelle 17 werden die verfügbaren Windows-Tools zur Skripterstellung für DNS auf Clients aufgeführt.

Tabelle 17 Tools zur Skripterstellung für DNS auf Clients

TechnologieToolRessource

Befehlszeilentools

Dnscmd.exe: Problembehandlungstool für DNS-Server

Windows Server 2003-Supporttools

Befehlszeilentools

Dnslint.exe

Windows Server 2003-Supporttools

Befehlszeilentools

DNSRECORD.PL

Windows 2000 Resource Kit

Befehlszeilentools

DNSSERVER.PL

Windows 2000 Resource Kit

Befehlszeilentools

DNSZONES.PL

Windows 2000 Resource Kit

Befehlszeilentools

NETDNSCONFIG.PL

Windows 2000 Resource Kit

Befehlszeilentools

Netsh.exe

Windows-Betriebssysteme1

Befehlszeilentools

Nslookup.exe

Windows-Betriebssysteme

WSH

Keines

 

WMI

Win32_ComputerSystem

 

WMI

Win32_OperatingSystem

 

WMI

Win32_NetworkAdapterConfiguration

 

WMI

Win32_NTDomain

Nur Windows XP und Windows Server 2003

1Windows 2000, Windows XP und Windows Server 2003. Können auch in anderen Windows-Versionen vorhanden sein.

In Tabelle 18 sind die verfügbaren Registrierungsunterschlüssel zur Skripterstellung für DNS auf Clients aufgeführt.

caution.gif Vorsicht
Durch eine fehlerhafte Bearbeitung der Registrierung kann ernsthafter Schaden am System verursacht werden. Bevor Sie Änderungen an der Registrierung vornehmen, sollten Sie eine Sicherungskopie aller wichtigen Daten auf dem Computer erstellen.

Tabelle 18 Registrierungsunterschlüssel zur Skripterstellung für DNS auf Clients

Registrierungsunterschlüssel

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
\ {AdapterIdentifier}

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache


**
**