|
|
-
I'm sure all of you have seen the new tagging feature of SharePoint. This particular feature is a part of the User Profile Service Application AND Metadata Service Applications. If you don't have one of these created, then you simply won't get the ability to do tagging. If you do however, you can tag things as a generic "I Like It" or something more specific like "Awesome". I have had a few different questions asked of me over the past few months and here I'll answer them all: #1 If a user tags something, will other users see the tag? ANSWER: Depends! There is a checkbox when you attempt to tag an item. If you check it, it will save the tag specifically for you and no one else. If you do not check the box, then when some goes to tag the same item, you will see a suggested tag list made up of all tags that have been placed on that item.
#2 If a user tags something, will they see that tag indexed in a search for the item? ANSWER: No, I have not gotten SharePoint or FAST Search to index the tags :( This can certainly be setup with a custom iFilter or extend point in FAST Search content processing pipeline, but it doesn't look to be out of the box.
#3 As an administrator, how can I search on all the tags that have been created? Tags are saved as Metadata terms in the Managed Metadata Service Application that is assigned to the web application you are working with. You can simply view all the terms under the "System->Keywords" group of your MMS service application. You can also run the following query on your MMS database to get a listing of the tags and who "tagged" it: SELECT [ObjectUniqueId] ,[ObjectId] ,[Label] ,[Owner] ,[CreatedTime] ,[LastModifiedTime]
FROM [ECMChangeLog] ecl, ECMTerm t, ECMTermLabel etl where ChangeType = 1 and ecl.ObjectUniqueId = t.UniqueId and ecl.ObjectId = etl.TermId
#4 How do I query what has been tagged? ANSWER: All items that have been tagged are not stored in MMS, but instead in the UserProfileServicesApplication_SocialDB_* database and in the SocialTags table. A simple query of that table will give you what you are looking for. Other helpful tables include: - SocialTagCloud_Everyone
- SocialTagCloug_EveryoneByUrlBase
- SocialTags
- SocialTags_ChangeLog
#5 Are tags filtered (as in bad words like *bleep*)? ANSWER: No, and ForeFront doesn't filter them either (reference this post).
#6 Can tags be filtered? ANSWER: To answer this question, one must analyze the architecture of the tagging system. Since all the tag keywords are stored with MMS, the question then becomes, can I filter MMS? Looking at the structure of the MMS tables, we have: - ECMTerm
- ECMTermDescription
- ECMTermLabel
- ECMTermProperty
- ECMTermSet
- ECMTermSetMembership
The value for the term is actually stored in the ECMTermLabel property table. It would make sense that before anything that is allowed to be inserted into this table have the filter applied. On that note, we explore the "proc_ECM_AddTermLabel" stored procedure. It is simple enough to create a new table called "ECMTermFilters" and inject into this stored procedure a call to look up anything that has the filter value in it. If it does, simply reject the insert and call up some random RAISERROR call to make it fail. DONE!
#7 What does the "Tag Cloud" web part do?
Being that SharePoint doesn't have any filtering...this web part can cause some pretty nasty HR problems. As long as your users are doing what they are suppose to be doing, then this simply queries all the tags in the Metadata store and displays them. Enjoy! Chris
|
-
So what exactly does this thing do anyway other than keep growing HUGE?!? Let's take a look! A little background...I have been running SharePoint 2010 RTM since it was released and since then the Logging database has grown to 500MB. The database itself seems to be dynamic in that you will start off with a small number of tables, but as your increase your feature usage, more tables will be added. Question #1: Just how many tables does your system have? Here's my current list (but you may have even more!): - AnalysisServicesConnections
- AnalysisServicesLoads
- AnalysisServicesRequests
- AnalysisServicesUnloads
- Configuration
- ExportUsage
- FeatureUsage
- ImportUsage
- MonthlyPartitions
- NTEventLog
- PerformanceCounters
- RequestUsage
- Search_CrawlDocumentStats
- Search_CrawlProgress
- Search_CrawlWorkerTimings
- Search_PerMinuteFTQueryLatency
- Search_PerMinuteTotalOMQueryLatency
- Search_PerMinuteTotalQueryLatency
- Search_PerMinuteTotalUIQueryLatency
- Search_QueryErrors
- Search_VerboseFTQueryLatency
- Search_VerboseOMQueryLatency
- Search_VerboseQueryProcessorLatency
- Search_VerboseUIQueryLatency
- Search_VerboseWebPartQueryLatency
- SiteInventory
- SQLDMVQueries
- SQLMemoryQueries
- TimerJobUsage
- TraceDiagnosticsDummy
- ULSTraceLog
- Versions
All of those of course have their partitions to them. Question #2: What the hell is a partition and why do I have 32 of them? You will see that there are a max number of 31 partitions. But you will also notice that there is a partition number 0. That is 32 days of partitions? I think this is a bug in the stored procedures when the table partitions get created. But the idea is to keep the set of daily information broken apart via a rolling schedule (this means that day 9 may not map to the calendar day 9). You can look at the Configuration table to find what the current partition is. As the Timer Job is run to process the log data, it will move to the next partition and recycle as it goes.
Question #3: How do I turn the freakin thing off? This can be accomplished by going into Central Administration->Monitoring->Configure usage and health data collection. Uncheck the "Enable usage data collection" checkbox and the "Enable health data collection" checkbox
Question #4: I like the data, but there is too much, how do I shrink it? If you explore the Stored procedures in the database, you will see that it simply truncates when it moves to a new partition. You can do the same by looping through all the tables and truncating the tables. You can also just run the function called "fn_TruncateUnusedPartitionsHelper"
Question #5: I like the data that is generated, can I please have some more? Hell yeah you can, if you explore the timer jobs titled "Diagnostic Data Provider*" you will see they are disabled! Turn them on and you will get even more data around: - Event Log
- Performance Counters - Database servers
- Performance Counters - Web Front Ends
- SQL Blocking Queries
- SQL DMV
- SQL Memory DMV
- Trace Log
Ayman has a nice post on how you can use .NET Reflector to get in and see how these monsters do there dirty work hereQuestion #6: Can you have too much data? Oh yeah! You can easily hit the 4GB limit on this database, for those of you running SQL Express (why?), you will be truncating tables quite frequently! For those of you with limited disk space, get ready to also be truncating tables. Those of you with HUGE disk arrays, well...you should be fine. Question #7: Where is this documented schema thing I have seen so many marketing slides about? Who the heck knows! It seems that anyone and any application is able to write to this thing. Even you could write into it with your own application. I'm not sure how you get a new set of partition tables setup and the attributes created, but eventually I will find some time to build something for it :)
Enjoy! Chris
|
-
At our SanSpug.org meeting for August I had some very intelligent questions asked of me. Ones I didn't know the answer too, until now! Here's the questions: - What happens to a list that has been assigned a content type that was content published when we change and republish the content type. Is it business as usual in that the content type will update across the lists?
- What happens to a list that has been assigned a content type and we move that list to another site?
Very interesting questions, and my default answer would be to say that publishing is nothing more than automating the "Creation" of content types, and therefore, all previous rules will apply here. Let's take a look at the basics. Basic #1: Does a list get updates of a content type?
- Create a new content type
- Assign it to a list
- Create a new item based on the content type
- Update the content type
- Review if the content type gets the updated columns/settings
ANSWER: A list will only get the items updated if you set the "Update all content types inheriting from this type?" radio button to TRUE! Basic #2: Does an exported list to a new site collection keep the content type?
- Create a new content type
- Assign it to a list
- Create a new item based on the content type
- Export the list with contents as a template (.stp)
- Restore to a new site collection
- Review if the content type is created/attached
ANSWER: Yes! The content type will in fact move to the new site collection and be assigned to the newly created list!
CTHub #1: Does a list get updates of a content type via a Managed Content Hub?
- Create a new Managed Hub
- Configure the MMS to point to the hub
- Create a new content type in the hub
- Publish the content type
- Wait for the content type to be published
- Assign it to a list
- Create a new item based on the content type
- Update the content type
- Wait for the publish
- Review if the content type gets the updated columns/settings
ANSWER:
Yes! This implies that the "Update all
content types inheriting from this type?" radio button to TRUE! CTHub #2: What happens if you create a list template and move the list to another site collection, then update the Content Type in the hub? ANSWER: The newly created list WILL get the updates from the hub as long as the site collection is located inside the same web application. CTHub #3: What happens when you publish a content type with the same name as one already existing? ANSWER: The content type will not be updated, the Content Type Publishing logs will display an "Exists" error. Enjoy! Chris
|
-
Unfortunately, I have NOT gotten this to work. Only on a web application that has "Classic Authentication" set has it worked. If you setup a web application to have claims based auth with both a "Forms" and a "Windows" login capability, the PowerPivot code will fail in its login method: <nativehr>0x80070005</nativehr><nativestack>OWSSVR.DLL: (unresolved symbol, module offset=00000000000BB1EC) at 0x000007FEEFEFB1EC mscorwks.dll: (unresolved symbol, module offset=00000000002CF777) at 0x000007FEF62BF777 Microsoft.SharePoint.Library.ni.dll: (unresolved symbol, module offset=00000000000E7BAA) at 0x000007FEF23A7BAA Microsoft.SharePoint.ni.dll: (unresolved symbol, module offset=0000000001A5D823) at 0x000007FEEC87D823 Microsoft.SharePoint.ni.dll: (unresolved symbol, module offset=0000000001AD201F) at 0x000007FEEC8F201F </nativestack>Access denied. Only way to get this to work is to reset the web application to "Classic Authentication" and then the code works. This is with the latest cumulative updates applied. Another blog post by Denny mentions a bit more into this, but the code should work as it is calling the object model to simply update the workbook in the list on the site :(
Chris
|
-
While working with getting PowerPivot and Excel Services working, I ran into this very annoying error:
ServerSession.ProcessServerSessionException: An exception during ExecuteWebMethod has occurred for server: http://servername:32843/811dd9f4d4ae48779f1dc7a03ba5d555/ExcelService*.asmx, method: GetHealthScore, ex: Microsoft.Office.Excel.Server.CalculationServer.Proxy.ServerSessionException: An error has occurred. ---> System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) (Fault Detail is equal to An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is: System.IO.FileLoadException: The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) at System.Reflection... Nothing in the event log...only this error with no reference to the assembly name or anything...annoying. I found this nice post about debugging these type of errors: http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57120.aspx You must download the SDK to get the tool: http://www.microsoft.com/downloads/details.aspx?familyid=6B6C21D2-2006-4AFA-9702-529FA782D63B&displaylang=en After installing, I wasn't seeing any binding errors. In the documentation, you're suppose to restart the services that are using .NET after setting the logging. I rebooted the server and the error didn't return...weird.
Chris
|
-
When installing PowerPivot in your farm, you will have to manually add the following line to your web.config SafeControls section of EVERY front end server, you will also have to add this back everytime you make a change via the Web Application settings page in Central Administration: <SafeControl Src="~/_layouts/powerpivot/*" IncludeSubFolders="True" Safe="True" AllowRemoteDesigner="True" SafeAgainstScript="True" /> If you don't do this, then you will get this error: “The referenced file ‘/_layouts/PowerPivot/ReportGalleryView.ascx’ is not allowed on this page."
This should have been done in the Solution install, but they missed that step. Hopefully next version of the .wsp will contain the addition
Special thanks to PowerPivotGeek.com for the helpful hint
Chris
|
-
What I believe to be a new change to SharePoint 2010 is the addition of some error checking around Regional Settings and indexed columns in lists. When you try to change the regional settings and sort order to something with a different collation type (sorting based on a-Z0-9, or 'a' is bigger than 'A' type of stuff), you will get an error about the indexed columns. Being that I have turned on all site and site collection features, several lists have been created with indexed columns. Moral of the story is, you MUST set the sort order of the site FIRST, before you add any indexed columns and turn on any site and site collection features. If you don't, then you are in for a few hours of work to remove them and then add them all back!
Chris
|
-
Another interesting feature I have found with column and list validation. This feature works as described, but unfortunately only for NEW items. If you enable column or list validation AFTER items have been added to a list, you will get an annoying error telling you the item was updated previously. This does not happen on a new item addition. Basically this means you have to create all your columns and validation BEFORE you start adding any items to that list/library! Chris
|
-
In working with the document id service in one of my labs I found some interesting "features" of this new SharePoint 2010 feature. - When you activate the Site Collection Feature, you MUST wait for the timer job to complete BEFORE you change the site prefix. If you move to fast for SharePoint and you change the site prefix, you will HOSE the site collection timer job setup. I have found no way to fix this. You will never see the Document ID column show up in the libraries.
- After the timer job runs, if you want to change the prefix, you must update each item before the ID resets. For some reason, it is not changed via the timer job
- The format of the out of box ID Provider is SITEPREFIX-LISTID-ITEMID where LISTID is the autoincrement integer value for each list that is created on a web and the ITEMID is the autoincrement integer value for the item in the list
- ID's are ONLY generated for "Document" content types...this is LAME. I want all documents that inherit from "Document" to get an ID. SP Team, this is easy...check for the Content ID lineage prefix of 0x0101 and simply assign the ID!
- You can create your own Document ID Provider if you don't like this particular ID generation (part of my SharePoint Server Dev course)
Document ID Service has a ways to go, but it will get there! Chris
|
-
I was doing a demo today around SharePoint Designer 2010 workflows and found a bug in the design. When you create a workflow and want to edit the xoml file for the workflow, you must check it out. Why would you do that you ask? Well, the Designer Interface is far from perfect and you may need to move a step around in case you didn't realize you started to sub-nest your steps. The only way to do this is to edit the .xoml file. In order to edit the .xoml file, you must "Check Out" the file first. After you check it out, you can then edit the file in Designer via the XML Editor. Saving the file but not "Checking It Back in" will cause the file to lose resolution to the SharePoint workflow code. This will cause the following error in the log files: System.ArgumentNullException: Array cannot be null. Parameter name: bytes at System.Text.Encoding.GetString(Byte[] bytes) at Microsoft.SharePoint.Workflow.SPNoCodeXomlCompiler.CompileBytes(Byte[] xomlBytes, Byte[] rulesBytes, Boolean doTestCompilation, String assemblyName, SPWeb web, Boolean forceNewAppDomain)
Checking the file back in will allow the workflow to execute again. RESOLUTION: A check out should cause the workflow to be unpublished. You would then need to save and publish it again after check in
|
-
How do I know this? Because you get this error if you have a 2000 Active Directory: UserProfileApplication.SynchronizeMIIS: Failed to configure ILM, will attempt during next rerun. Exception: System.Security.SecurityException: The Kerberos subsystem encountered an error. A service for user protocol request was made against a domain controller which does not support service for user. If you want to move to SharePoint 2010, you must upgrade your active directory to 2003 or higher. Chris
|
-
I had a student ask me the other day if ForeFront would filter "Tags", "MetaData" and the various other new Social networking features of SharePoint 2010. I know it will filter the content of a document, but the metadata and tags...interesting question! To test it, I downloaded ForeFront Protection for SharePoint 2010 and installed it. I open the ForeFront Protection Console and configure the software to filter based on bad words. In this case, we are going to say the word "Apple" is a bad word :) To do this I open the Policy Management tab. I then click Filter Lists and then "Create". I select the "Keyword" option and then click "Next".
I create a Filter List called "Bad Words". In the Filter Criteria, I type "Apple" and click "Add":
Then click "Next" and move on to the Realtime Scan settings. Obviously I want this to be realtime, so I leave all the setting and click "Next".
I click "Next" on the "Schedule" and "On-Demand" steps and then click "Create". I then click "Save" to save my new Filter list. Next step is to make sure the Central Administration has the Anti-virus settings turned on:
Once all that has happend, it is time to test our new filtering. I create a document called "Apple.docx" with the text "Apple" inside it. I try to upload the document and I get this:
First, it is the right error, but there is a SharePoint 2010 bug here, the resource string did not get replaced properly when the site was created, or they missed the key in the .resx file for the English language pack! I create another document without the word "Apple" in it, but instead I add a new column called "Custom" to the document library. I add the document and set the column value to "Apple", when I upload the document, all works fine and it lets me upload and set the metadata to "Apple". Taking it one more step, let's try tagging the document as "Apple". And again, it lets me tag the item as "Apple". 
Given all the governance issues around metadata and tagging, it would seem that Forefront should also be able to filter the meta data and the social networking aspects of SharePoint, but alias, it does not.
Enjoy! Chris
|
-
I had a student ask me the other day, does a document set get the metadata at the document set level? I didn't know the answer...until now! Let's start with a simple search on sanspug.org for "docset", we get nothing Enable document sets in the site collection via "Site Actions->Site Settings->Site Collection Features->Activate Document Sets". Create a document set called "My Document Set" with a column called "Custom" 
- Create a new column called "Custom" in the document set
- We then need to setup some sub content types that the document set will contain via the "Document Set settings" link on the Document Set management page
- Assign the Document Set to a library (with allow management of content types enabled)
Create a new instance of the Document Set with the "Custom" column filled in with "docset" 
- Re-index the content via the Search Service Application
Re-running the orginal search, we get only the document set: 
Running a search for a sub document we get both document set folder and the document back: 
So that begs the question...why doesn't Document Set metadata filter down to the sub items? I think it should, but in the current version, it doesn't seem too with out some magic. You may be asking the question what are "Shared Columns": 
Well, you would think maybe it would cause the metadata to cascade down, but it doesn't, it only adds the column to the sub documents, which is weird in the first place because every time you add a content type, all the columns are added to the entire list anyway! UPDATE! A comment posted earlier pointed out there is a Timer Job Service that runs to update the metadata in the subcolumns. Firing this job will supposedly update the sub document data. However, I found that it doesn't for my Farm. It would also make sense that your sub-document content types have a column with the same name as the document set level (if you didn't do the Shared Columns approach) or I'd guess this Timer Job would not do anything. None-the-less, even after adding the column to the sub level docs via Shared Columns and the sub content types, the Timer Job still didn't update them :( Still some bugs to be worked out here...
http://technet.microsoft.com/en-us/library/cc678870.aspx
So the answer to the students question is no, a document set folder does NOT cascade its metadata to sub documents by default, it has to be updated by a Timer Job (supposedly)!
Have fun exploring! Chris
|
-
Every time you apply an update or change some setting in Central Admin, the Root web.config file gets updated to add the <clear/> element back into the providers. If you are using the machine.config file to propagate your membership settings, then this will be QUITE annoying.
Chris
|
-
For IT Pros, it is simple to setup the Forms Auth in SharePoint 2010. However, when a system is migrated to 2010 that uses the Membership Provider generic factory classes extensively...all hell breaks loose! The class definition for the Membership provider and MembershipUser is here. After looking at that, consider a piece of code such as: MembershipUser.ResetPassword("oldpassword", "newpassword"); The default membership provider set in SharePoint 2010 is "Microsoft.SharePoint.Claims.SPClaimsAuthMembershipProvider". The main job of this provider is to play an aggregation patten. Find all username in all available providers and allow you to select them. It also does some mapping of those users from the internal formats to a human readable format in the SharePoint web sites. This particular membership provider as advanced as it is...DOES NOT IMPLEMENT ALL THE METHODS OF THE MEMBERSHIP PROVIDER MODELS! This means if you used the membership methods extensively in your code (forms and web parts) in 2007, it is NOT going to work in 2010 when you migrate! You will get several different errors around method not implementing and good luck with getting everything to work. You will need to update your code to specifically call and instanate an instance of the membership providers that have been loaded in the process. Such as: MembershipProvider prov = Membership.Providers["AspNetSqlMembershipProvider"] From there, you would then make the appropriate calls in your forms and web parts using the defined provider variable.
Good luck with the code migration! And reference my other blog about other forms based auth migration issues here! Chris
|
|
|
|