Question Sudo Mode

Plus d'informations
il y a 15 ans 8 mois #7409 par Arthur
Réponse de Arthur sur le sujet Re:Sudo Mode
En faite c'est l'avantage d'utiliser le paramètre en type string car j'inclus les variables à la constructions du scriptblock je n'ai pas besoin d'Argumentlist :P
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 :P

L'idéal serait de faire la même chose qu'avec le string mais avec un Scriptblock. :S

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. :P<br><br>Message édité par: bilbao, à: 19/07/10 15:44

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 8 mois #7411 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Sudo Mode
Salut,
prend l'habitude de poster un nouveau message sinon la notification ne se fait pas.
bilbao écrit:

En effet j'obtiens un dossier du nom de DossierTest :blink:

Difficile de t'aider...
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:

Je n'obtient que la premier entrée de l'objet $log, quelqu'un peut confirmer?

Force le passage d'un tableau :
[code:1]
-ArgumentList @(,$log)
[/code:1]

bilbao écrit:

Sinon je voulais savoir avant de poster le script dans \&quot;Contributions à la communauté\&quot;(Ça peut toujours servir) si vous aviez des suggestions.

Tu peux proposer ceci sur le paramètre d'entrée
[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 = \&quot;salut\&quot;
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 = \&quot;salut\&quot;
$Liste=gv -scope 0|? {$ExcludeVariables -notcontains $_.name}|out-string
$Max=[Math]::Max($ExcludeVariables.count,$All.count)
write \&quot;Variables locales : \&quot;
$liste
#sudo.ps1 - script {write-host $toto } -argument $Liste
}
&amp;$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 !
:P

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 8 mois #7412 par Arthur
Réponse de Arthur sur le sujet Re:Sudo Mode
[code:1]prend l'habitude de poster un nouveau message sinon la notification ne se fait pas.
[/code:1]

C'est pour éviter les doubles post j'aime pas :P

Sinon je vais prendre en compte tes suggestions.

Le but est de coder un petit sudo sympa :laugh:
Sans être magique. :whistle:

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 8 mois #7414 par Arthur
Réponse de Arthur sur le sujet Re:Sudo Mode
Me revoilà !
(Cette fois ci j'ai pas fait edit :evil: )
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 \&quot;Deserialized\&quot; ( 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 :P )

Voici un exemple :

PS D:\powershell&gt; $log = Get-EventLog -LogName Application -EntryType Error -Newest 20
PS D:\powershell&gt; $toto = \&quot;`nCa marche , C'est cool\&quot;
PS D:\powershell&gt; $tata = \&quot;Ne devrait pas être afficher dans la commande\&quot;
PS D:\powershell&gt; .\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 \&quot;Sudo-q!T\&quot;

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 \&quot;C:\in...
2624 juil. 15 1... Error SideBySide 3238068257 Activation context generation failed for \&quot;C:\in...
2623 juil. 15 1... Error SideBySide 3238068257 Activation context generation failed for \&quot;C:\in...
2608 juil. 15 1... Error SideBySide 3238068257 Activation context generation failed for \&quot;C:\in...
2607 juil. 15 1... Error SideBySide 3238068257 Activation context generation failed for \&quot;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 :laugh: )

[code:1]param([ScriptBlock]$script)

#########################
# FONCTION #
#########################
function Random {
param(
[int] $len = 4,
[string] $chars = \&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_!@#$%\&quot;
)

$bytes = new-object \&quot;System.Byte[]\&quot; $len
$rnd = new-object System.Security.Cryptography.RNGCryptoServiceProvider
$rnd.GetBytes($bytes)
$result = \&quot;\&quot;
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 \&quot;$($_.name)\&quot; -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 \&quot;Entrez le login :\&quot;
$password = read-host \&quot;Entrez le mot de passe :\&quot; -AsSecureString
$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist \&quot;$login\&quot;,$password
$Count = $Param.Count
$char = '$'
$Param | % {
[string]$Variables += \&quot;,$char$_\&quot;
[string]$Variables2 += \&quot;,@(,$char$_)\&quot;
}


[string]$cmd = 'Start-Job -Credential $credentials -ScriptBlock {param($script' + $Variables + \&quot;«») $script_string \&quot; + ' } -ArgumentList $script' + $Variables2 + \&quot; -Name \&quot;\&quot;Sudo-$Aleatoire\&quot;\&quot;\&quot;

write-host $cmd

invoke-expression -Command $cmd | Out-null
wait-job -name \&quot;Sudo-$Aleatoire\&quot; | Receive-Job
remove-job -Name \&quot;Sudo-$Aleatoire\&quot;
[/code:1]

Bref je suis toujours Open à toutes suggestions. :silly:

Sinon c'est un truc con mais con mais... :pinch:
J'arrive pas à faire un truc du style \&quot;[string]$var1 -eq [string]$var2 avec un \&quot;match\&quot; dans la fonction Get-Var

Je voudrais une vérification à la lettre prés le \&quot;^\&quot;(au début) et le \&quot;$\&quot;(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.

Plus d'informations
il y a 15 ans 8 mois #7415 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Sudo Mode
bilbao écrit:

Cette fois ci j'ai pas fait edit

Ma BAL confirme ;-)
bilbao écrit:

Par contre il perd les propriétés, les objets deviennent \&quot;Deserialized\&quot; ( 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 :P )

Pour ça, faut demander à Jeffrey .
Maintenant tu connais les objets \&quot;desséchés\&quot;.
bilbao écrit:

J'arrive pas à faire un truc du style \&quot;[string]$var1 -eq [string]$var2 avec un \&quot;match\&quot; dans la fonction Get-Var
Je voudrais une vérification à la lettre prés le \&quot;^\&quot;(au début) et le \&quot;$\&quot;(a la fin) ne marchent pas.

Que veux tu faire exactement ? Quel est le besoin ?<br><br>Message édité par: Laurent Dardenne, à: 20/07/10 16:24

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 8 mois #7416 par Arthur
Réponse de Arthur sur le sujet Re:Sudo Mode

Que veux tu faire exactement ? Quel est le besoin ?


rien ne vaut un bon exemple bien explicite :P :

PS D:\powershell&gt; $tata = 'Je veut cette variable dans $cmd'
PS D:\powershell&gt; $tat = 'Je ne VEUT PAS cette variable dans $cmd'
PS D:\powershell&gt; .\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 \&quot;Sudo-91e\&quot;
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 \&quot;-match\&quot; dans la fonction Get-Var.

[code:1]$Var = $liste | ? { $script -match \&quot;$($_.name)\&quot; -and ($_.Name).length -ge 2}
[/code:1]

Le problème c'est que le match met \&quot;True\&quot; 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 \&quot;^\&quot; au début et un \&quot;$\&quot; à 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.

Temps de génération de la page : 0.053 secondes
Propulsé par Kunena