我想通过代码访问另一台机器上的共享资源。我的环境是在声明身份验证模式下工作的 Sharepoint 2010 WebApplication。应用程序的 Windows 身份是 NT AUTHORITY\IUSR - 不是已登录的用户,因此要访问另一台机器上的网络共享资源,我需要执行模拟。由于我没有有效的 Windows 令牌来执行模拟,我需要使用对 Windows 令牌服务的声明,我已将其配置为能够由 NT AUTHORITY\IUSR 访问。该服务作为本地系统帐户运行。我可以使用以下代码从我用来执行模拟的服务中获取模拟级别的 Windows 令牌:
using (wi = S4UClient.UpnLogon(upn))
{
using(WindowsImpersonationContext wic2 = wi.Impersonate())
{
//code to access windows shares
}
}
该服务正在正确返回令牌并且模拟成功,当我使用以下代码返回当前登录用户的身份时:
WindowsIdentity.GetCurrent().Name;
我正在获取登录到共享点的用户的用户名。
问题是尝试访问网络资源时出现“拒绝访问”错误。问题很明显是因为通过 c2wts 进行的模拟,因为当我使用以下代码提供实际凭据(登录名和密码)来模拟用户时:
[DllImport("advapi32.dll", SetLastError = true)]
private static extern Int32 LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, Int32 dwLogonType, Int32 dwLogonProvider, ref IntPtr phToken);
[DllImport("advapi32.dll", SetLastError = true)]
private static extern Int32 ImpersonateLoggedOnUser(IntPtr hToken);
private static IntPtr ImpersonateUser(string user, string domain, string password)
{
IntPtr lnToken = new IntPtr(0);
Int32 TResult = LogonUser(user, domain, password, LOGON32_LOGON_NETWORK_CLEARTEXT, LOGON32_PROVIDER_WINNT50, ref lnToken);
if (TResult > 0)
{
ImpersonateLoggedOnUser(lnToken);
}
return lnToken;
}
我能够毫无问题地枚举服务器上的共享。
根据我在 Internet 上找到的信息,要正确配置服务以访问另一台服务器上的 sql 数据库,我需要在 Active Directory 中启用协议转换和约束委派,并将该约束设置为 mysql 服务。我仍然不确定在这种情况下如何启用委派,因为我想要实现的是能够访问任何机器上的任何共享,只要用户有权这样做。
总而言之,我想从基于 Sharepoint 声明的身份验证 WebApplication 中模拟用户以访问其他计算机上的网络共享,但即使使用 c2wts 进行艰难的模拟似乎也是成功的(检查当前用户名时返回正确的用户名)我无法访问另一台计算机上的资源。另一方面,当使用代码中直接提供的登录名和密码进行模拟时,一切正常,但这对我来说不是一个选择。