[.NET] Efficient bouwen van een string adh. checkboxes

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

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

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
Eigenlijk voor Powershell, maar binnen de .NET familie zijn die dingen gemakkelijk over te zetten.

Ik heb een datagrid die allerlei user attributes bevat en een knop waarmee die attributen weggeschreven worden naar AD. Omdat niet altijd alle attributen weggeschreven dien te worden zit daar nog een menuutje tussen waarop geselecteerd kan worden welke attributen weg te schrijven. Dat ziet er zo uit (er is een reden dat company niet standaard weggeschreven wordt, maar die doet hier niet terzake).

Afbeeldingslocatie: http://static.tweakers.net/ext/f/Z9S74Ar1bRXmfOGAEalqpF83/full.png
Ja, ik zie nu ook dat er een t ontbreekt in committed. Is al gecorrigeerd intussen ;)

Nu is de vraag hoe ik eigenlijk efficiënte code schrijf om die keuze toe te laten. Ik kan 17^2 queries schrijven en een if-structuur opzetten waarmee ik volgende week op de FP van TDWTF kom, maar dat is niet de bedoeling.

Mijn idee is om alle mogelijke stukken van de query in aparte variabelen te steken...

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ADCmdlet = "Set-ADUser"
$ADIdentity = "-Identity $($dgvResults.CurrentRow.Cells['sAMAccountName'].Value)"
$ADGivenName = "-GivenName $($dgvResults.CurrentRow.Cells['GivenName'].Value)"
$ADSurname = "-Surname $($dgvResults.CurrentRow.Cells['Surname'].Value)"
$ADDisplayName = "-DisplayName $($dgvResults.CurrentRow.Cells['DisplayName'].Value)"
$ADEmailaddress = "-Emailaddress $($dgvResults.CurrentRow.Cells['Mail'].Value)"
$ADTitle = "-Title $($dgvResults.CurrentRow.Cells['Title'].Value)"
$ADStreetAddress = "-StreetAddress $($dgvResults.CurrentRow.Cells['StreetAddress'].Value)"
$ADPostalCode = "-PostalCode $($dgvResults.CurrentRow.Cells['PostalCode'].Value)"
$ADCity = "-City $($dgvResults.CurrentRow.Cells['City'].Value)"
$ADCountry = "-Country $($dgvResults.CurrentRow.Cells['Country'].Value)"
$ADCompany = "-Company $($dgvResults.CurrentRow.Cells['Company'].Value)"
$ADHomepage = "-Homepage $()$dgvResults.CurrentRow.Cells['Homepage'].Value)"
$ADOfficePhone = "-OfficePhone $($dgvResults.CurrentRow.Cells['OfficePhone'].Value)"
$ADMobilePhone = "-MobilePhone $($dgvResults.CurrentRow.Cells['MobilePhone'].Value)"
$ADFax = "-Fax $($dgvResults.CurrentRow.Cells['Fax'].Value)"
$ADWhatIf = "-WhatIf" #During testing only


Een nieuwe variabele te maken met alvast wat er sowieso in thuishoort...
C#:
1
$ADCommandString = $ADCmdlet + " " + $ADWhatIf


En dan afhankelijk van wat gekozen is, aan die string toe te voegen...
C#:
1
2
3
4
5
6
7
8
9
If ($cbxGivenName.Checked -EQ $True)
        {
        $ADCommandString = $ADCommandString + " " + "$ADGivenName"
        }
If ($cbxSurname.Checked -EQ $True) 
        {
        $ADCommandString = $ADCommandString + " " + "$ADSurname"
        }
#etc


Zal ongetwijfeld werken, maar ik vroeg me af wat eigenlijk een elegantere oplossing is in zo'n geval.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
code:
1
2
3
4
5
6
7
//pseudocode:
$ADCommandString = "Set-ADUser"
foreach (checkbox in checkboxes) {
  if (checkbox.checked) {
    $ADCommandString += " " +checkbox.tag
  }
}

In de checkbox tags de "-City $($dgvResults.CurrentRow.Cells['City'].Value)" dingen zetten. Of iig iets in die richting. Ben niet heel bekend met powershell, maar als je een "Custom checkbox" (e.g. "MyCheckbox") kunt maken (inheriten) kun je die natuurlijk een extra (paar) property/properties geven met o.a. de "-City" (e.g. argument) en "$($dgvResults.CurrentRow.Cells['City'].Value)" (e.g. value); of: beter nog: "Amsterdam" voor value.

