使用C#中的不同用户凭据将文件保存到文件系统
本文关键字:文件 保存 文件系统 用户 使用 | 更新日期: 2023-09-27 18:24:39
如何使用与当前登录用户不同的用户将文件保存到文件系统?
我目前正在使用.NET Framework 4.0。
如果您有其他用户的登录凭据,则可以模拟他们
在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请求。文件以字节数组的形式发送到该服务,该服务将文件写入共享位置。你需要确保你有足够的安全性,并为使用它的应用程序登录!