使用C#中的不同用户凭据将文件保存到文件系统

本文关键字:文件 保存 文件系统 用户 使用 | 更新日期: 2023-09-27 18:24:39

如何使用与当前登录用户不同的用户将文件保存到文件系统?

我目前正在使用.NET Framework 4.0。

使用C#中的不同用户凭据将文件保存到文件系统

如果您有其他用户的登录凭据,则可以模拟他们

在Win32 中使用DLL Import调用LogoUser

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
        int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken);

然后你可以在你的代码中进行模拟


SafeTokenHandle safeTokenHandle;
string userName, domainName, password;
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;
bool returnValue = LogonUser(userName, domainName, password,
                LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
                out safeTokenHandle);

来自MSDN for FileInfo.SetAccessControl:

fileSecurity参数指定的ACL将替换文件的现有ACL。要为新用户添加权限,请使用GetAccessControl方法获取现有ACL,对其进行修改,然后使用SetAccessControl将其应用回文件。

因此,假设我们对有问题的文件有一个FileInfo

// FileInfo file = ...;
var acl = file.GetAccessControl();
// Add or Remove access rules on this FileSecurity object
acl.AddAccessRule(new FileSystemAccessRule(
    @"domain'someuser",
    FileSystemRights.FullControl, /* pick something less */
    AccessControlType.Allow));
file.SetAccessControl(acl);

或者,如果你需要在保存文件之前这样做,你需要使用模拟:

// You'd be best served to beg, borrow, and steal the LogonUser
// code from the MSDN article.
using (var identity = new WindowsIdentity(token))
using (var context = identity.Impersonate())
{
    using (var stream = File.OpenText("impersonated.txt"))
    {
        // ... write
    }
}

我们有一个旧的ASMX web服务,它在一个专用的服务帐户下运行,我们的应用程序向它发送web请求。文件以字节数组的形式发送到该服务,该服务将文件写入共享位置。你需要确保你有足够的安全性,并为使用它的应用程序登录!