Question
Sudo Mode
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
J'avais d'abord essayé d'inclure les variables dynamiquement dans le Argumentlist ( en effet on ne connais ni le nom des variables que l'on veut inclure ni leurs nombre) j'ai donc contourné le problème par un string
L'idéal serait de faire la même chose qu'avec le string mais avec un Scriptblock.
EDIT:
En améliorant la fonction je me suis rendus compte que l'on ne pouvait pas passer d'objets complexes en entier dans Argumentlist.
En effet j'ai crée un variable $log avec la commande Get-EventLog
et quand je fait :
PS D:\powershell> Start-Job -ScriptBlock {param($log) $log } -ArgumentList $log | Wait-Job | Rece
ive-Job
Index Time EntryType Source InstanceID Message
----
2684 juil. 19 0... Error Microsoft-Windows... 1511 Windows cannot find the local profile and is lo...
Je n'obtient que la premier entrée de l'objet $log, quelqu'un peut confirmer?
C'est dommage j'aurai bien aimer créer un sudo permettant de passer un peut près n'importe quel variables.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
prend l'habitude de poster un nouveau message sinon la notification ne se fait pas.
bilbao écrit:
Difficile de t'aider...En effet j'obtiens un dossier du nom de DossierTest
Essaie avec gci ???
vérifie le profile utilisateur ?
Sinon ajoute en début de script, exécuté dans le job, Set-PSdebug -Trace 2.
bilbao écrit:
Force le passage d'un tableau :Je n'obtient que la premier entrée de l'objet $log, quelqu'un peut confirmer?
[code:1]
-ArgumentList @(,$log)
[/code:1]
bilbao écrit:
Tu peux proposer ceci sur le paramètre d'entréeSinon je voulais savoir avant de poster le script dans \"Contributions à la communauté\"(Ça peut toujours servir) si vous aviez des suggestions.
[code:1]
param(
[ValidateNotNullOrEmpty()]
[Parameter(Mandatory=$true,ValueFromPipeline = $true)]
$Script
)
if ($Script -isnot [Scriptbloc])
{
#Appel implicite de ToString() sur $Script
$script_block = $executioncontext.InvokeCommand.NewScriptBlock($Script)
}
[/code:1]
Tu peux aussi consulter ce post si veux créer du code tout en substituant les variables.
Enfin ton script est bloquant, car tu y attends la fin du job, tu perds le bénéfice de la tâche de fond.
Tu peux nommer tes jobs Sudo-$Aleatoire, ainsi tu peux les retrouver + facilement.
Concernant la construction automatique de la liste des variables :
[code:1]
$toto = \"salut\"
sudo.ps1 - script {write-host $toto }
[/code:1]
tu peux creuser la piste suivante :
[code:1]
$sb={
$ExcludeVariables=@(
'?',
'args',
'ConsoleFileName',
'ExecutionContext',
'false',
'HOME',
'Host',
'input',
'MaximumAliasCount',
'MaximumDriveCount',
'MaximumErrorCount',
'MaximumFunctionCount',
'MaximumVariableCount',
'MyInvocation',
'null',
'PID',
'PSBoundParameters',
'PSCulture',
'PSHOME',
'PSUICulture',
'PSVersionTable',
'ShellId',
'true',
'ExcludeVariables'
)
$toto = \"salut\"
$Liste=gv -scope 0|? {$ExcludeVariables -notcontains $_.name}|out-string
$Max=[Math]::Max($ExcludeVariables.count,$All.count)
write \"Variables locales : \"
$liste
#sudo.ps1 - script {write-host $toto } -argument $Liste
}
&$sb
[/code:1]
Cela semble fonctionner, mais ce n'est pas très pratique :/
Ou utiliser les API du parser de PS ([System.Management.Automation.PsParser]::Tokenize), mais ici la difficulté sera de savoir si le token de la variable est local au scriptblock (ex un résultat) ou pas...
Bref si l'équipe de dev à coder le paramètre -ArgumentList, c'est que l'on doit préciser ce que l'on fait et avec qui.
PowerShell est dynamique, pas magique !
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
[/code:1]
C'est pour éviter les doubles post j'aime pas
Sinon je vais prendre en compte tes suggestions.
Le but est de coder un petit sudo sympa
Sans être magique.
Connexion ou Créer un compte pour participer à la conversation.
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
(Cette fois ci j'ai pas fait edit
Bon je suis arrivé à un résultat assez satisfaisant
J'arrive a passer des gros objets ( En tous cas les eventlog entry marchent, faut encore test le reste)
Par contre il perd les propriétés, les objets deviennent \"Deserialized\" ( Perso, moi ca me va, même si bon ca serait quand même plus cool si on pouvait les conserver mais bon... faut pas trop rêver
Voici un exemple :
PS D:\powershell> $log = Get-EventLog -LogName Application -EntryType Error -Newest 20
PS D:\powershell> $toto = \"`nCa marche , C'est cool\"
PS D:\powershell> $tata = \"Ne devrait pas être afficher dans la commande\"
PS D:\powershell> .\super_sudo.ps1 -script { $log ; write-host $toto }
Entrez le login :: domaine\login
Entrez le mot de passe :: **********
Start-Job -Credential $credentials -ScriptBlock {param($script,$log,$toto) $log ; write-host $toto } -ArgumentList $s
cript,@(,$log),@(,$toto) -Name \"Sudo-q!T\"
Index Time EntryType Source InstanceID Message
----
2699 juil. 20 0... Error Microsoft-Windows... 1511 Windows cannot find the local profile and is lo...
2698 juil. 20 0... Error Microsoft-Windows... 1521 Windows cannot locate the server copy of your r...
2684 juil. 19 0... Error Microsoft-Windows... 1511 Windows cannot find the local profile and is lo...
2683 juil. 19 0... Error Microsoft-Windows... 1521 Windows cannot locate the server copy of your r...
2667 juil. 16 0... Error Microsoft-Windows... 4107 Failed extract of third-party root list from au...
2659 juil. 16 0... Error Microsoft-Windows... 1511 Windows cannot find the local profile and is lo...
2658 juil. 16 0... Error Microsoft-Windows... 1521 Windows cannot locate the server copy of your r...
2644 juil. 15 1... Error Microsoft-Windows... 1511 Windows cannot find the local profile and is lo...
2643 juil. 15 1... Error Microsoft-Windows... 1521 Windows cannot locate the server copy of your r...
2625 juil. 15 1... Error SideBySide 3238068257 Activation context generation failed for \"C:\in...
2624 juil. 15 1... Error SideBySide 3238068257 Activation context generation failed for \"C:\in...
2623 juil. 15 1... Error SideBySide 3238068257 Activation context generation failed for \"C:\in...
2608 juil. 15 1... Error SideBySide 3238068257 Activation context generation failed for \"C:\in...
2607 juil. 15 1... Error SideBySide 3238068257 Activation context generation failed for \"C:\in...
2583 juil. 15 1... Error Microsoft-Windows... 1511 Windows cannot find the local profile and is lo...
2582 juil. 15 1... Error Microsoft-Windows... 1521 Windows cannot locate the server copy of your r...
2560 juil. 15 0... Error Microsoft-Windows... 1511 Windows cannot find the local profile and is lo...
2559 juil. 15 0... Error Microsoft-Windows... 1521 Windows cannot locate the server copy of your r...
2555 juil. 14 1... Error Microsoft-Windows... 4107 Failed extract of third-party root list from au...
2553 juil. 14 1... Error Microsoft-Windows... 4107 Failed extract of third-party root list from au...
Ca marche , C'est cool
En ce qui concerne le script je n'en suis qu'au stade expérimentale il manque donc la gestion pour les pipe,les vérifications en tous genre etc... ( je vais voir si je peut utiliser les tuto de Laurent de façon efficace
[code:1]param([ScriptBlock]$script)
#########################
# FONCTION #
#########################
function Random {
param(
[int] $len = 4,
[string] $chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_!@#$%\"
)
$bytes = new-object \"System.Byte[]\" $len
$rnd = new-object System.Security.Cryptography.RNGCryptoServiceProvider
$rnd.GetBytes($bytes)
$result = \"\"
for( $i=0; $i -lt $len; $i++ )
{
$result += $chars[ $bytes[$i] % $chars.Length ]
}
return $result
}
function Get-var {
param([scriptblock]$script)
$ExcludeVariables=@(
'?',
'args',
'ConsoleFileName',
'ExecutionContext',
'false',
'HOME',
'Host',
'input',
'MaximumAliasCount',
'MaximumDriveCount',
'MaximumErrorCount',
'MaximumFunctionCount',
'MaximumVariableCount',
'MyInvocation',
'null',
'PID',
'PSBoundParameters',
'PSCulture',
'PSHOME',
'PSUICulture',
'PSVersionTable',
'ShellId',
'true',
'ExcludeVariables'
'WhatIfPreference'
'WarningPreference'
'VerbosePreference'
'StackTrace'
'ReportErrorShowStackTrace'
'ConfirmPreference'
'DebugPreference'
'Error'
'ErrorActionPreference'
'ErrorView'
'FormatEnumerationLimit'
'MaximumHistoryCount'
'NestedPromptLevel'
'OutputEncoding'
'PROFILE'
'ProgressPreference'
'PSEmailServer'
'PSSessionApplicationName'
'PSSessionConfigurationName'
'PSSessionOption'
'PWD'
'ReportErrorShowExceptionClass'
'ReportErrorShowInnerException'
'ReportErrorShowSource'
)
$Liste=gv -scope 2|? {$ExcludeVariables -notcontains $_.name}
$Max=[Math]::Max($ExcludeVariables.count,$All.count)
$Var = $liste | ? { $script -match \"$($_.name)\" -and ($_.Name).length -ge 2}
$Var | % {
[string[]]$Result += $_.name
}
return $Result
}
#########################
# TRAITEMENT #
#########################
$Aleatoire = Random -len 3
$Param = Get-var -script $script
$script_string = $script.Tostring()
$login = read-host \"Entrez le login :\"
$password = read-host \"Entrez le mot de passe :\" -AsSecureString
$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist \"$login\",$password
$Count = $Param.Count
$char = '$'
$Param | % {
[string]$Variables += \",$char$_\"
[string]$Variables2 += \",@(,$char$_)\"
}
[string]$cmd = 'Start-Job -Credential $credentials -ScriptBlock {param($script' + $Variables + \"«») $script_string \" + ' } -ArgumentList $script' + $Variables2 + \" -Name \"\"Sudo-$Aleatoire\"\"\"
write-host $cmd
invoke-expression -Command $cmd | Out-null
wait-job -name \"Sudo-$Aleatoire\" | Receive-Job
remove-job -Name \"Sudo-$Aleatoire\"
[/code:1]
Bref je suis toujours Open à toutes suggestions.
Sinon c'est un truc con mais con mais...
J'arrive pas à faire un truc du style \"[string]$var1 -eq [string]$var2 avec un \"match\" dans la fonction Get-Var
Je voudrais une vérification à la lettre prés le \"^\"(au début) et le \"$\"(a la fin) ne marchent pas.<br><br>Message édité par: bilbao, à: 20/07/10 16:38
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Ma BAL confirmeCette fois ci j'ai pas fait edit
bilbao écrit:
Pour ça, faut demander à Jeffrey .Par contre il perd les propriétés, les objets deviennent \"Deserialized\" ( Perso, moi ca me va, même si bon ca serait quand même plus cool si on pouvait les conserver mais bon... faut pas trop rêver
)
Maintenant tu connais les objets \"desséchés\".
bilbao écrit:
Que veux tu faire exactement ? Quel est le besoin ?<br><br>Message édité par: Laurent Dardenne, à: 20/07/10 16:24J'arrive pas à faire un truc du style \"[string]$var1 -eq [string]$var2 avec un \"match\" dans la fonction Get-Var
Je voudrais une vérification à la lettre prés le \"^\"(au début) et le \"$\"(a la fin) ne marchent pas.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
Que veux tu faire exactement ? Quel est le besoin ?
rien ne vaut un bon exemple bien explicite
PS D:\powershell> $tata = 'Je veut cette variable dans $cmd'
PS D:\powershell> $tat = 'Je ne VEUT PAS cette variable dans $cmd'
PS D:\powershell> .\super_sudo.ps1 -script { write-host $tata }
Entrez le login :: domaine\login
Entrez le mot de passe :: **********
Start-Job -Credential $credentials -ScriptBlock {param($script,$tat,$tata) write-host $tata } -ArgumentList $script,@
(,$tat),@(,$tata) -Name \"Sudo-91e\"
Je veut cette variable dans $cmd
Et comme on peut le voir dans $cmd il m'a prit la variable $tat alors que je la veut pas et c'est due au filtre avec \"-match\" dans la fonction Get-Var.
[code:1]$Var = $liste | ? { $script -match \"$($_.name)\" -and ($_.Name).length -ge 2}
[/code:1]
Le problème c'est que le match met \"True\" dans le filtre en comparant $tat à $tata, pour éviter ca il faudrait faire comme expliqué ici :
technet.microsoft.com/fr-fr/magazine/2007.11.powershell.aspx
mettre un \"^\" au début et un \"$\" à la fin de l'expression ( enfin je pense) mais ca me sort une erreur.<br><br>Message édité par: bilbao, à: 20/07/10 17:06
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Sudo Mode