2013-01-23 1 views
15

Je travaille avec PowerShell, exécution d'un script (à partir de ma console) qui comprend cette ligne:J'ai besoin d'aide pour comprendre les problèmes de sécurité PowerShell et accès aux fichiers

$inpath = "C:\users\xxxxx\path\foo\bar" 

et je continue à obtenir cette erreur:

Get-Content : Access to the path 'C:\users\xxxxx\path\foo\bar' is denied. 
At C:\users\xxxxx\path\foo\testscript.ps1:53 char:12 
+ Get-Content <<<< $txtfile | Get-WordCount -Exclude (Get-Content c:\temp\exclude.txt) | select -First 15 
    + CategoryInfo   : PermissionDenied: (C:\users\xxxxx\path\foo\bar:String) [Get-Content], UnauthorizedAcc 
    essException 
    + FullyQualifiedErrorId : GetContentReaderUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetContentCommand 

Les scripts et les fichiers cible se trouvent tous sur mon disque local. Je peux accéder aux fichiers dans l'Explorateur, les voir/éditer/les enregistrer en utilisant NotePad, et je n'ai aucune restriction de permissions. Lorsque je suis sur la ligne de commande, je peux exécuter la cmdlet get-content avec succès sur les fichiers de mon chemin. Je peux changer les répertoires PS C:> cd C:\users\xxxxx\path\foo\bar et liste avec succès ce qui est là. Encore plus intéressant, je peux dupliquer la ligne qui est erronée dans le script, et ne pas recevoir une erreur sur la ligne de commande.

PS C:\users\xxxxx\path\foo> $inpath = "C:\users\xxxxx\path\foo\bar" 
PS C:\users\xxxxx\path\foo> 

Cela me fait soupçonner que l'erreur « Autorisation refusée » est en fait quelque chose d'autre, ou quelque chose d'assez vague que j'ai aucune idée de comment procéder au dépannage. Est-il possible pour PS d'avoir des permissions différentes de l'utilisateur sous lequel il fonctionne? Quelqu'un at-il déjà vu ce comportement et comment avez-vous résolu le problème? Je suis sûr qu'il existe une solution simple que je ne connais pas.

+0

Comment vous exécutez le script et avec quelle autorisation? Un travail dans le planificateur de tâches? Le script fonctionne-t-il si vous appelez le script depuis votre console? –

+0

Quel fichier essayez-vous de lire? (Il est parfaitement possible d'avoir accès à un dossier mais pas aux fichiers qu'il contient.) – Richard

+0

@Graimer - le script s'exécute depuis la console; Je ne sais pas quelles sont les autorisations du script, comment les rechercher ou comment les définir si elles diffèrent de celles de mes utilisateurs. Cela ne fonctionne pas à partir de la console AS A SCRIPT (par exemple, PS c: \ foo>. \ Script.ps1), mais cela fonctionne si je tape la ligne individuelle comme invite de la console. – dwwilson66

Répondre

23
Get-Content : Access to the path 'C:\users\xxxxx\path\foo\bar' is denied. 
At C:\users\xxxxx\path\foo\testscript.ps1:53 char:12

Ce chemin ne ressemble pas à un fichier mais à un dossier.

Etes-vous sûr d'ajouter le nom de fichier au dossier et de le passer à Get-Content?

Windows donne accès refusé lorsque vous essayez d'ouvrir un répertoire comme s'il s'agissait d'un fichier sans passer d'indicateurs supplémentaires; et .NET ne transmet pas ces indicateurs (il existe quelques circonstances spécifiques pour l'ouverture d'un dossier, mais ils ne s'appliquent pas ici).

+0

Vous êtes corrent, '$ inpath' est un chemin. Le script utilise 'foreach' avec le chemin ...' foreach ($ doc dans $ inpath {do-function}) '. J'ai recyclé ce code d'un script antérieur qui fonctionne parfaitement ... - dwwilson66 – dwwilson66

+0

@ dwwilson66: Je ne parle pas d'une variable: * regarde le message d'erreur *, le chemin qu'il montre est le chemin passé à 'Get -Content' et n'a pas pu être ouvert. – Richard

0

Au lieu de cela: (selon votre commentaire)

foreach ($doc in $inpath) { do-function } 

essayez ceci:

foreach ($doc in (gci $inpath)) { do-function } 

Vous faites un foreach sur un objet de chaîne au lieu de vos éléments de dossier.

3

Get-Content lit le contenu du fichier et non le dossier. S'il vous plaît ajouter . après votre chemin de dossier comme ci-dessous.

Get-Content "D:\Logs\*.*" | ?{($_|Select-String "test")} 

Si vous souhaitez passer par tous les dossiers ainsi en dessous puis ajouter récursif comme ci-dessous:

Get-Content "D:\Logs\*.*" -Recurse | ?{($_|Select-String "test")} 
+0

Il n'y a pas de paramètre -Recurse pour Get-Content – dzampino

Questions connexes