You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python中通过win32com.client创建快捷方式时自动解除Windows安全拦截?

如何在Python中通过win32com.client创建快捷方式时自动解除Windows安全拦截?

嘿,我完全懂你遇到的这个麻烦——用win32com.client创建的快捷方式被Windows标记为“潜在不安全”,每次打开都弹确认窗口,手动运行Unblock-File foo.lnk能解决,但想在创建快捷方式的同时自动搞定对吧?

其实这个安全提示的背后,是Windows给文件加了一个NTFS备用数据流(ADS),名为:Zone.Identifier,用来标记文件的来源区域(比如互联网区域就会触发拦截)。我们只需要在创建完快捷方式后,删除这个数据流就行,效果和Unblock-File完全一样。下面给你两种可行的Python实现方法:


方法一:用pywin32的win32file模块直接删除数据流

如果你已经安装了pywin32库(毕竟你已经在用到win32com.client了),可以直接用win32file模块来删除这个标记数据流:

import win32com.client
import win32file

# 原有创建快捷方式的代码
shell = win32com.client.Dispatch("WScript.Shell")
shortcut_path = "foo.lnk"
shortcut = shell.CreateShortCut(shortcut_path)
shortcut.Targetpath = "C:"
shortcut.WorkingDirectory = "C:"
shortcut.Arguments = " ".join(["my", "arguments"])
shortcut.WindowStyle = 3
shortcut.save()

# 自动解除安全拦截:删除Zone.Identifier数据流
try:
    win32file.DeleteFile(f"{shortcut_path}:Zone.Identifier")
except Exception as e:
    # 如果数据流不存在(比如没被标记),直接忽略异常就行
    pass

方法二:用subprocess调用cmd命令删除数据流

如果不想额外依赖win32file模块,也可以通过调用Windows的cmd命令来删除这个数据流,代码更轻量化:

import win32com.client
import subprocess
import os

# 原有创建快捷方式的代码
shell = win32com.client.Dispatch("WScript.Shell")
shortcut_path = "foo.lnk"
shortcut = shell.CreateShortCut(shortcut_path)
shortcut.Targetpath = "C:"
shortcut.WorkingDirectory = "C:"
shortcut.Arguments = " ".join(["my", "arguments"])
shortcut.WindowStyle = 3
shortcut.save()

# 调用cmd命令删除Zone.Identifier数据流
full_path = os.path.abspath(shortcut_path)
subprocess.run(
    ["cmd.exe", "/c", f'del "{full_path}:Zone.Identifier"'],
    check=False,
    stdout=subprocess.DEVNULL,
    stderr=subprocess.DEVNULL
)

补充说明

  • 这两种方法本质上和Unblock-File做的是同一件事:移除Windows用来标记文件来源的隐藏数据流,不会对快捷方式本身造成任何影响。
  • 一般来说,本地程序创建的快捷方式不会被标记,但如果你的程序是在某些特殊场景下运行(比如从网络共享目录创建,或者程序自身被标记为来自互联网),就会触发这个安全机制,这时候上面的代码就能派上用场。

备注:内容来源于stack exchange,提问作者fsdfsdfsdfsdfsdf

火山引擎 最新活动