Question Nouveau thread sous une autre identité

Plus d'informations
il y a 14 ans 11 mois #4499 par Bredin Samuel
Bonjour tout le monde.

Tout est dans le titre.
Je cherche à créer un nouveau thread synchrone (jusqu'ici tout va bien) qui serait lancer sous une autre identité.

A l'origine, j'ai une form qui permet d'exécuter des actions sur des machines d'un domaine.

Je voudrais que cette form puisse agir sur des machines d'un autre domaine sans dupliquer le script sur chaque domaine.

Je précise qu'il n'y a pas d'approbation inter-domaine, donc un compte admin par domaine.

Le top serait d'avoir un bouton permettant de changer d'identité.

Ensuite une fois le nouveau credential récupéré, je pense avoir deux choix pour exécuter les actions, une première serait de changer l'identité du processus courant ou la deuxième serait de lancer les actions dans un thread dépendant du credential récupéré.

La deuxième solution me parait plus abordable (peut etre que je me trompe) mais je ne vois pas trop par où commencer.

j'ai bien aussi pensé à un bon vieux PSEXEC.exe mais j'aimerais trouver plus propre.

Quelqu'un aurait une idée ?<br><br>Message édité par: Mephisto, à: 31/03/09 11:23

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

Plus d'informations
il y a 14 ans 11 mois #4500 par Laurent Dardenne
Mephisto écrit:

Quelqu'un aurait une idée ?

Regarde du coté de l'emprunt d'identité .
Le texte du lien cité référence l'API LogonUser, donc Google \&quot;PowerShell LogonUser\&quot;, on tombe sur [url=http://mshforfun.blogspot.com/2006/02/groups-command-in-msh-get.html
]ceci[/url] qui référence un autre post sur le sujet.

Ensuite avec \&quot;C# LogonUser\&quot; :
www.codeproject.com/KB/cs/cpimpersonation1.aspx

Tu aura peut-être besoin de modifier des privilégés, dans ce cas PCSX propose 2 cmdlet de gestion des privilèges.

En espérant que cela réponde à ta question.

Par contre je suis curieux de savoir comment tu procédes pour ceci
Mephisto écrit:

créer un nouveau thread synchrone

?

Tutoriels PowerShell

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

Plus d'informations
il y a 14 ans 11 mois #4501 par Laurent Dardenne
Peut être que cette API, CreateProcessWithLogonW , est plus adaptée.

Tutoriels PowerShell

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

Plus d'informations
il y a 14 ans 11 mois #4504 par Bredin Samuel
Re bonjour

Laurent Dardenne écrit:

Par contre je suis curieux de savoir comment tu procédes pour ceci


Autant pour moi Laurent, un abus de langage.

C'est plus ou moins du synchrone.

J'ai trouvé (je crois sur ce site) deux fonctions le permettant de créer un thread.

[code:1]#Création d'un thread
Function New-Thread {
$config = [System.Management.Automation.Runspaces.Runspace]::«»DefaultRunspace.RunspaceConfiguration
$runspace = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace($config)
$thread = New-Object System.Object

$thread | Add-Member NoteProperty \&quot;Runspace\&quot; $runspace
$thread | Add-Member NoteProperty \&quot;Pipeline\&quot; $null
$thread | Add-Member ScriptProperty \&quot;Running\&quot; { return ($this.Pipeline -ne $null -and (-not $this.Pipeline.Error.EndOfPipeline -or -not $this.Pipeline.Output.EndOfPipeline)) }

$thread.Runspace.Open()

return $thread
}

#Exécution d'une commande
Function Start-Thread {
param ([object]$thread = $null,[ScriptBlock]$scriptBlock = $(throw \&quot;The parameter -scriptBlock is required.\&quot;«»))

if ($thread -eq $null) {$thread = New-Thread}

if ($thread.Running) {throw \&quot;The thread is already running, please wait for it complete before trying again.\&quot;}

$thread.Pipeline = $thread.Runspace.CreatePipeline($scriptBlock)
$thread.Pipeline.Input.Close()
$thread.Pipeline.InvokeAsync()

return $thread
}[/code:1]

