Exécuter le bloc de code localement comme un autre utilisateur dans un script powershell
C'est quelque chose d'incroyablement simple, mais j'ai juste ne peut pas obtenir quoi que ce soit au travail. Je veux exécuter un bloc de code dans un script powershell en vertu d'un utilisateur spécifique. Le mot-clé est localement et je suis à l'aide de powershell 2.0.
Invoke-Command semble avoir besoin d'un hôte distant? Je lance le suivant et le message d'erreur que je vois semble suggérer comme beaucoup:
$strScriptUser = "DOMAIN\USER"
$strPass = "PASSWERD"
$PSS = ConvertTo-SecureString $strPass -AsPlainText -Force
$cred = new-object system.management.automation.PSCredential $strScriptUser,$PSS
Invoke-Command -ComputerName "." -scriptblock {
write-output "HI!"
} -Credential $cred
Start-Job-ScriptBlock n'est pas pris en charge avec powershell 2.0? Je lance le suivant et le message d'erreur que je vois semble suggérer comme beaucoup:
$strScriptUser = "DOMAIN\USER"
$strPass = "PASSWERD"
$PSS = ConvertTo-SecureString $strPass -AsPlainText -Force
$cred = new-object system.management.automation.PSCredential $strScriptUser,$PSS
Start-Job -ScriptBlock {
write-output "HI!"
} -Credential $cred
Je fais quelque chose de mal, ou est-il un autre moyen?
Ajouté: Voici ce que j'essaie de faire en premier lieu. Je suis en train de faire une tâche planifiée qui s'exécute lorsqu'un utilisateur se connecte à/déverrouiller un terminal qui écrit les informations de connexion dans un fichier. La tâche planifiée s'exécute en tant qu'utilisateur local afin d'obtenir le nom d'utilisateur, profil, etc. de l'information. Les informations d'ouverture de session est ensuite écrit dans un fichier journal à l'aide d'un compte d'utilisateur différent, qui est le seul compte qui peuvent modifier le fichier. Pour décourager l'accès aux informations d'identification d'ouverture de session dans le script que j'convertir le script pour un EXE à l'aide de PS2EXE.
Il peut être difficile de vous aider si la seule personne qui voit des messages d'erreur, c'est vous... 😉
Les messages d'erreur ne sont pas en anglais, donc je vais faire de mon mieux pour traduire. Pour Invoke-Command: "impossible de se connecter au serveur distant [localhost]. Le client n'a pas pu se connecter à la destination spécifiée. Veuillez confirmer que le service de destination est en cours d'exécution et est dans un état qui peut recevoir les demandes."
Le
Start-Job
solution a fonctionné pour moi dans PowerShell 3.0. (Bien sûr, vous devez appeler Wait-Job | Receive-Job
à réellement obtenir les résultats.)OriginalL'auteur wrieedx | 2014-09-01
Vous devez vous connecter pour publier un commentaire.
Voici une autre manière.
Avec l'-LoadUserProfile de l'interrupteur, ce qui a l'avantage de créer le profil de l'utilisateur si elle n'existe pas déjà.
OriginalL'auteur Nathan Hartley
Il aiderait à voir les messages d'erreur que vous n'êtes pas de nous montrer, mais je pense que la réponse à votre question est d'utiliser PowerShell Remoting que vous avez essayé avec
Invoke-Command
. Le nom de l'ordinateur.
est très bien comme c'estlocalhost
mais vous n'avez pas à avoir accès distant activé sur votre machine pour le faire.Pour activer l'accès distant, lancez
Enable-PSRemoting
dans powershell, ou d'exécuterwinrm quickconfig
dans une invite de commande.Si vous avez déjà accès distant est activé, alors vous pourriez être en essayant de faire de l'accès distant à un utilisateur non-administrateur. Si c'est le cas, jetez un oeil à la sortie de
Get-PSSessionConfiguration
. Vous obtiendrez une liste de points d'extrémité et les autorisations sont appliquées.Le point de terminaison, vous êtes connexion par défaut est appelé
Microsoft.Powershell
et vous pouvez changer les autorisations avecSet-PSSessionConfiguration
(assurez-vous d'utiliser le-ShowSecurityDescriptorUI
paramètre, sauf si vous voulez salir avec SDDL).Mais au lieu de cela, il devrait déjà être un groupe donné accès appelé
BUILTIN\Remote Management Users
que vous pouvez ajouter à votre compte d'utilisateur limité.Si rien de tout cela contribue, à donner plus de détails et les messages d'erreur.
Modifier
Après avoir vu l'explication de ce que vous êtes finalement en essayant d'accomplir, j'ai une autre suggestion pour vous.
Cela pourrait être une solution de compromis à faire ce que vous voulez sans remoting et sans exposer les informations d'identification de l'utilisateur privilégié.
Des problèmes avec l'approche actuelle:
Le principal problème que j'ai avec votre idée de départ, c'est que vous allez avoir besoin pour intégrer les informations d'identification dans le script, de sorte qu'utilisateur aura accès à des informations d'identification du compte qui peut modifier le fichier de toute façon.
Idéalement:
Vous disposez d'un service web que vous pourriez appeler avec votre limitée de l'utilisateur du script powershell dans lequel vous pouvez seulement de lui donner les informations de connexion et de ne pas obtenir quelque chose en retour. Donc, si vous voulez frapper une URL et faire un
POST
ou que ce soit avec les données que vous souhaitez vous connecter, mais que l'utilisateur ne peut jamais récupérer de l'info. Il pourrait être un peu au-delà de ce que vous êtes prêt à faire pour cela.Ah, oui. À propos de l'utilisateur de voir les informations d'identification, que j'allais utiliser PS2EXE pour activer le script dans un fichier EXE. Je devrais probablement avoir mentionné que trop. Vraiment une personne intelligente pourrait probablement extraire les informations d'ouverture de session à partir de l'EXE, mais je ne pense pas que quiconque où je travaille est capable de faire ça. De toute façon, à la fois de vos suggestions sonore très prometteurs et ont leurs propres mérites respectifs. Je vais essayer de les tester...
Il m'a fallu un certain temps, mais j'ai été en mesure d'obtenir la réponse ci-dessus de travail. J'ai créé 3 tâches, celle déclenchée par l'utilisateur d'ouverture de session, celle déclenchée par l'économiseur d'écran de déverrouillage, et un "helper" tâche qui écrit le réel les informations de connexion dans un fichier. Cacher le noir boîte de commande qui s'affiche lorsqu'un script powershell est exécuté a été un défi, ainsi que de trouver comment signer les scripts powershell et à déployer les certificats via le domaine. Aussi, il y avait des problèmes de permissions lors de la tentative de permettre à un utilisateur normal exécuter un non-planifiée des tâches de windows. Il n'était pas amusant, et il a fallu beaucoup trop de temps, mais je l'ai eu à travailler!!!
Pour l'enregistrement, j'ai été en mesure d'obtenir de Start-Job-ScriptBlock de travail, puis utiliser PS2EXE pour convertir le script powershell pour un exe. Mais le problème était que je ne pouvais pas obtenir le noir boîte de commande pour pas de pop-up à chaque fois que le fichier exe a été exécuté.
OriginalL'auteur briantist
Une autre approche est impresonation, il est une bonne option si vous n'êtes pas prêt pour activer l'accès distant.
Check this out - https://web.archive.org/web/20170410101407/poshcode.org/1867
Vous devriez vous suffit d'importer ce module et de mettre votre code entre
et
Wayback machine version archivée de l'article: web.archive.org/web/20170410101407/poshcode.org/1867
OriginalL'auteur olegk