donderdag 27 november 2014

List assigned right for a site collection

A quick way to find out the rights assigned to a site collection.

static void Main(string[] args)
{
    using (SPSite site = new SPSite(args[0]))
    {
        foreach (SPWeb web in site.AllWebs)
        {
            try
            {
                if (web.HasUniqueRoleAssignments)
                {
                    Console.WriteLine(web.ServerRelativeUrl);
                    var col = web.RoleAssignments;
                    foreach (SPRoleAssignment item in col)
                    {
                        string[] roles = item.RoleDefinitionBindings.Cast<SPRoleDefinition>().Where(b => b.Name != "Beperkte toegang").Select(b => b.Name).ToArray();

                        if (roles.Length > 0)
                        {
                            if (item.Member is SPGroup)
                            {
                                SPGroup g = (SPGroup)item.Member;
                                if (g.Users.Count > 0)
                                    {
                                    Console.WriteLine("Groep: {0} - Role(s): {1} ({2} members)",
                                        item.Member.LoginName,
                                        string.Join(", ", roles),
                                        g.Users.Count);
                                }
                            }
                            else
                            {
                                SPUser user = (SPUser)item.Member;
                                if (!user.IsSiteAdmin)
                                {
                                    Console.WriteLine("User: {0} - Role(s): {1}",
                                        item.Member.LoginName,
                                        string.Join(", ", roles));
                                }
                            }
                        }
                    }
                    Console.WriteLine();
                }
            }
            finally
            {
                web.Dispose();

            }

        }
    }
}
Note. Roles "Beperkte toegang", Dutch name for the role "Limited access" is filtered out, and users that are SiteCollection administrators are excluded from the results to create a more readable result.

vrijdag 21 maart 2014

Powershell selecting web propertie bag

Quick tip: To list the value of web properties you can use the following powershell command:
$web = Get-SPWeb
$web.AllProperties.GetEnumerator() | Where-Object { $_.Name -like "tresoar.story.pre*"} | Sort-Object {$_.Name}

donderdag 6 februari 2014

Sharepoint 2013 Failed to create a mysite, trusted domain

When working with SharePoint 2013 I encountered the personal sites where not created. The ULS log on the Front-End web servers did not show a clear indication of why the creation was failing. However examining the ULS logs on the application servers I found the following exception:
My Site creation failure for user 'domain\user03' for site url 'https://my.site.nl/personal/user03'. The exception was: Microsoft.Office.Server.UserProfiles.PersonalSiteCreateException: A failure was encountered while attempting to create the site. ---> Microsoft.SharePoint.SPException: Kan de gegevens voor de sleutel voor de toepassingsreferenties niet ophalen. at Microsoft.SharePoint.Administration.SPCredentialManager.DecryptWithApplicationCredentialKey(Byte[] rgbEncryptedPassphrase) at Microsoft.SharePoint.Administration.SPPeoplePickerSearchActiveDirectoryDomain.get_Password() at Microsoft.SharePoint.Utilities.SPActiveDirectoryDomain..ctor(SPPeoplePickerSearchActiveDirectoryDomain peoplePickerDomain) at Microsoft.SharePoint.Utilities.SPUserUtility.GetWindowsPrincipalResolvers(SPWebApplication webApp, String userAccountDirectoryPathRestriction, SPPrincipalResolver bySidResolver) at Microsoft.SharePoint.Utilities.SPUserUtility.CreatePrincipalResolvers(SPWebApplication webApp, ICollection`1 urlZones, Nullable`1 currentZone, SPPrincipalResolver bySidResolver, String userAccountDirectoryPathRestriction, Boolean alwaysAddWindowsResolver) at Microsoft.SharePoint.Utilities.SPUtility.ResolveWindowsPrincipal(SPWeb web, SPWebApplication webApp, String input, SPPrincipalType scopes, Boolean inputIsEmailOnly) at Microsoft.SharePoint.Administration.Claims.SPActiveDirectoryClaimProvider.FillResolve(Uri context, String[] entityTypes, Boolean inputIsEmailOnly, String resolveInput, List`1 resolved) at Microsoft.SharePoint.Administration.Claims.SPActiveDirectoryClaimProvider.FillResolve(Uri context, String[] entityTypes, SPClaim resolveInput, List`1 resolved) at Microsoft.SharePoint.Administration.Claims.SPClaimProvider.Resolve(Uri context, String[] entityTypes, SPClaim resolveInput) at Microsoft.SharePoint.Administration.Claims.SPClaimProviderOperations.Resolve(Uri context, SPClaimProviderOperationOptions mode, String[] providerNames, String[] entityTypes, SPClaim resolveInput) at Microsoft.SharePoint.Utilities.SPUtility.ResolvePrincipalClaims(SPWeb web, SPWebApplication webApplication, Nullable`1 urlZone, String input, SPPrincipalType scopes, SPPrincipalSource sources, SPPrincipalInfo user, Boolean inputIsEmailOnly) at Microsoft.SharePoint.Utilities.SPUtility.ResolvePrincipalInternal(SPWeb web, SPWebApplication webApp, Nullable`1 urlZone, String input, SPPrincipalType scopes, SPPrincipalSource sources, SPUserCollection usersContainer, Boolean inputIsEmailOnly, Boolean alwaysAddWindowsResolver) at Microsoft.SharePoint.Utilities.SPUtility.ResolvePrincipal(SPWebApplication webApp, Nullable`1 urlZone, String input, SPPrincipalType scopes, SPPrincipalSource sources, Boolean inputIsEmailOnly) at Microsoft.SharePoint.Administration.SPSiteCollection.Add(SPContentDatabase database, SPSiteSubscription siteSubscription, String siteUrl, String title, String description, UInt32 nLCID, Int32 compatibilityLevel, String webTemplate, String ownerLogin, String ownerName, String ownerEmail, String secondaryContactLogin, String secondaryContactName, String secondaryContactEmail, String quotaTemplate, String sscRootWebUrl, Boolean useHostHeaderAsSiteName, Boolean overrideCompatibilityRestriction) at Microsoft.SharePoint.SPSite.SelfServiceCreateSite(String siteUrl, String title, String description, UInt32 nLCID, Int32 compatibilityLevel, String webTemplate, String ownerLogin, String ownerName, String ownerEmail, String contactLogin, String contactName, String contactEmail, String quotaTemplate, SPSiteSubscription siteSubscription) at Microsoft.Office.Server.UserProfiles.UserProfile.<>c__DisplayClass2.b__0() - -- End of inner exception stack trace --- at Microsoft.Office.Server.UserProfiles.UserProfile.<>c__DisplayClass2.b__0() at Microsoft.SharePoint.SPSecurity.<>c__DisplayClass5.b__3() at Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode) at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback secureCode, Object param) at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode) at Microsoft.Office.Server.UserProfiles.UserProfile.CreateSite(String strRequestUrl, Boolean bCollision, Int32 overrideCompatLevel, Int32 lcid).
The exception shows that something is wrong with the application encryption key. The application encryption key is used to secure the credentials used to connect to the trusted domain. To fix this issue you have to use STS-ADM, there is no powershell command for this:
sts-adm -o setapppassword -password SomeVeryStrongPassword

vrijdag 21 september 2012

devNetNoord #3: Een succes

 

clip_image00120 September werd alweer het 3e devNetNoord event gehouden. devNetNoord is een platform voor en door de Noord Nerdelandse .NET developers. Er waren 3 sprekers te gast met een aantal interessante onderwerpen.

De eerste spreker was Kees Dijk die ons in een korte tijd het hele asynchrone dotNet landschap liet zien. Van de historische componenten uit dotNet 1.0 en 2.0 tot de relatief nieuwe toevoegingen in dotNet 4.5. Asynchroniteit is een onmisbaar component in moderne toepassing, dit heeft verschillende oorzaken: toegenomen belang van een responsive UI. Voor moderne applicaties, denk aan apps op een tablet, is het dodelijk als de UI niet vlot reageert op de user input. Dit heeft als gevolg dat alle operaties asynchroon afgehandeld moeten worden zodat de UI thread niet geblokkeerd wordt.

Een ander gebruik van asynchroniteit is het beter kunnen benutten van de meerdere cores van moderne CPU’s. Door je werk te verdelen over meerdere core’s kan er een behoorlijke performance winst behaald worden.

Gelukkig wordt het door verschillende toevoegingen aan dotNet steeds eenvoudiger om asynchroniteit in te bouwen. Vooral de introductie van Task<T>, async/await, Parallel Ling (plinq) maken het eenvoudig(er) om asynchroon/parallel te programmeren. Ook toevoegingen de Reactive Extensions (RX) maken het eenvoudig om bijvoorbeeld events van sensoren (denk aan GPS, touch input) eenvoudig af te handelen.

De tweede spreker, Pieter Joost van de Sande, had een heel ander, onderwerp: Command Query Responsibility Segregation (CQRS) architectural pattern. Een verfrissende kijk op het opzetten van een applicatie architectuur. De CQRS werd vergeleken met de traditionele drie lagen architectuur van Presentatie, Business logica en data acces. Bij CQRS is de architectuur opgesplitst in een lees kant, geoptimaliseerd voor het presenteren van de gevraagde data. De data wordt zoveel mogelijk hap klaar en ge-pre-rendered voor de UI klaargezet, voor maximale responsiveness en schaalbaarheid. De andere kant van de architectuur is de schrijf/actie kant, waar die de gebruikers acties afhandelt. De acties worden als commands door gegeven een command handler welke er events van genereerd. Al deze events worden afgehandeld door de domein laag en opgeslagen in een repository. Door verschillende ‘inspectors’ op de events worden lees data bijgewerkt .

clip_image002

Grote voordelen van de architectuur:

  • Schaalbaar en snel. De read kant is geoptimaliseerd voor presentatie en kan eenvoudig geschaald worden.
  • Doordat alles wat gebeurd door de applicatie geregistreerd is het ook achteraf mogelijk business logica en business value uit de data te halen. Er kan waardevolle marketing informatie uit de historische data gehaald worden!

Nadelen:

  • Specialistische hardware voor het afhandelen van de IO’s
  • Er moet veel data gemanaged worden

 

clip_image003Als laats liet Gerard van der Pol ons de nieuwe features van Visual Studio 2012 en TFS 2012 zien. Wat vooral interessant is zijn de nieuwe toevoegingen aan TFS om het werken in teams beter te ondersteunen. De scrum dashboard hebben bijvoorbeeld een update gekregen zodat deze ook goed te gebruiken zijn als vervanger van het vertrouwde papieren scrum dashboard met de gekeurde post-its. Vooral handige als je team fysiek over meerdere locaties verdeeld is.

Als met al weer een geslaagd event! Tot de volgende devNetNoord.

woensdag 22 augustus 2012

Compiler warning: There was a mismatch between the processor architecture of the project being

I recently created a new SharePoint 2010 development machine. Since Visual Studio 2012 is out now I decided to use this version of Visual Studio. Everything works fine, but I receive a compiler warning:
There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL", "AMD64". This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project.

Since I do not want to change the deployment target platform, the most simple solution is to suppress the error message.

Unload the project en edit the project file.
Add the following to the  (first) propertygroup element

<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>

maandag 20 augustus 2012

No ULS log for web applications with a custom application pool account

When recreating a new SharePoint  I noticed no ULS for a web application. When creating a new managed account in the new web application wizard the user is not added to the "Performance Log Users" group.

When adding the used to this group, and a IIS reset, ULS log started to appear for the web application. 

dinsdag 20 april 2010

"The filename or extension is too long." when accessing MOSS CrawlRules FIX



Error when accessing the crawl rules with the SharePoint API:

Unhandled Exception: System.IO.PathTooLongException: The filename or extension is too long.
at Microsoft.Office.Server.Search.Administration.SearchApi.RunOnServer[T](CodeToRun`1 remoteCode, CodeToRun`1 localCode, Boolean useCurrentSecurityContext, Int32 versionIn)
at Microsoft.Office.Server.Search.Administration.SearchApi.RunOnServer[T](CodeToRun`1 remoteCode, CodeToRun`1 localCode, Int32 versionIn)
at Microsoft.Office.Server.Search.Administration.SearchApi.GetCrawlRuleList(Int32 versionIn)
at Microsoft.Office.Server.Search.Administration.CrawlRuleCollection..ctor(Content parent)
at Microsoft.Office.Server.Search.Administration.Content.get_CrawlRules()


You can fix this error by deleting the crawl rule from the registry. Check the following registry key
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office Server\12.0\Search\Applications\90604ba8-1a0b-448d-87b6-9b5c04a69c9b\Gather\Portal_Content\Sites\*\Paths\0

and delete it.
After a reboot the crawl rules are accessible again.

Arnold thanks 4 the tip.