我的问题与大多数人的相反。我在 C# 中本地生成文件,但我希望它们被标记为被阻止。因此,当用户在 Word 或 Excel 等应用程序中打开它们时,它会以“保护模式”打开它们。
我读过这是在“NTFS 备用数据流”上设置的。有谁知道我如何在 C# 中模仿这个?
您还可以使用PersistZoneIdentifier对象,而不是直接编写替代数据流。
更多信息在这里:http: //blogs.msdn.com/b/oldnewthing/archive/2013/11/04/10463035.aspx 在这里:https ://github.com/citizenmatt/UnblockZoneIdentifier
using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
namespace ConsoleApplication3
{
public enum URLZONE : uint
{
URLZONE_LOCAL_MACHINE = 0,
URLZONE_INTRANET = 1,
URLZONE_TRUSTED = 2,
URLZONE_INTERNET = 3,
URLZONE_UNTRUSTED = 4,
}
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("cd45f185-1b21-48e2-967b-ead743a8914e")]
public interface IZoneIdentifier
{
URLZONE GetId();
void SetId(URLZONE zone);
void Remove();
}
class Program
{
static void Main(string[] args)
{
object persistZoneId = Activator.CreateInstance(Type.GetTypeFromCLSID(Guid.Parse("0968e258-16c7-4dba-aa86-462dd61e31a3")));
IZoneIdentifier zoneIdentifier = (IZoneIdentifier)persistZoneId;
IPersistFile persisteFile = (IPersistFile)persistZoneId;
zoneIdentifier.SetId(URLZONE.URLZONE_UNTRUSTED);
persisteFile.Save(@"c:\temp\test.txt", false);
}
}
}
您需要自己编写备用数据流。
为此,请使用 CreateFile 打开文件并使用 FileStream 写入文本。这是一个有效的简单示例(在我的计算机上尝试过)。
[DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern SafeFileHandle CreateFile(
string name, FileAccess access, FileShare share,
IntPtr security,
FileMode mode, FileAttributes flags,
IntPtr template);
public static void Main()
{
// Opens the ":Zone.Identifier" alternate data stream that blocks the file
using (SafeFileHandle handle = CreateFile(@"\\?\C:\Temp\a.txt:Zone.Identifier", FileAccess.ReadWrite, FileShare.None, IntPtr.Zero, FileMode.OpenOrCreate, FileAttributes.Normal, IntPtr.Zero))
{
// Here add test of CreateFile return code
// Then :
using (StreamWriter writer = new StreamWriter(new FileStream(handle, FileAccess.ReadWrite), Encoding.ASCII))
{
writer.WriteLine("[ZoneTransfer]");
writer.WriteLine("ZoneId=3");
}
}