Acties:
  • 0 Henk 'm!

  • Dhr_Soulslayer
  • Registratie: Januari 2008
  • Laatst online: 02-09 15:51
Tweakers,

Even een complex vraagstuk.
Ik heb hier enkele servers staan in een domein.
Nu wil ik vanaf 1 server een script/commando/programma uitvoeren om per server de grootte van vooraf gespecificeerde mappen op vragen. Daarna wil ik die data in een acces database zetten.

Zelf heb ik al zitten klooien met powershell alleen de output krijg ik niet lekker.

Wie kan mij hierin ondersteunen?

Danku danku

Acties:
  • 0 Henk 'm!

  • Question Mark
  • Registratie: Mei 2003
  • Laatst online: 12-09 14:40

Question Mark

Moderator SSC/WOS

F7 - Nee - Ja

Post je Powershell script eens, en leg eens uit waar je precies tegenaan loopt?

MCSE NT4/2K/2K3, MCTS, MCITP, CCA, CCEA, CCEE, CCIA, CCNA, CCDA, CCNP, CCDP, VCP, CEH + zwemdiploma A & B


Acties:
  • 0 Henk 'm!

  • Dhr_Soulslayer
  • Registratie: Januari 2008
  • Laatst online: 02-09 15:51
Op dit moment heb ik het volgende script:

$startfolder = "C:\"
$colItems = (Get-ChildItem $startfolder -recurse | Measure-Object -property length -sum)
"$startfolder -- {0:N2}" -f ($colItems.sum / 1MB) + " MB"

Daar komt keurig uit:
C:\ -- 80.869,96 MB

Het script kan ik ook remote uitvoeren door bijvoorbeeld als startfolder \\SRV\C$ op te geven met de map die ik wil zoals \\SRV\C$\KLANT1

Dat kan ik uiteindelijk wel pipen naar een text file die ik weer kan importen in Acces.
Echter is het nu zo dat dit scriptje uitgevoerd moet gaan worden op plusminus 15 server waarbij op elke server een verschillende aantal mappen gecontroleerd moeten worden.

Om nou niet voor elke map een paar regels te maken zat ik te denken aan een For Each constructie waarbij de lijst met de te controleren mappen in een aparte txt file staat zodat die makkelijk aangepast kan worden mochten er mappen bij komen of afvallen.

[09:18 14-01-2015]
De for each contructie werkt met een rijtje variabelen. Alleen wordt dat wel een erg lange rij. Eens kijken of ik de variabeleren uit een file kan trekken

[ Voor 16% gewijzigd door Dhr_Soulslayer op 14-01-2015 09:18 ]


Acties:
  • 0 Henk 'm!

  • Question Mark
  • Registratie: Mei 2003
  • Laatst online: 12-09 14:40

Question Mark

Moderator SSC/WOS

F7 - Nee - Ja

Ik zou voor elke server een (remote) job afschieten die lokaal uitgevoerd wordt op de betreffende server.

Zie: http://technet.microsoft.com/en-us/library/hh849698.aspx

Dan draaien je commando's parallel op elke server, en niet meer seqentueel... Qua verwerkingstijd is dit een veel betere optie.

MCSE NT4/2K/2K3, MCTS, MCITP, CCA, CCEA, CCEE, CCIA, CCNA, CCDA, CCNP, CCDP, VCP, CEH + zwemdiploma A & B


Acties:
  • 0 Henk 'm!

  • Dhr_Soulslayer
  • Registratie: Januari 2008
  • Laatst online: 02-09 15:51
Ok dat heb ik nu uitgevonden hoe dat mogelijk is.
Via het invoke command alleen hoe schiet ik daar credentials in die onthouden blijven?

Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 23:43
Dhr_Soulslayer schreef op woensdag 14 januari 2015 @ 08:55:
Op dit moment heb ik het volgende script:

$startfolder = "C:\"
$colItems = (Get-ChildItem $startfolder -recurse | Measure-Object -property length -sum)
"$startfolder -- {0:N2}" -f ($colItems.sum / 1MB) + " MB"

Daar komt keurig uit:
C:\ -- 80.869,96 MB

Het script kan ik ook remote uitvoeren door bijvoorbeeld als startfolder \\SRV\C$ op te geven met de map die ik wil zoals \\SRV\C$\KLANT1

Dat kan ik uiteindelijk wel pipen naar een text file die ik weer kan importen in Acces.
Echter is het nu zo dat dit scriptje uitgevoerd moet gaan worden op plusminus 15 server waarbij op elke server een verschillende aantal mappen gecontroleerd moeten worden.

Om nou niet voor elke map een paar regels te maken zat ik te denken aan een For Each constructie waarbij de lijst met de te controleren mappen in een aparte txt file staat zodat die makkelijk aangepast kan worden mochten er mappen bij komen of afvallen.

[09:18 14-01-2015]
De for each contructie werkt met een rijtje variabelen. Alleen wordt dat wel een erg lange rij. Eens kijken of ik de variabeleren uit een file kan trekken
Hou er ook rekening mee dat je bij een remote commando (invoke-command bv) je niet zo 123 je "lokale" variables mee kunt nemen, deze zul je ook dmv switches mee moeten nemen.

(Ik kreeg hier laatst mee te maken tijdens het bouwen van een script).

Edit met antwoord op de laatste vraag : via de -credential switch zou je de credentials mee kunnen geven. Wel dien je deze in een variabele op te slaan met get-credential

