尝试保存文件时,Sharepoint中托管的ASP.NET ascx控件会收到System.UnauthorizedAccessException

时间:2012-06-25 03:43:34

标签: c# sharepoint permissions sharepoint-2007 ascx

我们在特殊的Sharepoint页面中托管了一个ascx自定义控件(不是Web部件)。此页面允许用户将文件上传到我们的服务器。不幸的是,权限问题阻止了Sharepoint将文件保存到网络位置。

归因于基于Sharepoint 2007的站点的应用程序池的网络帐户具有授予该位置的“修改”和“读取”访问权限。

我们使用应用程序池帐户使用的凭据登录到其他计算机,并且可以在指定的网络位置创建目录和文件而不会出现任何问题。

Sharepoint是否有可能尝试使用其他帐户来保存这些文件,而不是IIS7中的应用程序池上设置的文件?

我们得到的错误:

消息:拒绝访问路径'\ opal \ gwl \ pictures \ L36'。

System.IO上的System.IO.Directory.InternalCreateDirectory(String fullPath,String path,DirectorySecurity dirSecurity)上的System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)中的

堆栈跟踪: .directory.CreateDirectory(String path,DirectorySecurity directorySecurity)at ECan.SharePoint.Web.Applications.MyECan_WaterMeterFormDatalogger.SavePhotos()

异常类型: System.UnauthorizedAccessException

用户:系统帐户

文件后面的ascx代码中的SavePhotos函数代码:

protected void SavePhotos()
{
    string wellNo = WellNo.Value;
    string epoWaterMeterID = EPO_WaterMeterID.Value;
    string dirRoot = ConfigurationManager.AppSettings["PhotoDir"];
    string map = wellNo.Substring(0, wellNo.IndexOf('/'));

    int photoSaveCount = 1;
    foreach (string filePath in Request.Files)
    {
        HttpPostedFile file = (HttpPostedFile)Request.Files[filePath];
        if (file.InputStream.Length > 0)
        {
            try
            {
                // Create dir if does not exist
                string dir = dirRoot + map;
                if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);

                // Save file
                file.SaveAs(dir + @"\" + wellNo.Replace('/', '_') + "-" + epoWaterMeterID.ToString() + "-" + photoSaveCount.ToString() + ".jpg");

                photoSaveCount++;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
            }
        }
    }
}

任何人都有任何想法可能是什么问题?

2 个答案:

答案 0 :(得分:1)

我认为您必须使用提升的权限调用SavePhotos。 使用提升权限运行代码将执行具有完全控制权限的指定方法,即使用户没有完全控制权也是如此。

见链接:

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges(v=office.12).aspx

请尝试以下代码:

protected void Button1_Click(object sender, EventArgs e)
{
   SPSecurity.CodeToRunElevated elevatedGetSitesAndGroups = new SPSecurity.CodeToRunElevated(SavePhotos);
   SPSecurity.RunWithElevatedPrivileges(elevatedGetSitesAndGroups);
}

答案 1 :(得分:0)

您是否尝试过设置新创建的目录或文件夹的权限?您可以使用System.Security.AccessControl命名空间中的DirectorySecurity类,特别是该类的SetAccessControl方法来完成此操作。