RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 765571
Accepted
Vitokhv
Vitokhv
Asked:2020-01-02 01:29:20 +0000 UTC2020-01-02 01:29:20 +0000 UTC 2020-01-02 01:29:20 +0000 UTC

如何检查文件是否受保护?

  • 772

从 Internet 下载文件时,它会以这种方式被标记为保护:

在此处输入图像描述

如何使用我的应用程序跟踪带有此保护标记的文件?
例如,将文件拖到应用程序上时。

c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    VladD
    2020-01-02T02:05:08Z2020-01-02T02:05:08Z

    最有可能的是,您只需要解锁文件以防它被锁定。

    官方的方法是调用 Powershell-cmdlet Unblock-File。为此,请安装 nuget 包System.Management.Automation并使用以下代码:

    using (var ps = PowerShell.Create())
    {
        ps.AddCommand("Unblock-File", true);
        ps.AddParameter("LiteralPath", fullPath);
        ps.Invoke();
    }
    

    替代方式 - 您可以使用在当前版本的 Windows 中有关锁定文件的数据包含在名为 Zone.Identifier 的替代 NTFS 数据流中的知识,并通过 P/Invoke 将其删除(从 en.SO 借来的代码):

    [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool DeleteFile(string name );
    
    public bool Unblock(string fileName) {
        return DeleteFile(fileName + ":Zone.Identifier");
    }
    

    好的,如果您真的只需要检查是否有保护,则必须使用 COM 对象。PersistentZoneIdentifier COM 对象负责阻塞。代码从这里和这里借来,并进行了改编。

    using System.Runtime.InteropServices;
    using System.Runtime.InteropServices.ComTypes;
    
    static class BlockChecker
    {
        public static bool IsBlocked(string path)
        {
            object persistZoneId = Activator.CreateInstance(
                Type.GetTypeFromCLSID(Guid.Parse(CLSID_PersistentZoneIdentifier)));
            var zoneIdentifier = (IZoneIdentifier)persistZoneId;
            var persistFile = (IPersistFile)persistZoneId;
            try
            {
                persistFile.Load(path, 0); // STGM_READ
                var id = zoneIdentifier.GetId();
                return id == URLZONE.URLZONE_INTERNET || id == URLZONE.URLZONE_UNTRUSTED;
            }
            catch
            {
                return false;
            }
            finally
            {
                if (persistZoneId != null)
                    Marshal.FinalReleaseComObject(persistZoneId);
            }
        }
    
        const string CLSID_PersistentZoneIdentifier = "0968e258-16c7-4dba-aa86-462dd61e31a3";
        const string IID_IZoneIdentifier = "cd45f185-1b21-48e2-967b-ead743a8914e";
    
        [ComImport]
        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        [Guid(IID_IZoneIdentifier)]
        public interface IZoneIdentifier
        {
            URLZONE GetId();
            void SetId(URLZONE zone);
            void Remove();
        }
    
        public enum URLZONE : uint
        {
            URLZONE_LOCAL_MACHINE = 0,
            URLZONE_INTRANET = 1,
            URLZONE_TRUSTED = 2,
            URLZONE_INTERNET = 3,
            URLZONE_UNTRUSTED = 4,
        }
    }
    

    以明显的方式使用:BlockChecker.IsBlocked(fullPath).

    如果文件不存在,它会返回true,所以请自己检查。

    如果是这样,您也可以使用

    zoneIdentifier.Remove();
    persistFile.Save(path, true);
    
    • 6

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5