[ Voor 40% gewijzigd door RobIII op 27-05-2015 14:56 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Afvalzak
  • Registratie: Oktober 2008
  • Laatst online: 31-08 12:02

Afvalzak

Zet jij mij even buiten?

Is de homepage String bewust anders dan de rest?
code:
1
$ADHomepage = "-Homepage $()$dgvResults.CurrentRow.Cells['Homepage'].Value)"

vs
code:
1
$ADIdentity = "-Identity $($dgvResults.CurrentRow.Cells['sAMAccountName'].Value)"

(Lijkt me natuurlijk een typo dat extra haakje)

Anders zou je misschien een alleen de Identity en sAMAccountName kunnen bijhouden bij de checkbox zodat je zoiets krijg:
code:
1
-{tag1} $($dgvResults.CurrentRow.Cells[{tag2}].Value)


Maar ik weet niet of het mogelijk is meerdere tags per checkbox bij te houden.

[ Voor 4% gewijzigd door Afvalzak op 27-05-2015 15:00 ]

Last.fm | Code Talks


Acties:
  • 0 Henk 'm!

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

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
RobIII schreef op woensdag 27 mei 2015 @ 14:53:
code:
1
2
3
4
5
6
7
//pseudocode:
$ADCommandString = "Set-ADUser"
foreach (checkbox in checkboxes) {
  if (checkbox.checked) {
    $ADCommandString += " " +checkbox.tag
  }
}

In de checkbox tags de "-City $($dgvResults.CurrentRow.Cells['City'].Value)" dingen zetten. Of iig iets in die richting. Ben niet heel bekend met powershell, maar als je een "Custom checkbox" (e.g. "MyCheckbox") kunt maken (inheriten) kun je die natuurlijk een extra (paar) property/properties geven met o.a. de "-City" (e.g. argument) en "$($dgvResults.CurrentRow.Cells['City'].Value)" (e.g. value); of: beter nog: "Amsterdam" voor value.
Bedankt. Ik ben uiteindelijk voor bovenstaande manier gegaan. 't Enige dat wat stom is, is dat ik geen manier vond om een array te maken van de checkboxes in mijn form. Ik ga dat verder onderzoeken, maar heb dat nu nogal meh gedaan :+

C#:
1
2
3
4
5
6
7
    $ADCommandString = $ADCmdlet + " " + $ADWhatIf
    $Checkboxes = @($cbxCity, $cbxCompany, $cbxCountry, $cbxDisplayName, $cbxFax, $cbxGivenName, $cbxHomePage, $cbxMail, $cbxMobilePhone, $cbxOfficePhone, $cbxPostalCode, $cbxStreetAddress, $cbxSurName, $cbxTitle)
    
    ForEach ($Checkbox in $Checkboxes)
        {
        $ADCommandString = $ADCommandString + " " + $Checkbox.Tag
        }   
Afvalzak schreef op woensdag 27 mei 2015 @ 14:59:
Is de homepage String bewust anders dan de rest?
code:
1
$ADHomepage = "-Homepage $()$dgvResults.CurrentRow.Cells['Homepage'].Value)"

vs
code:
1
$ADIdentity = "-Identity $($dgvResults.CurrentRow.Cells['sAMAccountName'].Value)"

(Lijkt me natuurlijk een typo dat extra haakje)
Inderdaad. Zelfs geen typo: alvorens te copy/pasten naar GoT heb ik een en ander aangepast mijn echte code in Notepad++. Om een of andere reden zette NP++ automagisch ')' wanneer ik een '(' intypte. Ik had ze allemaal verwijderd, behalve één blijkbaar :)
Anders zou je misschien een alleen de Identity en sAMAccountName kunnen bijhouden bij de checkbox zodat je zoiets krijg:
code:
1
-{tag1} $($dgvResults.CurrentRow.Cells[{tag2}].Value)


Maar ik weet niet of het mogelijk is meerdere tags per checkbox bij te houden.
Ik zie niet meteen de mogelijkheid om meerdere tags bij te houden neen.

[ Voor 5% gewijzigd door YellowOnline op 27-05-2015 17:17 ]


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 20:57

Sebazzz

3dp

