gpt4 book ai didi

c# - 使用 IPrincipal 的文件和目录安全性

转载 作者:行者123 更新时间:2023-11-30 15:50:22 26 4
gpt4 key购买 nike

我需要通过 Directory.GetDirectories() 和 Directory.GetFiles() 方法访问当前 IPrincipal 有权访问的文件和目录,而不列出其他文件。该进程本身作为 NETWORK SERVICE 运行,因此它必须在这些调用期间将主体更改为当前用户(通过 IPrincipal)。

我试图在文件访问部分之前将 Thread.CurrentPrincipal 更改为新的 IPrincipal,但这似乎没有什么不同。

还有什么我可以做的,还是我遗漏了什么?

最佳答案

Windows 模拟通过使用登录详细信息获取用户 token 来解决此问题。然后可以使用此 token 获取 WindowsIdentity,然后使用该 WindowsIdentity 生成模拟上下文。在此上下文范围内,您可以模拟用户访问文件系统。

当然,您需要存储用户名和密码才能使用此方法。

首先,定义从 Windows 获取用户 token 所需的 Windows API:

internal class WindowsAPI 
{
public const int LOGON32_PROVIDER_DEFAULT = 0;
public const int LOGON32_LOGON_INTERACTIVE = 2;

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

[DllImport( "kernel32.dll", CharSet = CharSet.Auto )]
public extern static bool CloseHandle( IntPtr handle );
}

然后,使用这些 API 获取 WindowsIdentity:

private WindowsIdentity GetIdentity( string userName, string password )
{
_userToken = IntPtr.Zero;

if ( !WindowsAPI.LogonUser(
userName,
AbbGrainDomain,
password,
WindowsAPI.LOGON32_LOGON_INTERACTIVE, WindowsAPI.LOGON32_PROVIDER_DEFAULT,
ref _userToken
) )
{
int errorCode = Marshal.GetLastWin32Error();
throw new System.ComponentModel.Win32Exception( errorCode );
}

return new WindowsIdentity( _userToken );
}

最后,使用这个身份生成模拟上下文:

public List<string> GetDirectories( string searchPath )
{
using ( WindowsImpersonationContext wic = GetIdentity().Impersonate() )
{
var directories = new List<string>();

var di = new DirectoryInfo( searchPath );
directories.AddRange( di.GetDirectories().Select( d => d.FullName ) );

return directories;
}
}

最后,重要的是使用 IDisposable 模式清理窗口句柄,使用存储的 _userToken:

if ( _userToken != IntPtr.Zero )
WindowsAPI.CloseHandle( _userToken );

关于c# - 使用 IPrincipal 的文件和目录安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/703450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com