Aanpassing in Powershell script

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Wylana
  • Registratie: April 2009
  • Laatst online: 12-09 17:43
Beste Tweakers,

Ik heb een powershell script gevonden om computers automatisch uit en weer in het domein te krijgen.
Echter in dit script wordt er gebruik gemaakt van een XML file voor de credentials.

Ik wil echter het script zo (laten) aanpassen dat het script altijd een popup geeft waarin ik eerst het computernaam opgeef, daarna het domein opgeef daarna het lokale administrator account en wachtwoord opgeef en daarna het domain administrator account en wachtwoord opgeef.
Deze gegevens moeten dan weer verder in het script gebruikt worden om de betreffende computer (die ik opgeef) die in het opgegeven domein zit te laten rejoinen in het domein.

Het script heb ik hier van daan: https://drive.google.com/...1YlpxU0U/view?usp=sharing

Wie oh Wie kan mij helpen dit script zodanig aan te passen zodat het naar mijn wens wordt.
Ik heb zelf geprobeerd het aan te passen, maar heb het niet voor elkaar gekregen. Mede doordat mijn kennis nog niet toereikend is zo een uitgebreid script :-(

[ Voor 4% gewijzigd door Wylana op 01-07-2015 10:26 ]

Ik ben steenrijk....ik heb een grindpad!


Acties:
  • 0 Henk 'm!

  • Meekoh
  • Registratie: April 2005
  • Laatst online: 12-09 11:51
Ik ga het script niet voor je aanpassen. Anders leer je zelf natuurlijk niets ;)
Zal wel de volgende hints geven:
Passwords opvragen met popup ->
code:
1
$credentials = Get-Credentials


Computernaam opvragen met popup ->
code:
1
2
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null
$Computername = [Microsoft.VisualBasic.Interaction]::InputBox("Enter a computer name", "Computer", "$env:computername")


Kun je het zelf in je script mergen, Succes d:)b

[ Voor 8% gewijzigd door Meekoh op 01-07-2015 10:57 ]

Computer says no


Acties:
  • 0 Henk 'm!

  • Wylana
  • Registratie: April 2009
  • Laatst online: 12-09 17:43
Het script heb ik al zover dat hij de computernaam en domain opvraagt en gebruikt.
Het gaat er bij mij alleen puur om dat ik het script zo wil hebben dat hij om de credentials vraagt en gebruikt.

Get-Credentials had ik ook gevonden, maar begrijp/snap nog niet heel goed hoe ik die moet verwerken in het script.

Ik ben steenrijk....ik heb een grindpad!


Acties:
  • 0 Henk 'm!

  • SirDarkAngel
  • Registratie: April 2005
  • Laatst online: 05-09 10:03
Nu haal je je credentials uit een XML file
code:
1
$DomainCredential = (New-Credential -XmlFilePath $DomainCredentialXmlFilePath)


met get-credential is het dit:

code:
1
$DomainCredential = get-credential


Vervolgens kan je deze variabel weer gebruiken in je script zoals je nu ook doet, zoals in onderstaande regel.

code:
1
Add-Computer -ComputerName $Computer -DomainName $DomainName -Credential $DomainCredential -LocalCredential $LocalCredential -Restart -Force

Wilde altijd al iets over computers weten


Acties:
  • 0 Henk 'm!

  • Meekoh
  • Registratie: April 2005
  • Laatst online: 12-09 11:51
Wat SirDarkAngel zegt.
Hetzelfde geld voor de computername.
Die wordt nu als Parameter aan het script zelf meegegeven, maar dat wil je dus niet.
code:
1
2
    [string[]]$Computername,
    [Parameter(Mandatory)]

