Symlink到Windows中不存在的驱动器


1

当我尝试创建到尚不存在的Windows驱动器的目录连接时,出现以下消息:

C:\>mklink H H:\ /J
Local volumes are required to complete the operation.

我想在Windows上有一个目录,该目录将每个驱动器号连接到该目录中的对应字母。我想通过应用程序从任何外部设备共享媒体,而不必在显示“新”驱动器号时更改设置。

似乎符号链接可以指向不存在的目标,因为操作系统不检查目标是否存在,但是它们不能链接到不存在的驱动器。是否有已知的解决方案来建立这样的目录联结?

一种解决方案是建立目录符号链接(通过使用/ D标志而不是/ J标志),但这不是我想要的,我想要目录连接。


为什么目录连接不够好?
LPChip 2014年

/ h选项(硬链接)呢?您可以将其归档,而使用
俯冲

@LPChip(1)我想要一个目录连接(/ J标志),以便如果我想通过网络共享此目录,则可以在服务器端解析链接。(2)我将尝试使用/ h选项并提供一些反馈(我必须首先解决一些管理员特权,叹气)
Simon Streicher 2014年

Answers:


2


使用SUBST欺骗操作系统只能使用连接点。使用父文件夹来阻止操作系统在进行维护时无休止地爬行
非常重要/deny Everyone:(S,RD)。像“搜索”,“搜索索引器”,“防病毒”,“文件历史记录”一样,他们还知道其他内容。

下面的详细信息和脚本


我看到您对以下大多数内容有所了解,所以让我们为其他人总结一下。

Symlinks
目录Symlinks和Junctions是非常不同的东西。
您应该关注的主要区别是,您不能访问远程计算机上的符号链接,而该符号链接链接到该远程计算机的本地路径。通过符号链接到远程计算机上的F:\,将尝试打开本地PC的F:\。
Sym-link就像一个链接文件,其中包含有关真实对象路径的信息。您可以符号链接到任何对象,甚至是相对路径。
您可以创建目录符号链接到不存在的驱动器,但这将无法通过LAN帮助您

连接是NTFS的东西。但是,尽管连接必须位于NTFS上,但它可以指向其他FS上的文件夹。它“重定向”对联结文件夹的访问。您可以访问指向远程文件夹的远程计算机上的联结。
注意权限。目标目录和交界处。(带/ L的icacls)

对于文件,有文件符号链接和链接。目录没有硬链接,但Junction与它非常接近。硬链接是指向驱动器上相同位置的多个文件记录。因此,您无法跨驱动器进行硬链接。

注意:不应创建连接动态地点的路口。即使将不同的FS挂载为相同的字母也可以,但是这不是受支持的方式。您应该为每个驱动器创建一个共享。但这会在“网络位置”中造成混乱,并且无法使用权​​限来控制访问。


这是我的自定义脚本的一部分。它是便携式的,将其放在bat文件中并以Admin身份运行。

  • 创建Drives共享,其中Junction指向整个字母表中字母的驱动器。任何身份验证的用户都可以访问共享驱动器。(不是来宾和没有密码的用户)用户将具有与本地登录相同的访问权限,但是即使对于管理员,UAC也不会提供提升的访问权限。
  • 为当前用户的下载创建Download-Private共享-如果不需要,请删除该部分
  • 这两个共享的文件夹位于“%PUBLIC%\ Private共享”中,例如“ c:\ Users \ Public \ Private共享”,该文件夹将直接不可访问,以避免后台服务陷入循环。您仍然可以通过在地址栏中写入完整路径或创建Windows快捷方式来直接访问其中的文件夹
  • 要调整整个文件夹的权限,请编辑“私人共享”,但要调整某些驱动器号,必须使用带/ L参数的icacls

echo. & echo === "Private shares"

echo *** Creating Folders
rem --- Private shares - inheriting Authenticated Users access from Public folder
if not exist "%PUBLIC%\Private shares" mkdir "%PUBLIC%\Private shares"
rem - remove DENY temporarily
icacls "%PUBLIC%\Private shares" /remove:d Everyone 2>nul
if not exist "%PUBLIC%\Private shares\Drives" mkdir "%PUBLIC%\Private shares\Drives"

