WinFuture-Forum.de: PowerShell Scipt - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

PowerShell Scipt


#1 Mitglied ist offline   GeneralAnzeiger 

  • Gruppe: Mitglieder
  • Beiträge: 18
  • Beigetreten: 22. April 14
  • Reputation: 0

geschrieben 22. Oktober 2014 - 20:06

Hallo zusammen,

ich mache zur Zeit ein Praktikum und soll ca. 600 Rechner auf ihre Existenz kontrollieren. Da ich es mir leicht machen wollte :rolleyes: hab ich an ein PowerShell Script gedacht. In diesem Bereich bin ich aber noch nicht so erfahren, trotzdem präsentiere ich mal meine Ergebnisse und bitte euch um weiteren Rat.

Mit diesem Script pinge ich alle Rechner an und lass mir die jenigen, die nicht antworten, in einer .txt Datei (pingdisable auf dem Desktop ausgeben. Die Adressen der Rechner liegen auch in einer .txt Datei (test.txt) auf dem Desktop.

Zitat

gc C:\Users\...\Desktop\test.txt |?{ (gwmi Win32_PingStatus -Filter "Address='$_'").StatusCode -ne 0 } | out-file C:\Users\...\Desktop\pingdisable.txt


Den Gedanken fand ich erstmal genial, aber leider befinden sich alle Daten in einer .xlsx Datei. Also müsste ich trotzdem die ausgegebene Liste (pingdisable.txt) erstmal mit der Tabelle vergleichen, um die Standorte direkt auszulesen.
In der zweiten Spalte stehen die Adressen, daher müsste es doch möglich sein die Tabelle auszulesen und auszugeben. Dann müssten nur noch die Adressen, die keine Antwort beim anpingen gegeben haben, rot gefärbt werden.
Der Plan ist zwar in meinem Kopf, aber das Umsetzen bereitet mir Probleme..

Wenn ihr Tipps für die Umsetzung habt wäre ich euch sehr dankbar!

Dieser Beitrag wurde von GeneralAnzeiger bearbeitet: 22. Oktober 2014 - 20:11

0

Anzeige



#2 Mitglied ist offline   Decay 

  • Gruppe: aktive Mitglieder
  • Beiträge: 884
  • Beigetreten: 09. Juni 04
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 22. Oktober 2014 - 21:21

wieso nutzt du nicht "net view"?
Dabei werden alle Rechner angezeigt, die aktiv sind.

Leitest du die Ausgabe noch in einer TXT-Datei um, dann hast du doch alles, was du möchtest ^^ :D

Beispiel:
net view > C:\foobaa.txt
0

#3 Mitglied ist offline   GeneralAnzeiger 

  • Gruppe: Mitglieder
  • Beiträge: 18
  • Beigetreten: 22. April 14
  • Reputation: 0

geschrieben 22. Oktober 2014 - 21:32

net view kannte ich noch nicht, ist es denn damit möglich die komplette Zeile aus der .xlsx Tabelle auszugeben, damit ich auch direkt die Standorte angeben kann?

Dieser Beitrag wurde von GeneralAnzeiger bearbeitet: 22. Oktober 2014 - 21:37

0

#4 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 22. Oktober 2014 - 21:36

Wenn Du die Tabelle als CSV exportieren kannst, gibt's in der PowerShell *-CSV cmdlets (Import, Export, ConvertFrom, ConvertTo). Damit kriegst Du die Zellen aus der CSV-Datei ins Powershell-Script.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#5 Mitglied ist offline   Decay 

  • Gruppe: aktive Mitglieder
  • Beiträge: 884
  • Beigetreten: 09. Juni 04
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 22. Oktober 2014 - 22:17

Beitrag anzeigenZitat (GeneralAnzeiger: 22. Oktober 2014 - 21:32)

net view kannte ich noch nicht, ist es denn damit möglich die komplette Zeile aus der .xlsx Tabelle auszugeben, damit ich auch direkt die Standorte angeben kann?


net view zeigt dir lediglich die Rechner an, die gerade in deinem Subnet aktiv sind.
Aber du magst ja alle Rechner auf Aktivität und Nicht-Aktivität prüfen.

Von daher:
Vergiß meine Aussage zu net view :-)
0

#6 Mitglied ist offline   lingo 

  • Gruppe: aktive Mitglieder
  • Beiträge: 151
  • Beigetreten: 11. Oktober 11
  • Reputation: 7