Je kan wel met Powershell een custom object bouwen en dat in de tag stoppen.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Xiphalon
  • Registratie: Juni 2001
  • Laatst online: 17:04
Lijst met alle checkboxen die direct op het form liggen in C#:
C#:
1
var checkboxList = form.Controls.OfType<CheckBox>();

zit er een panel tussen, uiteraard de Controls property van dat panel uitlezen, of iets recursiefs maken.

Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 09:17
Hoe ik een vergelijkbaar probleem (weliswaar zonder checkboxes maar meer het feit van "hoe voed ik via bv een form de niet gebruikte waardes niet aan het commando ivm errors of leeggooien van waardes" heb opgelost (ik loop wel vaker tegen problemen aan bij het "wrappen" van commando's voor scripts) is via een functie een Get-Command gebruiken om de parameters in een een object te stoppen icm een string waarmee de betreffende parameter weer gevoed kan worden.
Vervolgens laat ik hier een For loop overheen lopen bij het uiteindelijke command om de commandstring (welke ik via invoke-expression aanroep) op te bouwen : in deze For loop zit een IF statement welke alleen parameters met een value doorgeeft aan het "echte" command (parameters zonder value worden genegeerd)

Net even snel een conceptje geschreven (werkende, wel vrij crappy, code, ben best wel moe dus focussen was lastig : ik heb ook maar een aantal van de parameters van Set-ADUser overgenomen )

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Function Global:SetADUserWrapper
{
[cmdletbinding()]
Param
    (
    $Identity,
    $Add,
    $GivenName,
    $Surname,
    $OfficePhone
    )

Begin
    {
    ## sub function to return the command parameters
    Function script:Return-SetAdUserCommandParameters
    {
    $GetCommandParameters = $((Get-Command Set-Aduser).Parameters.Keys)
    foreach ($Parameter in $GetCommandParameters)
        {
        [PSCustomobject] @{
            Name = $Parameter
            CmdString = $(" -" + $parameter + " " + '$' + $parameter)
            }
        }
    } ## End of function

## Put the parameterlist in a variable
$SetADUserParameterList = Return-SetAdUserCommandParameters
    } ## END OF BEGIN

Process
    {
    $SetADUserCommandStringCommand = "Set-AdUser"
    For ($i = 0;$i -lt $SetADUserParameterList.Count;$i++)
        {
        $SetADUserParameterVariable = $(Get-Variable -Name $($SetADUserParameterList[$i].Name) -ErrorAction SilentlyContinue)
         ## If statement makes sure that if an argument is $Null that it won't be called in the final command
        if ($SetADUserParameterVariable -and $SetADUserParameterVariable.Value -ne $null)
            {$SetADUserCommandStringParameters = $SetADUserCommandStringParameters + $($SetAdUserParameterList[$i].CmdString)}
        }
    $SetADUserStringCommand = $SetADUserCommandStringCommand + $SetADUserCommandStringParameters
    Invoke-Expression $SetADUserStringCommand
    } ## END OF PROCESS
} ## END OF FUNCTION SetADUserWrapper


Als ik in dit geval
code:
1
SetADUserWrapper -Identity Pietjepuk -GivenName Pietje -Surname Puk
doe dan worden de voornaam en achternaam keurig "Pietje" en "Puk".
Als ik vervolgens
code:
1
SetADUserWrapper -Identity Pietjepuk -GivenName Pietje -Surname $Null
doe dan blijft de achternaam gewoon keurig staan.

Doe ik hetzelfde met
code:
1
Set-ADUser -GivenName Pietje -Surname $Null
(wat meestal gebeurt als je een bv Set-ADUser vanuit een form aanroep en de waarde is leeg) dan haalt deze uiteraard de waarde leeg.

Dmv deze functie aan te roepen vanuit je form dmv een button hoef je geeneens meer vinkjes te zetten voor de AD velden welke niet ingevuld zijn (hoewel het leeghalen van een veld dan wel weer onmogelijk wordt ; dit kan echter in principe ook weer via vinkjes of dmv een delete button oplossen welke bv de reguliere Set-ADUser aanroept)

(omslachtige code van mijzelf maar het werkt uiteindelijk wel. Mocht iemand beter code hebben, graag want ik ben uiteindelijk gewoon een systeembeheerder en geen developer)

[ Voor 10% gewijzigd door Killah_Priest op 01-06-2015 00:36 ]

Pagina: 1