2011-01-20 23 views
44

Estoy ejecutando PowerShell en una máquina virtual Windows 7 x64. Tengo una carpeta compartida en el host mapeada como una unidad de red (Z :). Cuando corro PS normalmente puedo acceder a esa unidad muy bien, pero si lo ejecuto "como administrador" que me dice:No se puede acceder a la unidad de red en PowerShell ejecutándose como administrador

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 

¿Cómo accedo a las unidades de red como administrador?

+3

relacionadas: http://stackoverflow.com/questions/1267085/vista-uac-trouble-mapping-network-drives. Parece que las opciones son un cambio de registro o reasignación de la unidad en el proceso elevado. – ig0774

+0

Probé el hack de registro y eso no ayudó, pero reasignar el disco en un proceso elevado sí, gracias. Deberías publicar eso como una respuesta. – EMP

Respuesta

0

¿Qué tal mapear un nuevo psdrive para acceder a esos datos? Los PSDrives funcionan igual de bien o incluso mejor que las unidades asignadas al sistema cuando se escriben scripts o se accede a los almacenes de datos de red en powershell.

instrucciones para usar el Nueva PSDrive cmdlet está aquí: Technet:New-PSDrive

Si no quieren tener que hacer una nueva psdrive cada vez que se podría añadir a los perfiles, tanto para el administrador y su cuenta de usuario y estará automáticamente disponible cada vez que abra powershell.

~ Dan

64

Al final, la solución era simplemente para volver a asignar la letra de unidad mientras se ejecuta como administrador:

net use Z: "\\vmware-host\Shared Folders" 

No tiene que hacerse desde el mismo PowerShell instancia (o de PowerShell en absoluto): es algo que debe hacerse una vez para toda la sesión de inicio de sesión.

+0

Una forma práctica de hacerlo sin salir del shell es utilizar 'runas': ' runas/usuario: administrador net use Z: "\\ vmware-host \ Shared Folders" ' – andersonvom

+1

Funciona para mí. Y para otros parámetros de '' net use'' como ''/persistent'' en el siguiente inicio de sesión, consulte el uso de Microsoft net [documentation] (http://technet.microsoft.com/en-us/library/gg651155 (v = ws) .10) .aspx) – Casey

+0

Si necesita que la unidad sea visible para cuentas de usuario que no sean usted, p. Ej. tareas/servicios programados, pruebe [mi respuesta] (http://stackoverflow.com/a/26579901/33080), que también le permite ver la unidad, ya sea que esté elevado o no. –

6

En mi caso, pude simplemente usar la ruta UNC en lugar de la asignación de unidad y funcionó bien.

Así, por tu ejemplo, en lugar de utilizar la unidad asignada Z: \, acabo de utilizar "\\ vmware-anfitrión \ carpeta compartida" como el camino.

0

Parece un problema conocido de Microsoft desde Vista.
Microsoft Knowled base article con inseguro arreglo de registro.

Actualmente estamos evaluando este enfoque ya que algunos de nuestros chicos tienen sentimientos que la máquina no se inicie después de esto ;-)

4

Otra solución alternativa que me llevó edades encontrar es ejecutar net use de una tarea programada como la cuenta NT AUTHORITY \ SYSTEM. Aparentemente drives mapped under this account show up for all users and all elevation levels.

He probado esto y funciona incluso en recursos compartidos NFS (que puede ser un poco quisquilloso). Basta con crear una tarea programada configurado para ejecutarse al iniciar el sistema, y ​​especificar el comando habitual:

net use //server/share Z: /persistent:no 

Es, posiblemente, podría funcionar para funcionar sólo una vez con /persistent:yes, pero no he probado eso. De acuerdo, "simplemente asócielo de nuevo" también funciona, pero ese disco aún no será visible para las tareas programadas que se ejecutan en diferentes contextos. La desventaja es que todos los usuarios reales lo ven también, por lo que no es tan bueno para configuraciones multiusuario.

3

estoy usando la siguiente solución hacky donde recrear "faltantes" en PSDrives profile.ps1 cuando Powershell se está ejecutando en modo elevado.

Gist

# 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 
     } 
    } 
} 
Cuestiones relacionadas