geschrieben 23. Oktober 2014 - 07:41

Hallo,

ich habe hier ein Script (ist leider nicht von mir persönlich) welches die AD ausließt und anschließend eine TXT erstellt.

die txt heißt: WerBenutztWelchenPC.txt

Vorraussetzung: Script muss als Domänenadmin ausgeführt werden und die Clients müssen RPC offen haben

Die ausgabe schaut wie folgt aus:
Liste aller Domänen-Computer und deren angemeldeten Benutzer:
DC1: Fehler bei Abfrage
.
.
.
MUC-455: ist offline
.
.
.
SCAN-2: Benutzer: [i]Domäne\username[/i] Beschreibung: [i]Beschreibung lt. AD[/i]
.
.
.
offline Computer: X
Computer mit Fehlern: X



Fehler bei der Abfrage: Entweder kein RPC offen oder mehrere User angemeldet oder aktuell kein User angemeldet
ist offline: Computerkonto ist in AD vorhanden aber aktuell ausgeschaltet

Die Punkte habe ich gemacht, damit die Ausgabe hier übersichtlich bleibt, da es nur 3 Verschiedene Ergebnisse gibt.

ist zwar kein Powershell, sondern ein vbs aber evtl würde es ja helfen schreib mir dann eine PN ;)

Grüße
Lingo
Aktuelles System:
Prozessor: AMD Phenom FX 8350
RAM: 2x 8GB GEIL (1600 MHz)
Board: ASUS CROSSHAIR V FORMULA-Z
Grafik: ASUS ROG MATRIX-R9290X-P-4GD5
Soundkarte: ASUS ROG Xonar Phoebus
Netzteil: BeQuiet Dark Power 750W 80+ Gold
Gehäuse: BitFinex Ghost
Eingabe: Logitech G19, Logitech G700, XBox 360 Wireless Controller
Sound: Logitech Z-5500, Logitech G930
0

#7 Mitglied ist offline   dale 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.210
  • Beigetreten: 15. Februar 08
  • Reputation: 64

geschrieben 23. Oktober 2014 - 08:54

Frage wie kontrolliert man dann die 100 Pc´s die aus sind?

Ich würde eher nach einem Weg suchen die AD in den nächsten 10 Tagen zu scannen um so viele Rechner wie möglich zu finden z.B. die NT-Tools von Dameware konnten das früher immer gut.
0

#8 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 23. Oktober 2014 - 10:41

Da bin ich ja mal gespannt, ob "der Praktikant" sein Script im Kontext eines Domainadministrators ausgeführt kriegt. :)

Gibt viele Möglichkeiten, sich seine Clients aus dem Netz selber zusammenzusuchen, aber ohne zu wissen, WAS das für Clients sind (und wie die vernetzt sind) wird es schwierig, da Hinweise zu geben.


Halte es bei solchen Sachen immer für sinnvoller, die "Abfrage"logik in eine "Auskunfts"logik umzudrehen und die Clients selber "Hallo" sagen zu lassen. Dann muß man nur schauen, daß man ein entsprechendes "Hallo-Welt" Script auf sämtliche Clients ausgerollt kriegt.

Wenn dieses "Hallo Welt" Script dann beispielsweise periodisch oder eventgesteuert oder sonstwie ausgelöst (un)regelmäßig auf sagen wir einen definierten Webserver zugreift (sagen wir
GET http://ping.mydomain.com/status.asp?timestamp=TIMESTAMP HTTP/1.1
) dann finden sich im Protokoll dieses Webservers schon alle benötigten Daten, da muß man nicht mal groß ein serverseitiges Script dazubauen (kann man aber natürlich machen).

Dieser Beitrag wurde von RalphS bearbeitet: 23. Oktober 2014 - 10:42

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#9 Mitglied ist offline   Decay 

  • Gruppe: aktive Mitglieder
  • Beiträge: 884
  • Beigetreten: 09. Juni 04
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 23. Oktober 2014 - 11:02

Beitrag anzeigenZitat (RalphS: 23. Oktober 2014 - 10:41)

Halte es bei solchen Sachen immer für sinnvoller, die "Abfrage"logik in eine "Auskunfts"logik umzudrehen und die Clients selber "Hallo" sagen zu lassen. Dann muß man nur schauen, daß man ein entsprechendes "Hallo-Welt" Script auf sämtliche Clients ausgerollt kriegt.


Bei 600 Rechnern wird ein AD sicherlich dabei sein... so ist die Auskunft sicherlich schon in der AD gegeben.^^
Mit dsquery sollte man da aktive und inaktive Computer finden können :)

Edit:
dsquery ist nur auf Server aktiv, die die AD DS Rolle inne haben ^^

Dieser Beitrag wurde von Decay bearbeitet: 23. Oktober 2014 - 11:10

0

#10 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 23. Oktober 2014 - 11:26

Es soll auch nicht-Windows-basierte Infrastrukturen geben, hab ich gehört. :lol:

Eine Arbeitsgruppe wirds hoffentlich nicht sein, soweit geh ich mit. Aber man kann als Praktikant nicht erwarten, Zugriffsrechte > Domain Users@... zu bekommen.

dsquery benötigt allerdings keine ADDS-Serverrolle, nur die entsprechenden RSAT-Tools dazu. Die kann man auch auf Clients nachinstallieren - das entsprechende .msu Paket dazu gibt es im Microsoft Downloadcenter.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#11 Mitglied ist offline   Decay 

  • Gruppe: aktive Mitglieder
  • Beiträge: 884
  • Beigetreten: 09. Juni 04
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 23. Oktober 2014 - 11:58

Cool, wieder etwas, was Microsoft nicht unbedingt publiziert, wenn man nicht explizit danach sucht ^^
Denn lt. Microsoft soll dies nur möglich sein, wenn ADDS aktiv auf dem Server vorgehalten wird ^^

Okay, dann sollte man auf allgemeine Queries setzen, die lediglich LDAP auslesen
In etwa so für vb.net:

Dim objRootDSE As New DirectoryEntry("LDAP://RootDSE") 
Dim strADsPath As String 
Dim netpcs As ArrayList 
Dim i As Integer 

        Try 

            strADsPath = "LDAP://" + objRootDSE.Properties("defaultNamingContext").Value.ToString 

        Catch ex As Exception 

            MsgBox(ex.Message) 

        End Try 

        Dim netpcs As ArrayList = GetDomainHosts(strADsPath) 

        Do 

            ListBox1.Items.Add(netpcs.Item(i).ToString) 

            i += 1 

        Loop Until i = netpcs.Count 

        i = 0



und

 Function GetDomainHosts(ByVal LDAPDir As String, Optional ByVal RegexHost As String = "") As ArrayList 

        Dim pc As New ArrayList 

        Dim root As New DirectoryServices.DirectoryEntry(LDAPDir) 

        Dim searcher As New DirectoryServices.DirectorySearcher(root) 

        searcher.Filter = "(objectClass=computer)" 

        searcher.SearchScope = DirectoryServices.SearchScope.Subtree 

        searcher.Sort = New DirectoryServices.SortOption("displayName", DirectoryServices.SortDirection.Descending) 

        Dim results As DirectoryServices.SearchResultCollection = searcher.FindAll() 

        Dim pcname As String = "" 

        For Each computer As DirectoryServices.SearchResult In results 

            pcname = computer.GetDirectoryEntry().Properties("displayName").Value 

            If Not pcname = Nothing Then 

                pcname = pcname.Replace("$", "").ToLower 

                If RegexMatchingHost(pcname, RegexHost) Then 

                    pc.Add(pcname) 

                End If 

            End If 

        Next 

        Return pc 

    End Function


0

#12 Mitglied ist offline   GeneralAnzeiger 

  • Gruppe: Mitglieder
  • Beiträge: 18
  • Beigetreten: 22. April 14
  • Reputation: 0

geschrieben 23. Oktober 2014 - 16:21

Wie RalphS vorgeschlagen hatte, wollte ich es mit der Methode probieren, in der ich die csv exportiere. Langsam bin ich am verzweifeln, den ganzen Tag habe ich versucht Scripts zu basteln, anscheinend braucht es doch mehr Wissen als ich besitze. Selbst mit einem halbwegs vorgefertigten Script erreiche ich nicht das gewünschte Ergebnis.
Das Netz bietet normal ja eine Menge Scripts, aber irgendwie bin ich zu blöd um da ein anständiges zu finden. Selber ein Script zu entwerfen habe ich inzwischen schon aufgegeben.. Trotzdem vielen Dank für die vielen Tipps und Anregungen!!
Der Schnelleinstieg war eine gute Idee aber eine schlechte Umsetzung von mir. Daher freue ich mich, wenn jemand Seiten kennt, die vorallem Informationen in bezug auf csv + PowerShell enthalten. Dann kann ich mich die nächsten Wochen erstmal einlesen :blush:

