我想阅读远程服务器上存储的 PDF。我已获得具有读取访问权限的用户名/密码。
我正在使用此 url 中给出的 ASP.NET 模拟https://support.microsoft.com/kb/306158 https://support.microsoft.com/kb/306158
我将所有内容记录到日志文件中只是为了帮助调试。
StreamWriter sw = new StreamWriter(Server.MapPath("~/log/logFile.txt"), true);
sw.WriteLine("Just before Impersonation");
if(impersonateValidUser("username", "domain", "password"))
{
try
{
byte[] bytes = File.ReadAllBytes(documentName);
sw.WriteLine("Bytes read!!");
undoImpersonation();
}
catch(Exception ex)
{
sw.WriteLine(ex.Message + "\n" + ex.StackTrace);
return;
}
else
{
sw.WriteLine("Impersonation Failed");
return;
}
在我的日志文件中,我只看到“就在模拟之前”。
try 和 catch 块的消息都不会写入日志文件。令人惊讶的是,我没有看到模拟失败的消息。
只是想知道是否有人以前有过这种行为的经历?访问远程计算机上的文件是否有任何额外要求?我知道远程机器确实有 advapi32.dll 和 kernel32.dll
我们在使用 MSDN 示例时也遇到了问题,如果我没记错的话,这与句柄过早关闭有关。
我们最终用以下方式重写了它,这对我们来说非常有效:
private void DoLogin()
{
var token = LogonAsUser(userName, domain, password);
if (!IntPtr.Equals(token, IntPtr.Zero))
{
WindowsImpersonationContext impersonatedUser = null;
try
{
var newIdentity = new WindowsIdentity(token);
impersonatedUser = newIdentity.Impersonate();
// Do impersonated work here
}
finally
{
if (impersonatedUser != null)
{
impersonatedUser.Undo();
}
LogonAsUserEnd(token);
}
}
}
private IntPtr LogonAsUser(String userName, String domain, String password)
{
IntPtr token = IntPtr.Zero;
if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
return token;
}
else
{
return IntPtr.Zero;
}
}
private void LogonAsUserEnd(IntPtr token) {
if (!IntPtr.Equals(token, IntPtr.Zero))
{
CloseHandle(token);
}
}
另一边注:我们将 LogonUserA 定义为返回 bool,而不是 int,这也可能是您遇到的问题的一部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)