Nog een edit met voorbeeld PS code welke ik in het verleden gebruikt heb om remote MSI's te "pushen" naar machines (1 van de eerst concepten van dit script van mij destijds dus let verder maar niet op fouten etc, hij werkt overigens wel :P) - het deel mbt remote sessies en arguments doorgeven is misschien bruikbaar voor jouw script) :

code:
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
## Script om een MSI te "pushen" naar een domein-machine
## Omdat je niet vanuit een remote-PS sessie een netwerkshare kan benaderen zonder security omlaag te gooien
## maak ik een scheduled job aan welke 60 seconden in de toekomst ligt

## Paar Vars declaren (deze moeten in de toekomst via een Excel sheet dynamisch gevoerd worden vanuit XLS / CSV) :
$ApplicationName = 'SilverLight'
$ApplicationDirectory = '\\dc.deploymentserver.local\NETLOGON\Silverlight_x64\'
$ApplicationFullPath = '\\dc.deploymentserver.local\NETLOGON\Silverlight_x64\silverlight.msi'
$ApplicationInstallFile = 'silverlight.msi'
$RemotePC = 'RefPC'

## Remote sessie aanmaken
$RemoteSession = New-PSSession -ComputerName $($RemotePC) -Name "$($RemotePC)-$($ApplicationName)"

## Invoke-Command sturen naar de remote sessie
Invoke-Command `
-Session $RemoteSession `
-ArgumentList ($ApplicationName,$ApplicationDirectory,$ApplicationFullPath,$ApplicationInstallFile) `
-ScriptBlock {
                ## Arguments van lokale PC naar remote PC re-binden
                $ApplicationName = $Args[0]
                $ApplicationDirectory = $Args[1]
                $ApplicationFullPath = $Args[2]
                $ApplicationInstallFile = $Args[3]

                ## Corrupte jobs opschonen op de remote host
                Get-ScheduledJob -ErrorAction SilentlyContinue | Out-Null

                ## Var om credentials te pakken voor de scheduled job ivm netwerk connectie naar share
                $credentials = Get-Credential

                ## Job trigger instellen - Get-Date om 60 seconden in de toekomst te plannen
                $Jobtrigger = New-JobTrigger -At $((Get-Date).AddSeconds(60)) -Once

                ## Job wel elevated draaien
                $JobOption = New-ScheduledJobOption -RunElevated

                ## Job registreren in task scheduler met het scriptblok voor de applicatie ; argumenten worden nog verder aangevuld
                ## Alleen de jobnaam is nu "dynamisch", naam pad etc moeten uiteindelijk uit een Excel sheet komen
                Register-ScheduledJob `
                -Credential $($credentials) `
                -Name "Install_$($ApplicationName)" `
                -ScheduledJobOption $JobOption `
                -Trigger $Jobtrigger `
                -ArgumentList ($ApplicationName,$ApplicationDirectory,$ApplicationFullPath,$ApplicationInstallFile) `
                -ScriptBlock {
                                $ApplicationName = $Args[0]
                                $ApplicationDirectory = $Args[1]
                                $ApplicationFullPath = $Args[2]
                                $ApplicationInstallFile = $Args[3]
                                $msix = "C:\Windows\System32\msiexec.exe"
                                Start-Process `
                                -FilePath $msix `
                                -ArgumentList "-i $($ApplicationFullPath) -q"  `
                                -WorkingDirectory "$($ApplicationDirectory)"
                                Unregister-ScheduledJob -Name "Install_$($ApplicationName)"
                               }
              }
## Opschonen van de PS sessie naar de remote machine
Remove-PSSession $RemoteSession

## De jobs worden nu nog niet opgeschoond ivm het controleren van de "status" (geen job = geen info).
## Dit wil ik nog afvangen door in ieder geval een event naar de applicatielog oid weg te schrijven en daarna alsnog de job te verwijderen

[ Voor 59% gewijzigd door Killah_Priest op 14-01-2015 10:00 . Reden: toevoegingen ]


Acties:
  • 0 Henk 'm!

  • Dhr_Soulslayer
  • Registratie: Januari 2008
  • Laatst online: 02-09 15:51
Bedankt voor de reactie. Ik heb nu onderstaand script alleen vraag ik mij af of deze simultaan of sequentieel wordt uitgevoerd?

$Username = 'Administrator'
$Password = '*********************************'
$pass = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass

Get-Content hosts.txt | ForEach-Object {

Invoke-Command -ComputerName $_ -ScriptBlock {
$klanten = @("C:\")
foreach ($klant in $klanten) {
$colItems = (Get-ChildItem $klant -recurse | Measure-Object -property length -sum)
"$klant {0:N2}" -f ($colItems.sum / 1MB) + " MB"
}

} -credential $Cred >> C:\Output.txt

}

De output komt wel netjes op mijn lokale C schijf te staan.

Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 23:43
Volgens mij wordt dit sequentieel uitgevoerd (foreach gevolgd door invoke-command ; volgens mij wordt er dus voor iedere "run" in de foreach loop gewacht op het voltooien van de vorige server).
Dmv jobs of dmv de -computername parameter van invoke-command te voorzien van meerdere computernamen (dus zonder foreach erin) zou het wel simultaan moeten gaan.


Zie ook http://stackoverflow.com/...put-result-as-they-arrive

[ Voor 16% gewijzigd door Killah_Priest op 14-01-2015 15:34 ]

Pagina: 1