Dieser Beitrag wurde von GeneralAnzeiger bearbeitet: 23. Oktober 2014 - 16:22

0

#13 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 23. Oktober 2014 - 16:44

Wenn Du CSV in PowerShell via Import-CSV importierst, bekommst Du eine "ganz normale" PS-Struktur. Die erste Zeile sind die Spaltenbezeichner(*), und die einzelnen Zeilen ab der zweiten sind dann die PS-Objekte, wo man mit For-Each rankommt.

PS C:\Users\Ralph> Get-Content -Path .\test.csv
Rechner_DNSName,Rechner_IP
Server1,192.168.0.2
Server2,192.168.0.3
Client1,192.168.0.10
Client2,192.168.0.11
ETC,ETC

PS C:\Users\Ralph> Import-Csv -Path .\test.csv

Rechner_DNSName                                             Rechner_IP
---------------                                             ----------
Server1                                                     192.168.0.2
Server2                                                     192.168.0.3
Client1                                                     192.168.0.10
Client2                                                     192.168.0.11
ETC                                                         ETC


PS C:\Users\Ralph> import-Csv -Path .\test.csv | ForEach-Object {Write-Output $_.Rechner_IP}
192.168.0.2
192.168.0.3
192.168.0.10
192.168.0.11
ETC
PS C:\Users\Ralph>



Mehr ist das gar nicht. Du hast halt gleich die strukturierten Daten zur Verfügung und mußt sie Dir nicht umständlich irgendwie "händisch" (oder "skriptisch") beschaffen.

===
(*) Du kannst sie aber auch mit dem -Header Parameter selber setzen. -Header kriegt eine Liste aus Identifikatoren, eine pro Spalte (in diesem Fall also bspw -Header Spalte_A,Spalte_B).

Dieser Beitrag wurde von RalphS bearbeitet: 23. Oktober 2014 - 16:50

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#14 Mitglied ist offline   Decay 

  • Gruppe: aktive Mitglieder
  • Beiträge: 884
  • Beigetreten: 09. Juni 04
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 23. Oktober 2014 - 16:50

Was wir dir halt nur mit auf dem Weg geben wollten, ist, ob es sinnvoll ist, ein Powershell-Script zu benutzen und ob es nicht andere Wege gibt, festzustellen, ob Rechner im Netzwerk aktiv sind.
Bei 600 Rechnern kann es eine halbe Ewigkeit dauern, die alle erstmal anzupingen. *sighs*
Ein Ping wird 4 mal vollzogen, also etwa 4 Sekunden. Das bei 600 Rechnern sollte so in etwa 35-40 Minuten sein.

Mit einem dsquery (sofern ADDS vorhanden) könntest du sehen, welche Rechner inaktiv sind (auch für längere Zeit).
Mit einem Ping bekommst du halt nur einen Moment-Zustand, der sich schnell ändern kann.
0

#15 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 23. Oktober 2014 - 17:10

Man kann so eine Ping-Abfrage auch abkürzen, indem man eine kleiner Anzahl Anfragen auswählt -- unter Windows mit -n COUNT, unter Linux sollte es -c COUNT sein.

WO GENAU jetzt die Server herkommen... mh. :unsure: Ich denke, dem TO ist schonmal eher geholfen, wenn er was gebastelt kriegt, was liefert, was verlangt wird. :)

Die obligatorischen bells+whistles kann man dann später dranhängen, und momentan GIBT es ja erstmal eine Liste.


Allerdings kommt es halt immer noch insbesondere darauf an, worum - um es mal blöd zu formulieren - es überhaupt geht. Was GENAU soll erreicht werden - was möchte ich mir aus der Antwort "ein Rechner existiert (nicht)" ableiten können? Denn es ist durchaus möglich, daß es für das KONKRETE Problem andere, besser geeignete Ansätze gibt - wie zB eine Abfrage übers ActiveDirectory (soweit vorhanden) oder auch ganz anders.

Dieser Beitrag wurde von RalphS bearbeitet: 23. Oktober 2014 - 17:11

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0