New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

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

Comments

Projects
None yet
4 participants
@toryln

toryln commented Nov 28, 2016

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

This comment has been minimized.

Show comment
Hide comment
@septs

septs Nov 28, 2016

Collaborator

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

Collaborator

septs commented Nov 28, 2016

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

@septs

This comment has been minimized.

Show comment
Hide comment
Collaborator

septs commented Nov 28, 2016

@liulex

This comment has been minimized.

Show comment
Hide comment
@liulex

liulex Nov 28, 2016

Member

版本是 1.10.2 吗?

Member

liulex commented Nov 28, 2016

版本是 1.10.2 吗?

@toryln

This comment has been minimized.

Show comment
Hide comment
@toryln

toryln Nov 28, 2016

是 1.10.2

toryln commented Nov 28, 2016

是 1.10.2

@septs

This comment has been minimized.

Show comment
Hide comment
@septs

septs Nov 28, 2016

Collaborator

这是两个问题

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

@liulex

Collaborator

septs commented Nov 28, 2016

这是两个问题

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

@liulex

@liulex

This comment has been minimized.

Show comment
Hide comment
@liulex

liulex Nov 28, 2016

Member

OK,我有空试试……

Member

liulex commented Nov 28, 2016

OK,我有空试试……

@liulex liulex added the bug label Nov 29, 2016

@liulex

This comment has been minimized.

Show comment
Hide comment
@liulex

liulex Nov 29, 2016

Member

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

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

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

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

Member

liulex commented Nov 29, 2016

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

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

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

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

@liulex

This comment has been minimized.

Show comment
Hide comment
@liulex

liulex Nov 29, 2016

Member

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

Member

liulex commented Nov 29, 2016

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

@orzFly

This comment has been minimized.

Show comment
Hide comment
@orzFly

orzFly Nov 29, 2016

这个问题微软的知识库里有写: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 要么会影响其他功能。

orzFly commented Nov 29, 2016

这个问题微软的知识库里有写: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