使用Win32 API移动文件时自动设置安全属性?(C#)

使用Win32 API移动文件时自动设置安全属性?(C#),c#,file,uwp,C#,File,Uwp,我目前正在开发一个应用程序,必须将文件移动到另一个应用程序文件夹。但另一个应用程序必须对复制的文件具有特定权限。 当我使用Win32 API移动FileFromApp(它是uwp应用程序)时,它不会更新安全属性以继承文件夹。 这是MoveFile(C#)的代码 有人知道如何在移动文件夹时自动设置这些安全权限吗? 非常感谢你!(很抱歉,没有明确的问题…我试图在UWP应用程序中通过p/Invoke使用SetNamedSecurityInfo方法,代码如下。错误(错误代码为5)始终存在于UWP应用程序

我目前正在开发一个应用程序,必须将文件移动到另一个应用程序文件夹。但另一个应用程序必须对复制的文件具有特定权限。 当我使用Win32 API移动FileFromApp(它是uwp应用程序)时,它不会更新安全属性以继承文件夹。 这是MoveFile(C#)的代码

有人知道如何在移动文件夹时自动设置这些安全权限吗?
非常感谢你!(很抱歉,没有明确的问题…

我试图在UWP应用程序中通过p/Invoke使用
SetNamedSecurityInfo
方法,代码如下。错误(错误代码为5)始终存在于UWP应用程序中。但在Win32中,使用值为
UNPROTECTED\u DACL\u SECURITY\u INFORMATION
SetNamedSecurityInfo方法继承安全属性是成功的

在UWP中,对文件系统访问权限有一些限制。虽然可以成功调用
SetNamedSecurityInfo
方法,但它不能按预期工作

在UWP中使用SetNamedSecurityInfo方法的代码:

public uint DACL_SECURITY_INFORMATION = 0x00000004;
public uint UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000;
public uint ACL_REVISION = 0x2;

[StructLayout(LayoutKind.Sequential)]
public struct ACL
{
    public byte AclRevision;
    public byte Sbz1;
    public ushort AclSize;
    public ushort AceCount;
    public ushort Sbz2;
}
public enum SE_OBJECT_TYPE
{
    SE_UNKNOWN_OBJECT_TYPE = 0,
    SE_FILE_OBJECT,
    SE_SERVICE,
    SE_PRINTER,
    SE_REGISTRY_KEY,
    SE_LMSHARE,
    SE_KERNEL_OBJECT,
    SE_WINDOW_OBJECT,
    SE_DS_OBJECT,
    SE_DS_OBJECT_ALL,
    SE_PROVIDER_DEFINED_OBJECT,
    SE_WMIGUID_OBJECT,
    SE_REGISTRY_WOW64_32KEY,
    SE_REGISTRY_WOW64_64KEY,
}

[DllImport("api-ms-win-core-file-fromapp-l1-1-0.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern bool MoveFileFromAppW(
    string lpExistingFileName,
    string lpNewFileName);

[DllImport("advapi32.DLL", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern uint SetNamedSecurityInfo(
    string lpFileName,
    SE_OBJECT_TYPE ObjectType,
    uint SecurityInfo,
    IntPtr psidOwner,
    IntPtr psidGroup,
    ref ACL pDacl,
    IntPtr pSacl);

[DllImport("advapi32.dll", SetLastError = true)]
internal static extern bool InitializeAcl(ref ACL pAcl, int nAclLength, uint dwAclRevision);

[DllImport("api-ms-win-core-file-fromapp-l1-1-0.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall,
SetLastError = true)]
internal static extern bool MoveFileFromApp(
string lpExistingFileName,
string lpNewFileName
);

public void SetFilePermission(string FileName)
{//Use the method to let the file inherit the security attributes from parent object
    bool ret = false;
    ACL pDacl = new ACL();
    ret = InitializeAcl(ref pDacl, Marshal.SizeOf<ACL>(), ACL_REVISION);
    uint SecurityInfo = DACL_SECURITY_INFORMATION | UNPROTECTED_DACL_SECURITY_INFORMATION;
    uint err = SetNamedSecurityInfo(FileName, SE_OBJECT_TYPE.SE_FILE_OBJECT, SecurityInfo, IntPtr.Zero, IntPtr.Zero, ref pDacl, IntPtr.Zero);

}
public uint DACL\u SECURITY\u INFORMATION=0x00000004;
未受保护的公共uint\u DACL\u安全信息=0x20000000;
公共uint ACL_版本=0x2;
[StructLayout(LayoutKind.Sequential)]
公共结构ACL
{
公开修订;
公共字节Sbz1;
公共规模;
公共卫生统计;
公共卫生服务Sbz2;
}
公共枚举seu对象类型
{
SE_未知_对象_类型=0,
SE_文件_对象,
服务,
塞乌打印机,
SE_注册表项,
Seulmshare,
SE_内核_对象,
SE_WINDOW_OBJECT,
你的目标是什么,
所有的一切,
SE_提供程序_定义的_对象,
SE_WMIGUID_对象,
SE_注册表_WOW64_32键,
SE_注册表_WOW64_64键,
}
[DllImport(“api-ms-win-core-file-fromapp-l1-1-0.dll”,CharSet=CharSet.Unicode,SetLastError=true)]
内部静态外部bool MoveFileFromAppW(
字符串lpExistingFileName,
字符串(文件名);
[DllImport(“advapi32.DLL”,CharSet=CharSet.Unicode,SetLastError=true)]
内部静态外部单元SetNamedSecurityInfo(
字符串lpFileName,
SE_OBJECT_TYPE ObjectType,
uint安全信息,
IntPtr psidOwner,
IntPtr psidGroup,
参考ACL pDacl,
IntPtr pSacl);
[DllImport(“advapi32.dll”,SetLastError=true)]
内部静态外部bool初始化ACL(参考ACL pAcl、内部长度、uint DWACL修订版);
[DllImport(“api-ms-win-core-file-fromapp-l1-1-0.dll”,CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall,
SetLastError=true)]
内部静态外部bool MoveFileFromApp(
字符串lpExistingFileName,
字符串lpNewFileName
);
public void SetFilePermission(字符串文件名)
{//使用该方法让文件从父对象继承安全属性
bool-ret=假;
ACL pDacl=新ACL();
ret=初始化ACL(参考pDacl,Marshal.SizeOf(),ACL_修订版);
uint SecurityInfo=DACL_SECURITY_INFORMATION |未受保护的DACL_SECURITY_INFORMATION;
uint err=SetNamedSecurityInfo(文件名,SE_OBJECT_TYPE.SE_FILE_OBJECT,SecurityInfo,IntPtr.Zero,IntPtr.Zero,ref pDacl,IntPtr.Zero);
}

您能告诉我另一个应用程序对复制的文件必须具有特定权限的
意味着什么吗?“文件的特定权限”是中提到的权限吗?您好,很抱歉我的精确度不高。这意味着另一个应用程序加载该文件,并且它必须具有某种“读取权限”,它是一个“未知用户”SID,必须位于该文件上,应用程序才能读取该文件。请告诉我您是否将文件从一个磁盘移到另一个磁盘(例如从form C磁盘移到D磁盘)?在UWP中,没有这样的API可以设置读/写权限。您好,我只将磁盘从目标移动到同一磁盘中的另一个。我想知道是否有办法使用System.IO,甚至Win32 API您可以尝试使用Win32 API来设置文件或目录对象的安全性。非常感谢:)我现在看到了!我的应用程序具有RunFullTrust和broadFileSystemAccess,因此可能不会出现错误编辑:我已经了解了您拒绝访问的原因:)这是因为您使用的是advapi32.dll,UWP还有另一个dll(api-ms-win-security-provider-l1-1-0.dll)EDIT2:这是Win32 API UWP的页面:我只有最后一个问题:为什么这会删除所有DACL/SACL?因为我需要单击该文件,并让管理员重新设置dacl和SACL删除所有dacl的原因是为了让该文件继承其父文件夹的安全性。您可以选择不删除它们。如果我删除它们,文件是否从父文件夹继承(拥有父文件夹的帐户的SID)?:DACL从父对象继承ACE。还有,未受保护的\u SACL\u安全\u信息:SACL从父对象继承ACE。
public uint DACL_SECURITY_INFORMATION = 0x00000004;
public uint UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000;
public uint ACL_REVISION = 0x2;

[StructLayout(LayoutKind.Sequential)]
public struct ACL
{
    public byte AclRevision;
    public byte Sbz1;
    public ushort AclSize;
    public ushort AceCount;
    public ushort Sbz2;
}
public enum SE_OBJECT_TYPE
{
    SE_UNKNOWN_OBJECT_TYPE = 0,
    SE_FILE_OBJECT,
    SE_SERVICE,
    SE_PRINTER,
    SE_REGISTRY_KEY,
    SE_LMSHARE,
    SE_KERNEL_OBJECT,
    SE_WINDOW_OBJECT,
    SE_DS_OBJECT,
    SE_DS_OBJECT_ALL,
    SE_PROVIDER_DEFINED_OBJECT,
    SE_WMIGUID_OBJECT,
    SE_REGISTRY_WOW64_32KEY,
    SE_REGISTRY_WOW64_64KEY,
}

[DllImport("api-ms-win-core-file-fromapp-l1-1-0.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern bool MoveFileFromAppW(
    string lpExistingFileName,
    string lpNewFileName);

[DllImport("advapi32.DLL", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern uint SetNamedSecurityInfo(
    string lpFileName,
    SE_OBJECT_TYPE ObjectType,
    uint SecurityInfo,
    IntPtr psidOwner,
    IntPtr psidGroup,
    ref ACL pDacl,
    IntPtr pSacl);

[DllImport("advapi32.dll", SetLastError = true)]
internal static extern bool InitializeAcl(ref ACL pAcl, int nAclLength, uint dwAclRevision);

[DllImport("api-ms-win-core-file-fromapp-l1-1-0.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall,
SetLastError = true)]
internal static extern bool MoveFileFromApp(
string lpExistingFileName,
string lpNewFileName
);

public void SetFilePermission(string FileName)
{//Use the method to let the file inherit the security attributes from parent object
    bool ret = false;
    ACL pDacl = new ACL();
    ret = InitializeAcl(ref pDacl, Marshal.SizeOf<ACL>(), ACL_REVISION);
    uint SecurityInfo = DACL_SECURITY_INFORMATION | UNPROTECTED_DACL_SECURITY_INFORMATION;
    uint err = SetNamedSecurityInfo(FileName, SE_OBJECT_TYPE.SE_FILE_OBJECT, SecurityInfo, IntPtr.Zero, IntPtr.Zero, ref pDacl, IntPtr.Zero);

}