Dat kun je dus weghalen.
Daarna zet je mijn stukje direct na
code:
1
begin {

Computer says no


Acties:
  • 0 Henk 'm!

  • Wylana
  • Registratie: April 2009
  • Laatst online: 12-09 17:43
Ik begrijp niet goed waarom hij de waarde (Computernaam) niet oppakt en verder verwerkt?
Want ik moet ook ergens nog het domein opgeven. Gaat dat met vrijwel dezelfde waarden dan?
Waar gaat het fout?

Ik heb precies zoals je zei de code van Meekoh geplakt na het stukje "begin {"

Ik heb nu:

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
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
begin {[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null

$computer = [Microsoft.VisualBasic.Interaction]::InputBox("Geef computernaam op", "Computer", "$env:computername")


    Function Test-Ping ($ComputerName) {

        $Result = ping $Computername -n 2

        if ($Result | where { $_ -match 'Reply from ' }) {

            $true

        } else {

            $false

        }

    }

    function Test-DomainTrust ($Computername) {

        $Result = netdom verify $Computername /Domain:$DomainName

        if ($Result -match 'command completed successfully') {

            $true

        } else {

            $false    

        }

    }

    function Wait-Reboot ($Computername,$Credential) {

        while (Test-Ping -ComputerName $Computername) {

            Write-Verbose "Waiting for $Computername to go offline..."

            Start-Sleep -Seconds 1

        }

        Write-Verbose "The computer $Computername has went down for a reboot. Waiting for it to come back up..."

        while (!(Test-Ping -ComputerName $Computername)) {

            Start-Sleep -Seconds 5

            Write-Verbose "Waiting for $Computername to come back online"

        }

        Write-Verbose "The computer $Computername has come online. Waiting for OS to initialize"

        $EapBefore = $ErrorActionPreference

        $ErrorActionPreference = [System.Management.Automation.ActionPreference]::SilentlyContinue

        while (!(Get-WmiObject -ComputerName $Computername -Class Win32_OperatingSystem -Credential $Credential)) {

            Start-Sleep -Seconds 5

            Write-Verbose "Waiting for OS to initialize..."

        }

        $ErrorActionPreference = $EapBefore

    }

}

process {

    foreach ($Computer in $Computername) {

        try {

            if (Test-Ping -ComputerName $Computer) { ## if the remote computer can be pinged

                Write-Verbose "The computer '$Computer' is online"

                ## Import the XML files to create the PSCredential objects

                $LocalCredential = get-credentials

                $DomainCredential = get-credentials

                Write-Verbose "Removing computer from domain and forcing restart"

                Remove-Computer -ComputerName $Computer -LocalCredential $LocalCredential -UnjoinDomainCredential $DomainCredential -Workgroup TempWorkgroup -Restart -Force

                Write-Verbose "The computer has been removed from domain. Waiting for a reboot."

                Wait-Reboot -Computername $Computer -Credential $LocalCredential

                Write-Verbose "The computer $Computer has been rebooted. Attempting to rejoin to domain."

                Add-Computer -ComputerName $Computer -DomainName $DomainName -Credential $DomainCredential -LocalCredential $LocalCredential -Restart -Force

                Write-Verbose "The computer $Computer has been rejoined to domain. Waiting for the final reboot"

                Wait-Reboot -Computername $Computer -Credential $DomainCredential

                Write-Verbose "The computer $Computer has been successfully rejoined to the domain $DomainName"

                [pscustomobject]@{ 'Computername' = $Computer; 'Result' = $true }

            } else {

                throw "The computer '$Computer' is offline or name cannot be resolved"    

            }

        } catch {

            [pscustomobject]@{ 'Computername' = $Computer; 'Result' = $false; 'Error' = $_.Exception.Message }

        }

    }

}

Ik ben steenrijk....ik heb een grindpad!


Acties:
  • 0 Henk 'm!

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

Question Mark

Moderator SSC/WOS

F7 - Nee - Ja

Wylana schreef op woensdag 01 juli 2015 @ 10:41:
Get-Credentials had ik ook gevonden, maar begrijp/snap nog niet heel goed hoe ik die moet verwerken in het script.
En wat snap je dan precies niet en waar loop je tegenaan? Wat heb je geprobeerd om dit op te lossen?

We gaan hier echt niet een kant en klaar Powershell script voor je aanpassen, we willen je er wel bij ondersteunen. Maar dat betekent wel dat je zelf iets meer inzet moet gaan tonen.

En waarom wil je dit script eigenlijk gaan gebruiken? Waarom moeten computers in- en uit het domein gehaald worden? (even uit nieuwsgierigheid).

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


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 23:43
Je hebt een typo gemaakt in je script :
Het is Get-Credential, niet Get-Credentials.

Acties:
  • 0 Henk 'm!

  • Meekoh
  • Registratie: April 2005
  • Laatst online: 12-09 11:51
Wylana schreef op woensdag 01 juli 2015 @ 20:29:
Ik begrijp niet goed waarom hij de waarde (Computernaam) niet oppakt en verder verwerkt?
Want ik moet ook ergens nog het domein opgeven. Gaat dat met vrijwel dezelfde waarden dan?
Waar gaat het fout?

Ik heb precies zoals je zei de code van Meekoh geplakt na het stukje "begin {"
Je moet wel mijn gewijzigde stukje pakken ;)
Je script zoekt over al naar $Computername, maar initieel stopte mijn stukje de waarde in $Computer. Dat is obviously niet hetzelfde, dat had je zelf ook kunnen spotten.
Domein opvragen kan op eenzelfde manier. Alleen dan prop je de waarde in $DomainName.

Het is niet zo moeilijk, het enige wat jij moet doen is begrijpen hoe je objecten/variabelen vult. Alles met een $ ervoor is een object/variabele. Als je daar een = achter zet dan zeg je eigenlijk: "Datgene wat aan de rechterkant van de = staat wordt de nieuwe waarde van wat er in het object aan de linkerkant van de = staat"

Nou aangezien je een script hebt geleend van het internet, zijn al die variabelen/objecten al gedefinieerd door de script schrijver. Het enige wat jij moet doen is die op de juiste manier van de juiste waardes voorzien.

Computer says no


Acties:
  • 0 Henk 'm!

  • Wylana
  • Registratie: April 2009
  • Laatst online: 12-09 17:43
Killah_Priest schreef op donderdag 02 juli 2015 @ 01:44:
Je hebt een typo gemaakt in je script :
Het is Get-Credential, niet Get-Credentials.
Weet je dat zeker?
Zowel Meekoh als SirDarkAngel geven ook aan dat het Get-Credentials is.
Maar ik ga het testen thuis.

Ik ben steenrijk....ik heb een grindpad!


Acties:
  • 0 Henk 'm!

  • tabee
  • Registratie: November 2012
  • Laatst online: 11-08 19:06
PS C:\Users\user> Get-Credentials
Get-Credentials : The term 'Get-Credentials' is not recognized as the name of a cmdlet, function, script file, or opera
ble program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ Get-Credentials
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-Credentials:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Realiteit is een hallucinatie die optreedt bij gebrek aan alcohol.


Acties:
  • 0 Henk 'm!

  • _Peter2_
  • Registratie: November 2008
  • Laatst online: 09-09 11:45
Zie wat Killah_Priest al zei:
Killah_Priest schreef op donderdag 02 juli 2015 @ 01:44:
Je hebt een typo gemaakt in je script :
Het is Get-Credential, niet Get-Credentials.

Diablo III: <GOT> Pteer#2475 --- POE: Dwergux


Acties:
  • 0 Henk 'm!

  • SirDarkAngel
  • Registratie: April 2005
  • Laatst online: 05-09 10:03
Wylana schreef op donderdag 02 juli 2015 @ 10:51:
[...]


Weet je dat zeker?
Zowel Meekoh als SirDarkAngel geven ook aan dat het Get-Credentials is.
Maar ik ga het testen thuis.
Ja, ik vergat een stukje, dit moest nog boven aan je script, dan werkt het wel:

code:
1
2
3
4
function get-credentials
{
    get-credential
}


:+ :+ :+

Voor de duidelijkheid, ik zat er dus naast en heb het hierboven al schaamteloos aangepast. Sorry.

Wilde altijd al iets over computers weten


Acties:
  • 0 Henk 'm!

  • Meekoh
  • Registratie: April 2005
  • Laatst online: 12-09 11:51
Wylana schreef op donderdag 02 juli 2015 @ 10:51:
[...]


Weet je dat zeker?
Zowel Meekoh als SirDarkAngel geven ook aan dat het Get-Credentials is.
Maar ik ga het testen thuis.
Ik ben ook niet heilig he ;)
Als er 1 ding is wat ik te vaak door elkaar haal is het credential vs credentials. :X

Computer says no


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 23:43
Wylana schreef op donderdag 02 juli 2015 @ 10:51:
[...]


Weet je dat zeker?
Zowel Meekoh als SirDarkAngel geven ook aan dat het Get-Credentials is.
Maar ik ga het testen thuis.
TAB completion is je grote vriend in Powershell.
Ik adviseer je btw om je scripts in ISE (of een andere IDE) te maken als je dat nog niet doet ; in ISE had je door Get-Cred <TAB> het commando aan kunnen vullen.

Acties:
  • 0 Henk 'm!

  • Wylana
  • Registratie: April 2009
  • Laatst online: 12-09 17:43
Question Mark schreef op woensdag 01 juli 2015 @ 21:43:
[...]

En wat snap je dan precies niet en waar loop je tegenaan? Wat heb je geprobeerd om dit op te lossen?

We gaan hier echt niet een kant en klaar Powershell script voor je aanpassen, we willen je er wel bij ondersteunen. Maar dat betekent wel dat je zelf iets meer inzet moet gaan tonen.

En waarom wil je dit script eigenlijk gaan gebruiken? Waarom moeten computers in- en uit het domein gehaald worden? (even uit nieuwsgierigheid).
Sorry had over je post heen gelezen.

Ik wil graag aangeven wat ik heb gedaan, maar zoals ik al zei. Ik heb heel weinig ervaring nog met dit soort commands. Ik heb in het begin geprobeerd om het script werkend te krijgen zoals het in eerste instantie bedoeld was. Dus met een xml file de credentials opgeven en dan verder gaan. Dit is mij gelukt. Echter wil ik het graag nu hebben dat hij om deze gegevens vraag.
Verder heb ik geprobeerd de get-credential in het script te verwerken, echter krijg ik nu een melding dat BEGIN niet als cmdlet, script etc wordt gezien. Omdat ik zelf nooit programmeren heb gehad (html hier niet meegerekend) is het voor mij allemaal vrij nieuw. Dus ik snap nog niet hoe alles precies samen werkt.

