Question

I want to track if the users have read sharepoint 2010 document center's documents, currently user infos are not stored in audit logs, is there any way to do it?

Était-ce utile?

La solution 2

I found the solution. Here is the steps.

1- Create a class library.

2- Right click the library and add new item.

3- Select ASP.NET Module under Web node.

4- Add PreRequestHandlerExecute event handler inside Init.Here is my code.

public void Init(HttpApplication context)    
{
   context.PreRequestHandlerExecute += context_PreRequestHandlerExecute;
}

5- Methods

    void context_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            var app = sender as HttpApplication;
            if (app != null)
            {
                string requesturl = app.Request.Url.ToString();
                string file = string.Empty;
                // if document opens in browser
                if (app.Request.QueryString["Source"] != null && app.Request.QueryString["id"] != null && app.Request.QueryString["Source"].StartsWith(documentSiteUrl))
                {
                    file = app.Request.QueryString["id"].Remove(0, app.Request.QueryString["id"].LastIndexOf('/'));
                    Worker(file);
                }
                // if document opened installed office apps or downloaded the document
                if (requesturl.StartsWith(SiteUrl))
                {
                    requesturl = requesturl.Remove(0, requesturl.LastIndexOf('/') + 1);
                    Worker(requesturl);
                }
            }
        });

    }

    private void Worker(string requesturl)
    {

        #region ext control
        List<string> extList = new List<string>(Exts.Split(';'));
        bool result = false;
        foreach (string item in extList)
        {
            if (requesturl.EndsWith(item))
            {
                result = true;
                break;
            }
        }
        #endregion

        if ((!requesturl.Contains(".aspx")) && (!requesturl.EndsWith("/")) && result)
        {
            SPWeb web = SPContext.Current.Web;

            String fileName = requesturl.Substring(requesturl.LastIndexOf("/") + 1);

            // Add log
            web.AllowUnsafeUpdates = true;
            AddReadInfo(web.CurrentUser, fileName, web);
            web.AllowUnsafeUpdates = false;
        }
    }

    private void AddReadInfo(SPUser sPUser, string fileName, SPWeb web)
    {

        #region Logging

            SPList logList = web.Lists.TryGetList("LogList");
            if (logList != null)
            {
                SPListItem item = logList.Items.Add();
                item["User"] = sPUser.Name;
                item["Document"] = fileName;
                item["Read"] = "Read";
                item.Update();

            }

        #endregion

    }

6- Don't forget signing the project.

7- Build Project.

8- Add dll to GAC and BIN folder under the C:\inetpub\wwwroot\wss\VirtualDirectories\80\ folder.

9- Open IIS Manager.

10- Find your site nod and select.

11- Open Modules.

12- Right click under modules page and select Add Managed Module option.

13- Give a name and select your module under dropdownlist.

14- IIS reset.

Autres conseils

It gets stored in audit logs. Enable auditing for that particular document library and then get the details using the following code:

SPSite oSPsite = new SPSite
SPList doclib= oSPWeb.Lists["doclib"];
SPWeb oSPWeb = oSPsite.OpenWeb()
SPListItemCollection doclibitems= doclib.Items; 
foreach (SPListItem odoclibItem in doclibitems)
                        { 
odoclibItem .Audit.AuditFlags = SPAuditMaskType.View;
                        //    odoclibItem .Audit.AuditFlags = SPAuditMaskType
                            SPAuditQuery oquery = new SPAuditQuery(oSPsite);
                            oquery.RestrictToListItem(odoclibItem );
                            odoclibItem .Audit.Update();                        
                            SPAuditEntryCollection oAuditEntryCollection =SPsite.Audit.GetEntries(oquery);
                            foreach (SPAuditEntry entry in oAuditEntryCollection)
                            {
     if (entry.Event == SPAuditEventType.View)
    {
    id = Convert.ToString(entry.UserId);
     // get the user name and other details here
     }
   }
       }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top