Suponiendo que tengo una unidad asignada M:\
y \\SomeServer\SomeShare
en PowerShell, estoy en la carpeta, M:\SomeFolder
¿cómo la convierto a una ruta UNC, es decir \\SomeServer\SomeShare\SomeFolder
?
Respuesta1
Soy bastante nuevo en PowerShell, por lo que el siguiente código puede ser de mala calidad. Sin embargo, debería obtener la información que desea:
$currentDirectory = Get-Location
$currentDrive = Split-Path -qualifier $currentDirectory.Path
# Mapping a non-network drive? Check the DriveType enum documentation https://docs.microsoft.com/en-us/dotnet/api/system.io.drivetype?view=net-6.0
$logicalDisk = Get-CimInstance -ClassName Win32_LogicalDisk -filter "DriveType = 4 AND DeviceID = '$currentDrive'"
$uncPath = $currentDirectory.Path.Replace($currentDrive, $logicalDisk.ProviderName)
$uncPath debe contener la ruta UNC que estás buscando.
Respuesta2
Para cualquiera interesado en el script RunAs para StExBar es:
param([string] $username)
$path = Get-Location
$currentDrive = Split-Path -qualifier $path
$logicalDisk = Get-WmiObject Win32_LogicalDisk -filter "DeviceID = '$currentDrive'"
if ($logicalDisk.DriveType -eq 4)
{
$path = Join-Path $logicalDisk.ProviderName (Split-Path -NoQualifier $path)
}
$systemroot = [System.Environment]::SystemDirectory
&"$systemroot\runas.exe" /user:$username "$systemroot\windowspowershell\v1.0\powershell.exe -NoExit -Command \`" &{ Set-Location '$path' }\`""
Y la línea de comando en StExBar es:
C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -Command "&{ &'%homedrive%%homepath%\RunAs.ps1' 'domain\username' }"
Reemplace la ruta con el lugar donde guarde el script RunAs.ps1. A mí me gusta almacenar el mío en la raíz de mi carpeta de inicio.
Respuesta3
Me doy cuenta de que esta es una vieja pregunta, pero quería compartir otra forma de lograrlo:
$drive = Get-PSDrive -Name (get-location).Drive.Name
$root = if($drive.DisplayRoot -ne $null){$drive.DisplayRoot} else {$drive.Root}
Join-Path -Path $root -ChildPath $drive.CurrentLocation
Get-PSDrive recuperará toda la información sobre una unidad (nombre, espacio usado/libre, proveedor, raíz y ubicación actual) y pasar el parámetro Nombre como la letra de la unidad actual (usando get-location) permite que esto funcione en múltiples escenarios. (Esto también recuperará información sobre las unidades locales de la máquina).
Para que funcione tanto en unidades locales como en unidades asignadas, la comparación se realiza para completar $root con la letra de la unidad o la ubicación de la red. .Root devolverá la letra de la unidad y .DisplayRoot recuperará la ruta de red (nula si es una ruta local, que es el motivo de la comparación)
Usando Join-Path, puede reunir la ruta, que devolverá una letra de unidad y la ubicación actual si es una ruta local, una ruta de red y una ubicación actual si es una unidad asignada.
Respuesta4
Entonces, combinando las mejores respuestas aquí en una sola línea; Prueba la ruta actual como UNC, asigna una unidad a la ruta actual, cambia a una nueva unidad asignada; si ya es una unidad asignada, no se realiza ninguna acción.
IF ((Get-Location | %{$_.Drive}) -eq $NUL){$dltr=%{for($j=67;gdr($d=[char]++$j)2>0){}$d}; New-PSDrive –Name $dltr –PSProvider FileSystem –Root ((Get-Location).ProviderPath) –Persist; Set-Location -Path $dltr`: -PassThru}
No pretende responder al OP, solo agregar contenido útil. Tenía un script que necesitaba una unidad asignada en lugar de rutas UNC, así que hice esto para verificar si se estaba usando una UNC en PS, luego asigne una unidad usando esa ruta UNC y luego cambié a esa letra de unidad.