Momenteel ben ik nog bezig om mijn MCSE af te ronden en daarna ga ik een zelf studie Powershell doen. Vandaar dat ik er wel al mee bezig ben geweest om te kijken wat het kan, hoe wat werkt etc.

Verder wil ik het script gebruiken voor op mijn werk. Ik werk bij een ICT dienstverlener waarbij wij vaak zien dat computers hun vertrouwensrelatie verbroken is. Met dit script kan ik van afstand de PC uit het domein halen, laten herstarten, in het domein zetten, herstarten en de gebruiker weer laten inloggen in slechts enkele minuten. Anders moet ik naar de klant toe (reistijd), handmatig de stappen uitvoeren (+- 15 min werk) en weer terug naar kantoor rijden. Maar omdat wij voor diverse klanten werken, wil ik graag dat het script altijd om de computernaam vraagt, het domein naam vraagt, lokaal adm account en wachtwoord en domein adm account en wachtwoord vraagt.

Op die manier kan ik het script voor elke klant gebruiken.

edit: Ik ben inmiddels de BEGIN foutmelding en get-credential verwerkt.
Krijg nu alleen RPC foutmelding, maar die kan ik wel fixen.

Ben er bijna :)

[ Voor 3% gewijzigd door Wylana op 02-07-2015 19:19 ]

Ik ben steenrijk....ik heb een grindpad!


Acties:
  • 0 Henk 'm!

  • Wylana
  • Registratie: April 2009
  • Laatst online: 12-09 17:43
En het werkt :-)

Iedereen bedankt voor jullie hulp!

Ik ben steenrijk....ik heb een grindpad!


Acties:
  • +1 Henk 'm!

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

Question Mark

Moderator SSC/WOS

F7 - Nee - Ja