echo *** Creating Downloads-Private share
echo *   Creating link
mklink /J "%PUBLIC%\Private shares\Downloads-%USERNAME%" "%USERPROFILE%\Downloads"
echo *   Creating shares
net share Downloads-Private /delete 2>nul
net share Downloads-Private="%PUBLIC%\Private shares\Downloads-%USERNAME%" /unlimited /remark:"Only for authenticated users" /grant:everyone,FULL

echo *** Creating Drives share
echo *   Creating link
for %%a in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    subst %%a: \
    mklink /J "%PUBLIC%\Private shares\Drives\%%a" %%a:\
    subst %%a: /d
)

echo *   Creating shares
net share Drives /delete 2>nul
rem - /grant:everyone,FULL --- No worry, this is on Microsoft's recommendation. Grant full access to shares and handle access through permissions. It's more portable, safer and simpler.
net share Drives="%PUBLIC%\Private shares\Drives" /unlimited /remark:"Only for authenticated users" /grant:everyone,FULL

echo *** Changing "Private share" permissions
rem - this is the same way as Windows is handling legacy folders inside Users directory
rem   this must be done, or many services will keep crawling though an endless path loop
icacls "%PUBLIC%\Private shares" /deny Everyone:(S,RD)

如果需要删除使用此脚本创建的文件夹,则需要使用Properties-Permission或通过以Admin(管理员)身份运行的命令来对其进行解锁:icacls "%PUBLIC%\Private shares" /remove:d Everyone
请勿保持该文件夹的解锁状态,不要立即删除该文件夹,或者使用icacls "%PUBLIC%\Private shares" /deny Everyone:(S,RD)


EDIT 2019:我现在正在为此使用PowerShell。这是创建所有驱动器共享的部分(它与上面的Batch几乎相同):

$aclFSR_Syn_ReadData = [System.Security.AccessControl.FileSystemRights]::Synchronize -bor [System.Security.AccessControl.FileSystemRights]::ReadData
$aclInh_None = [System.Security.AccessControl.InheritanceFlags]::None
$aclProp_NoFlags = [System.Security.AccessControl.PropagationFlags]::None
$aclT_Deny = [System.Security.AccessControl.AccessControlType]::Deny
$aclRule_Interactive_SRD_NoInh_Deny = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList 'INTERACTIVE', $aclFSR_Syn_ReadData, $aclInh_None, $aclProp_NoFlags, $aclT_Deny

$PathPrivate = 'C:\PATH\TO\SHARED_LOCAL_FOLDER

$aclDrives = Get-Acl -Path "$PathPrivate\Drives"

# - remove DENY temporarily
[void]$aclDrives.RemoveAccessRuleAll($aclRule_Interactive_SRD_NoInh_Deny)
Set-Acl -Path "$PathPrivate\Drives" -AclObject $aclDrives

# --- Drives Share
Write-Host "`n - Drives Share"

Write-Host "Linking drives: " -NoNewline
foreach ($d in @("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")) {
    Write-Host "$d, " -NoNewline
    if (-not (Get-PSDrive -Name $d -ErrorAction SilentlyContinue)) {
        New-PSDrive -Name $d -PSProvider FileSystem -Root '\' | Out-Null
        $tmpDrive = $true
    } else { $tmpDrive = $false }
    if (-not (Test-Path -Path "$PathPrivate\Drives\$d")) { New-Item -Path "$PathPrivate\Drives\$d" -ItemType Junction -Value "${d}:\" | Out-Null }
    if ($tmpDrive) { Remove-PSDrive -Name $d }
}
Write-Host ''

Remove-SmbShare -Name 'Drives' -Confirm:$false -ErrorAction SilentlyContinue
New-SmbShare -Name 'Drives' -Path "$PathPrivate\Drives" -Description 'Only for authenticated users' -FullAccess Everyone | Out-Null

Write-Host "Applying permissions for Drives"
# - Blocking access to Private share folder to avoid searcher loops
[void]$aclDrives.AddAccessRule($aclRule_Interactive_SRD_NoInh_Deny)

# - limit access to authorized accounts only (optional)
# [void]$aclDrives.AddAccessRule($YOUR_ACL_RULE_TO_LIMIT_THE_SHARE)

Set-Acl -Path "$PathPrivate\Drives" -AclObject $aclDrives

如果有人可以确认此脚本有效,则将其标记为正确答案。我目前没有Windows机器。
Simon Streicher
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.