web-dev-qa-db-fra.com

Impossible d'accéder au lecteur réseau dans PowerShell exécuté en tant qu'administrateur

J'utilise PowerShell sur une machine virtuelle Windows 7 x64. J'ai un dossier partagé sur l'hôte mappé en tant que lecteur réseau (Z :). Lorsque je lance PS normalement, je peux très bien accéder à ce lecteur, mais si je le lance "en tant qu'administrateur", il me dit:

Set-Location : Cannot find drive. A drive with the name 'Z' does not exist.
At line:1 char:13
+ Set-Location <<<<  Z:
    + CategoryInfo          : ObjectNotFound: (Z:String) [Set-Location], DriveNotFoundException
    + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.SetLocationCommand

Comment accéder aux lecteurs réseau en tant qu'administrateur?

52
EMP

En fin de compte, le correctif consistait simplement à remapper la lettre de lecteur lors de l'exécution en tant qu'administrateur :

Net Use Z: "\\vmware-Host\Shared Folders"

Cela ne doit pas nécessairement être fait à partir de la même instance PowerShell (ou à partir de PowerShell du tout) - c'est simplement quelque chose à faire une fois pour toute la session d'ouverture de session.

72
EMP

Dans mon cas, j'ai pu utiliser simplement le chemin UNC au lieu du mappage de lecteur et cela a bien fonctionné.

Ainsi, selon votre exemple, au lieu d'utiliser le lecteur mappé Z: \, je viens d'utiliser "\\ vmware-Host\Shared Folder" comme chemin.

8

Une autre solution qui m'a pris ages consiste à exécuter Net Use à partir d'une tâche planifiée sous le compte NT AUTHORITY\SYSTEM. Apparemment, les lecteurs mappés sous ce compte s'affichent pour tous les utilisateurs et tous les niveaux d'altitude .

J'ai testé cela et cela fonctionne même sur les partages NFS (ce qui peut être un peu capricieux). Créez simplement un ensemble de tâches planifiées à exécuter au démarrage du système et spécifiez la commande habituelle:

Net Use Z: \\server\share /persistent:no

Cela pourrait fonctionner de l'exécuter une seule fois avec /persistent:yes, mais je n'ai pas essayé. Certes, "il suffit de mapper à nouveau" fonctionne également, mais ce lecteur ne sera toujours pas visible pour les tâches planifiées exécutées dans des contextes différents. L'inconvénient est que tous les vrais utilisateurs le voient aussi, ce qui n'est pas très bien pour les configurations multi-utilisateurs.

5
Roman Starkov

J'utilise la solution hacky suivante dans laquelle je recrée les disques PSDrive "manquants" dans profile.ps1 lorsque Powershell s'exécute en mode élevé.

Essentiel

# Reconnect PSDrives for network connections when running with elevated privileges
$elevated = (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
if( $elevated ) {
    Net Use | ?{ $_ -match ":\s+\\\\"  -and !$_.StartsWith("Unavailable") } | %{
        $tokens = $_.split(":")
        $psdrivename = $tokens[0][$tokens[0].length-1]
        $path = $tokens[1].trim().split(" ")[0].trim()

        if( !(get-psdrive | ?{ $_.Name -eq $psdrivename } )) {
            write-Host ( "Restoring PSDrive for {0}: {1}" -f $psdrivename, $path )
            new-psdrive $psdrivename FileSystem $path | out-null
        }
    }
}  
3
Johan Andersson

Aucune des autres réponses n'a fonctionné pour moi; mais @ TimothyLeeRussell répondre m'a dirigé dans la bonne direction. 

Dans mon cas, j'avais un fichier .bat situé sur un lecteur réseau. Lorsque je l'exécutais en tant qu'administrateur, il clignotait simplement une fenêtre d'invite de commande et disparaissait instantanément; cela a bien fonctionné lorsque j'ai exécuté le contenu du fichier à partir d'une invite de commande élevée. 

Enfin, j'ai réalisé que j'avais essayé d'exécuter le fichier .bat à partir du lecteur réseau mappé. J'ai changé l'exécution du fichier pour utiliser le chemin UNC et cela a fonctionné.

0
Lews Therin

Cela ressemble à un problème connu de Microsoft depuis Vista.
Microsoft Article de base Knowled avec correctif de registre unsafe

Nous évaluons actuellement cette approche car certains de nos gars pensent que la machine pourrait ne pas démarrer après cela ;-)

0
Casey

Pourquoi ne pas mapper un nouveau psdrive pour accéder à ces données? Les lecteurs PSDrive fonctionnent aussi bien, sinon mieux, que les lecteurs mappés par le système lorsque vous écrivez des scripts ou accédez à des magasins de données réseau dans PowerShell. 

Les instructions d'utilisation de la cmdlet New-PSDrive sont les suivantes: Technet: New-PSDrive

Si vous ne souhaitez pas créer un nouveau psdrive à chaque fois, vous pouvez l'ajouter aux profils de l'administrateur et de votre compte d'utilisateur. Il sera automatiquement disponible à chaque fois que vous ouvrirez PowerShell.

~ Dan

0
thoughtpunch