Wylana schreef op donderdag 02 juli 2015 @ 19:05:
[...]
Verder wil ik het script gebruiken voor op mijn werk. Ik werk bij een ICT dienstverlener waarbij wij vaak zien dat computers hun vertrouwensrelatie verbroken is. Met dit script kan ik van afstand de PC uit het domein halen, laten herstarten, in het domein zetten, herstarten en de gebruiker weer laten inloggen in slechts enkele minuten. Anders moet ik naar de klant toe (reistijd), handmatig de stappen uitvoeren (+- 15 min werk) en weer terug naar kantoor rijden. Maar omdat wij voor diverse klanten werken, wil ik graag dat het script altijd om de computernaam vraagt, het domein naam vraagt, lokaal adm account en wachtwoord en domein adm account en wachtwoord vraagt.
Waarom gebruik je dan niet het Powershell commando:

code:
1
Reset-ComputerMachinePassword [-Credential <PSCredential>] [-Server <String>]


Om het computeraccount in de AD te resetten. Dat scheelt je één herstart. ;)

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


Acties:
  • 0 Henk 'm!

  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Wylana schreef op donderdag 02 juli 2015 @ 19:05:
[...]
Verder wil ik het script gebruiken voor op mijn werk. Ik werk bij een ICT dienstverlener waarbij wij vaak zien dat computers hun vertrouwensrelatie verbroken is.
Zou je niet gaan kijken waarom dit zo is? Wordt er een lange tijd niet aangelogged? Een script lijkt mij geen oplossing.

Acties:
  • 0 Henk 'm!

  • Wylana
  • Registratie: April 2009
  • Laatst online: 12-09 17:43
Squ1zZy schreef op vrijdag 03 juli 2015 @ 07:15:
[...]


Zou je niet gaan kijken waarom dit zo is? Wordt er een lange tijd niet aangelogged? Een script lijkt mij geen oplossing.
Uiteraard wordt er gezocht naar de oorzaak (dubbele naam conflict, password change niet goed doorgekomen etc) maar dan nog is het handig om dit script te gebruik om de PC weer werkend te krijgen ipv dat je op locatie aan de gang moet gaan.

Ik ben steenrijk....ik heb een grindpad!


Acties:
  • 0 Henk 'm!

  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Wylana schreef op vrijdag 03 juli 2015 @ 10:22:
[...]


Uiteraard wordt er gezocht naar de oorzaak (dubbele naam conflict, password change niet goed doorgekomen etc) maar dan nog is het handig om dit script te gebruik om de PC weer werkend te krijgen ipv dat je op locatie aan de gang moet gaan.
"dubbele naam conflict"

Dit moet toch in een dag op te lossen zijn? Worden systemen via een deployment tool uitgerold? SCCM?

Zijn er stickers geplakt op werkstation en dubbele namen uitgegeven?

Vind het script niet eens een tussenoplossing ...

Acties:
  • 0 Henk 'm!

  • Wylana
  • Registratie: April 2009
  • Laatst online: 12-09 17:43
Question Mark schreef op donderdag 02 juli 2015 @ 23:29:
[...]

Waarom gebruik je dan niet het Powershell commando:

code:
1
Reset-ComputerMachinePassword [-Credential <PSCredential>] [-Server <String>]


Om het computeraccount in de AD te resetten. Dat scheelt je één herstart. ;)
Dit commando kon ik nog niet. Zal die ook eens testen.
Bedankt hiervoor!
Squ1zZy schreef op vrijdag 03 juli 2015 @ 10:24:
[...]


"dubbele naam conflict"

Dit moet toch in een dag op te lossen zijn? Worden systemen via een deployment tool uitgerold? SCCM?

Zijn er stickers geplakt op werkstation en dubbele namen uitgegeven?

Vind het script niet eens een tussenoplossing ...
Zoals vermeld, werken wij voor MEERDERE klanten. Meeste van deze klanten zijn MBK of MKB+.
Computers worden (nog) niet uitgerold met tooling als SCCM omdat de klant dat niet wilt.
Deze worden besteld door de klant bij ons en wij rollen de computer op kantoor uit, configureren hem af etc.

Op locatie bij de (meeste) klanten is geen SCCM aanwezig of andere deployment solution.

[ Voor 22% gewijzigd door Wylana op 03-07-2015 10:28 ]

Ik ben steenrijk....ik heb een grindpad!


Acties:
  • 0 Henk 'm!

  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Op kantoor uitrollen? Dan wordt er niet gekeken of het computer object al bestaat in AD?
Snap niet dat dubbele namen kan voorkomen ...
Pagina: 1