Question Nouveau thread sous une autre identité
- Bredin Samuel
- Auteur du sujet
- Hors Ligne
- Membre senior
Réduire
Plus d'informations
- Messages : 52
- Remerciements reçus 0
il y a 14 ans 11 mois #4499
par Bredin Samuel
Nouveau thread sous une autre identité a été créé 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
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6300
- Remerciements reçus 68
il y a 14 ans 11 mois #4500
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Nouveau thread sous une autre identité
Mephisto écrit:
Le texte du lien cité référence l'API LogonUser, donc Google \"PowerShell LogonUser\", 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 \"C# LogonUser\" :
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:
Regarde du coté de l'emprunt d'identité .Quelqu'un aurait une idée ?
Le texte du lien cité référence l'API LogonUser, donc Google \"PowerShell LogonUser\", 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 \"C# LogonUser\" :
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6300
- Remerciements reçus 68
il y a 14 ans 11 mois #4501
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Nouveau thread sous une autre identité
Peut être que cette API,
CreateProcessWithLogonW
, est plus adaptée.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Bredin Samuel
- Auteur du sujet
- Hors Ligne
- Membre senior
Réduire
Plus d'informations
- Messages : 52
- Remerciements reçus 0
il y a 14 ans 11 mois #4504
par Bredin Samuel
Réponse de Bredin Samuel sur le sujet Re:Nouveau thread sous une autre identité
Re bonjour
Laurent Dardenne écrit:
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 \"Runspace\" $runspace
$thread | Add-Member NoteProperty \"Pipeline\" $null
$thread | Add-Member ScriptProperty \"Running\" { 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 \"The parameter -scriptBlock is required.\"«»))
if ($thread -eq $null) {$thread = New-Thread}
if ($thread.Running) {throw \"The thread is already running, please wait for it complete before trying again.\"}
$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 \"The parameter -thread is required.\"«»))
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 \"Failed\"«») {
throw $thread.Pipeline.PipelineStateInfo.Reason
}
}
}[/code:1]
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 \"Runspace\" $runspace
$thread | Add-Member NoteProperty \"Pipeline\" $null
$thread | Add-Member ScriptProperty \"Running\" { 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 \"The parameter -scriptBlock is required.\"«»))
if ($thread -eq $null) {$thread = New-Thread}
if ($thread.Running) {throw \"The thread is already running, please wait for it complete before trying again.\"}
$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 \"The parameter -thread is required.\"«»))
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 \"Failed\"«») {
throw $thread.Pipeline.PipelineStateInfo.Reason
}
}
}[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Bredin Samuel
- Auteur du sujet
- Hors Ligne
- Membre senior
Réduire
Plus d'informations
- Messages : 52
- Remerciements reçus 0
il y a 14 ans 11 mois #4506
par Bredin Samuel
Réponse de Bredin Samuel sur le sujet Re:Nouveau thread sous une autre identité
Re bonjour
Laurent Dardenne écrit:
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 \"& {ri c:\fichier.txt}\"')
$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 \"synchrone\"
$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
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 \"& {ri c:\fichier.txt}\"')
$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 \"synchrone\"
$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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6300
- Remerciements reçus 68
il y a 14 ans 11 mois #4507
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Nouveau thread sous une autre identité
Joli
Mephisto écrit:
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 ?
Mephisto écrit:
Oui je le pense aussi.Autant pour moi Laurent, un abus de langage.
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 : 0.078 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les initiés
- Nouveau thread sous une autre identité