对服务器上的文件进行贴图显示,发生怪异行为 #253

Closed
toryln opened this Issue Nov 28, 2016 · 9 comments

Projects

None yet

4 participants

@toryln
toryln commented Nov 28, 2016 edited

image
image

以上红色字体是非预期行为,理应显示贴图才是。
@liulex 请liulex大大排查下,看哪里出了问题

ps:
系统版本:win10 x64 pro
Snipaste版本:1.10.2

以下为文本内容

今天使用Snipaste的命令行 --paste-files 对服务器上的文件进行贴图显示时遇到了问题,有些情况下Snipaste没有任何显示(此时配置中“不把文件路径转化成贴图”前面没有打勾)
经过仔细测试,发现bug行为还有些怪异,为了更好地说明情况,下面的测试用例是在Word中编辑,然后直接转为图片粘到Github上来的(github的格式编排太难用了)

首先,我的内网服务器上(已启用了Samba服务)有一个图片文件:
\192.168.199.1\home\test.jpg
该服务器已经在本地映射成为网络驱动器Z盘:

现在将配置中的“不把文件路径转化成贴图”前面打上勾,进行如下步骤测试:

一、 双击Z盘符进入文件夹

1、 Snipaste若是由鼠标左键双击启动而来的
1) 对test.jpg进行Ctrl+C拷贝,然后贴图,可以正常显示图片
2) 使用以下命令行调用Snipaste进行贴图,可以正常显示图片
D:\Snipaste\Snipaste.exe --paste-files "Z:\test.jpg"
2、 Snipaste若是以管理员身份启动而来的
1) 对test.jpg进行Ctrl+C拷贝,然后贴图,显示成了该文件的路径:

2) 使用以下命令行调用Snipaste进行贴图,则无任何显示(贴图或路径都没显示)
D:\Snipaste\Snipaste.exe --paste-files "Z:\test.jpg"

二、 在资源管理器中输入地址 \192.168.199.1\home 进入目录

Snipaste不管是由鼠标左键双击启动还是以管理员身份启动而来,均有如下行为:

  1. 对test.jpg进行Ctrl+C拷贝,然后贴图,可以正常显示图片
  2. 使用以下命令行调用Snipaste进行贴图
    D:\Snipaste\Snipaste.exe --paste-files \192.168.199.1\home\test.jpg
    D:\Snipaste\Snipaste.exe --paste-files \192.168.199.1/home/test.jpg
    Snipaste都将该文件显示为文件的路径:
@septs
Collaborator
septs commented Nov 28, 2016

请将图片内 内容 更换为文本描述 方便他人进行搜索及查找

@liulex
Owner
liulex commented Nov 28, 2016

版本是 1.10.2 吗?

@toryln
toryln commented Nov 28, 2016

是 1.10.2

@septs
Collaborator
septs commented Nov 28, 2016

这是两个问题

  1. 绝对路径的识别与处理
  2. UNC 路径的识别与处理
    (这里需要考虑因网络缘故导致的响应超时问题
    (因这个问题或许需要将 贴图 设计成异步加载

@liulex

@liulex
Owner
liulex commented Nov 28, 2016 edited

OK,我有空试试……

@liulex liulex added the bug label Nov 29, 2016
@liulex
Owner
liulex commented Nov 29, 2016

“不把文件路径转化成贴图” 行为不一致的问题已经修复。

问题二,即 smb 路径的识别也修复了。

问题一,即普通用户权限可以贴出网络驱动器中的文件,管理员权限反而不能,这个倒还没想出解决办法。似乎是 Windows 的某种策略导致的。

比如,使用管理员权限打开的 Snipaste,贴图就无法接受文件的拖拽,原因是权限低的进程(即文件资源管理器)无法与权限高的进程进行交互。(链接)
或许问题一也是类似的原因?

@liulex
Owner
liulex commented Nov 29, 2016

从代码上来说,就是以普通用户权限启动的时候,QFile("Z:\test.jpg").exists() 是返回 true 的;以管理权限启动的时候,就返回 false 了……

@orzFly
orzFly commented Nov 29, 2016 edited

这个问题微软的知识库里有写:Mapped drives are not available from an elevated prompt when UAC is configured to "Prompt for credentials" in Windows

概括一下就是说:

  • UAC 启用的时候,每个用户实际上有两个 session,一个 session 是没有管理员特权的,还有一个 session 是有管理员特权的。
  • 映射网络驱动器的时候,系统会在 DosDevices 对象里创建一个符号链接对象把指定的盘符映射到网络路径(或者本地路径,如使用 subst)。
  • 上面这个对象是属于某个 session 的,在 session 之间不共享。

所以微软给的解决方案有两个:

  • 自己用管理员权限再映射一下,比如写个批处理。
  • 改组策略:Local Computer Policy\Windows Settings\Security Settings\Local Policies\Security Options 里的 Prompt for consent,修改成 User Account Control: Behaviour of the elevation prompt for administrators in Admin Approval Mode

另外还有一种第三方提供的方法:改注册表 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/System 里的 DWORD 值 EnableLinkedConnections 为 1,但是文章中指出在某些系统上好像有 bug(似乎是说在 Windows 8 之类的系统上,如果你映射 Z:\ => \\server\share\folder,他自动给管理员 session 映射的是 Z:\ => \\server\share,少了 \folder)。

总而言之我个人建议自己用管理员权限再映射一下就好了,另外两个改系统设置的看起来要么有 bug 要么会影响其他功能。

@toryln toryln closed this Dec 1, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment