一些细节
问题
应用程序中有一点我们使用Thread类,类似于:
Thread myThread = new Thread(new ThreadStart(objInstance.PublicMethod));
myThread.Start();
我注意到的是,我可以在我的代码中的任何地方写入我的日志(共享中的文本文件),除了我启动的主题。我添加了一些调试输出,我看到的用户是:
好的,由于某种原因,线程获得了不同的用户(NETWORK SERVICE)。精细。但是,我的共享(和实际日志文件)被赋予了NETWORK SERVICE用户的“完全控制权”(此共享位于与我的应用程序运行的服务器不同的服务器上)。
如果NETWORK SERVICE拥有此文件夹的权限,为什么我会拒绝访问?或者有没有办法让我启动的线程与进程拥有相同的用户?
答案 0 :(得分:3)
您还可以获取新线程来模拟发出请求的用户。例如,如果您在Page.Load事件中启动请求,它可能看起来像这样。
public partial class MyPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Thread myThread = new Thread(new ParameterizedThreadStart(ThreadMethod));
myThread.Start(HttpContext.Current.User);
}
private void ThreadMethod(object state)
{
WindowsPrincipal principal = state as WindowsPrincipal;
WindowsImpersonationContext impersonationContext = null;
try
{
if (principal != null)
{
Thread.CurrentPrincipal = principal;
impersonationContext = WindowsIdentity.Impersonate(((WindowsIdentity)principal.Identity).Token);
}
// Do your user specific stuff here...
}
finally
{
if (impersonationContext != null)
{
impersonationContext.Undo();
}
}
}
}
您会注意到我将Principal从ASP.NET线程传递到新线程,我显然假设您正在使用Windows集成身份验证,因此我没有做错误检查的方式,这只是一个快速样品
注意:对于VWG,你可以从VWG上下文中获取用户并在相应的函数中运行模拟代码,这个例子是ASP.NET jsut因为环境是相同的,只是我做不知道我头顶的VWG物体。
答案 1 :(得分:2)
NT AUTHORITY \ NETWORK SERVICE是本地计算机帐户。对于远程服务器,它看起来像您的IIS计算机的Active Directory帐户(COMPUTERNAME $)。您需要将日志目录的访问权限授予IIS框的AD计算机帐户。
HTH