A l'utilisation :

[code:1]$th = Start-Thread -scriptBlock {gci c:\}[/code:1]

Pour le rendre synchrone je fais juste :

[code:1]Join-Thread $th[/code:1]

Le code de la dernière fonction :

[code:1]Function Join-Thread {
param ([object]$thread = $(throw \&quot;The parameter -thread is required.\&quot;«»))

if ($thread.Pipeline -ne $null) {
while ($true) {
Read-Thread -thread $thread
if ($thread.Pipeline.Error.EndOfPipeline -and $thread.Pipeline.Output.EndOfPipeline) {break}
$thread.Pipeline.Output.WaitHandle.WaitOne(250, $false) | Out-Null
}

Stop-Thread $thread

if ($thread.Pipeline.PipelineStateInfo.State -eq \&quot;Failed\&quot;«») {
throw $thread.Pipeline.PipelineStateInfo.Reason
}
}
}[/code:1]

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

Plus d'informations
il y a 14 ans 11 mois #4506 par Bredin Samuel
Re bonjour

Laurent Dardenne écrit:

Peut être que cette API, CreateProcessWithLogonW , est plus adaptée.


Finalement je suis parti sur une autre méthode, merci quand même Laurent. Désolé :(

J'ai utilisé un processus en remplacement d'un thread en utilisant System.Diagnostics.Process.

Voici un peu comment j'ai fait :

[code:1]$cred = Get-Credential
$procinfo = New-Object System.Diagnostics.ProcessStartInfo
$procinfo.set_UserName($cred.username.split('\')[1])
$procinfo.set_Domain($cred.username.split('\')[0])
$procinfo.set_Password($cred.password)
$procinfo.set_FileName('powershell')
$procinfo.set_Arguments('-command \&quot;&amp; {ri c:\fichier.txt}\&quot;')
$procinfo.set_UseShellExecute($false)
$procinfo.set_WorkingDirectory('c:\')
$procinfo.set_RedirectStandardOutput($true)
$procinfo.set_RedirectStandardError($true)

#Lancer process
$proc = [System.Diagnostics.Process]::«»Start($procinfo)

#Lire la sortie standard
$proc.StandardOutput.ReadToEnd()

#Erreur ?
$proc.StandardError.ReadToEnd().Length -eq 0

#Lire sortie erreur
$proc.StandardError.ReadToEnd()

#Tuer le process
$proc.Kill()

#Est ce que le process a fini
$proc.HasExited -eq $true

#Rendre le process \&quot;synchrone\&quot;
$proc.WaitForExit()[/code:1]

Peut-être que ça aidera certains.
Pour ma part je me suis apperçu trop tard que je ne pourrais pas utiliser cette méthode.
Etant donné qu'il n'y a pas de relation d'approbation inter-domaine sur mon infra, le compte n'est pas reconnu.

Même en intéractif une commande Runas /user:domaine\user toto.exe ne fonctionne pas.

J'ai omis de préciser que je suis en Powershell V1

Bonne journée à tous

Message édité par: Mephisto, à: 31/03/09 16:36<br><br>Message édité par: Mephisto, à: 31/03/09 16:37

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

Plus d'informations
il y a 14 ans 11 mois #4507 par Laurent Dardenne
Joli :)
Mephisto écrit:

Autant pour moi Laurent, un abus de langage.

Oui je le pense aussi.
Du coup j'ai un peu de mal à visualiser ce qui est installé sur le distant.
Tu veux exécuter d'un poste A un script local dont le traitement s'effectue sur un serveur B mais avec les droits de l'admin du serveur B et pas celui du poste A , c'est ça ?
Comment procéderais-tu manuellement ?

Tutoriels PowerShell

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

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