Running a Powershell script as a scheduled task

It should have been simple. I have a Powershell script that works as it should, I just need it to run on the hour, every hour. So create a scheduled task, and attach the script. Do a run now, just to make sure it works.

And technically, it works. That’s what the result of the scheduled task says: Task Completed 0x0. But the actual Powershell script hasn’t been actioned.

Once again I confirmed that running the script by itself works. I wrap the code in the script in a Try/Catch with a log file. But nothing writes to the log file.

I googled and googled, and checked all the following things:

  • I globally set Set-ExecutionPolicy to Unrestricted.
  • I tried running the task under a local account with admin permissions, as someone mentioned that domain accounts can’t run scheduled tasks. That doesn’t appear to be the case.
  • I checked that my account has Log on as batch.
  • I added the run script command to a batch file, and called the batch file from scheduled tasks. Still didn’t work!

It turns out that even when setting the Set-ExecutionPolicy to Unrestricted, you still need to add the parameter -ExecutionPolicy ByPass. Just that one little thing. If you are asking an application to run a script for you, it needs to bypass execution policy.

So the correct config was:

Program/script: “Powershell” (should resolve correctly to powershell.exe)

Arguments: -ExecutionPolicy ByPass -File {script file with path}

Start in: {Path of folder that script sits in}

SharePoint and CSOM – Get an application running on SP2007 to access content and managed metadata on SP2013 using CSOM

Please don’t ask why, only know that it had to be done. The requirement was to copy documents in a library in SP2013 to another library in SP2007. This is made easier by using CSOM, but getting the right libraries can be a little tricky. I also needed to access managed metadata values, which SP2007 is like “meta-whata-now?” about.

I found that I needed to use the Microsoft.SharePoint.Client libraries from SP2010, as I was developing on the SP2007 dev box. This is because the 2013 DLLs require .NET 4.0, and 2007 uses 3.5.

So I had to:

  1. Create a new folder on your 2007 server/dev environment in C:\Program Files\Common Files\microsoft shared\Web Server Extensions\. You should already see a folder in there called “12”. Create a new one called “14”.
  2. In “14”, create another folder called “ISAPI”. This mirrors the folder structure of 2010. It’s not strictly necessary but it keeps things organised and clear.
  3. On your 2010 server (you have one, right? If not, you’ll need to find these from somewhere,) copy the client DLLs you’ll need. To do my task, I needed the following:
    1. Microsoft.SharePoint.Client
    2. Microsoft.SharePoint.Client.Runtime
    3. Microsoft.Office.Server
    4. Microsoft.SharePoint.Taxonomy
  4. If you find you need to use other libraries from 2010, add them to this same folder.
  5. In Visual Studio, add references in your project to the DLLs  in the new “14” folder.
  6. For the core Microsoft.SharePoint DLL, reference the DLL in the “12” folder.
  7. Keep to the DLLs in the 12 folder wherever possible.

That was the start of my fun crossing-the-streams adventure. I used the above to create a console app that scans given libraries by name, for tagged documents to “publish”, copying some of their managed metadata. I used a couple of good resources, which I’ll link to in the next post regarding this subject.

2008 SSRS Report from CRM 2011: Font with space in its name not rendering correctly

Google was truly not my friend for this one, so now I’ve hacked fixed it, I’m giving back in case anyone has the same issue.

I’ve been tasked with creating some pretty reports in SSRS 2008, which will run from CRM 2011. The company font I’ve been asked to use is Century Gothic.

I created the reports, which rendering perfectly in preview mode and when creating PDFs in SSRS. I then uploaded the reports to CRM, and ran it from its entity.

All instances of Century Gothic came out as Times New Roman. The same happened when exporting it to PDF. Century Gothic didn’t appear to be installed on the CRM report server, so I installed it on there and scheduled the server reboot overnight.

The next day, it was still Times New Roman, except for one textbox which had Century Gothic displayed correctly.

Looking under the hood with developer tools, I saw this:

ssrs-crm-font-1

I cracked open the code, but I couldn’t see any difference between the working correctly textbox, and the others, which had the split font name. I tried putting quotes, singe and double, round the font name in the code, but Visual Studio then couldn’t resolve the font name correctly itself.

I tried other fonts with two names, and got the same problem.

Looking at the working textbox, I saw that the textbox itself didn’t have a font set, only the selected text inside:

ssrs-crm-font-2 ssrs-crm-font-3

The broken textboxes had the font applied directly to it. Creating a new blank textbox automatically assigns a font to the box, which can’t be cleared.

So how to fix it? The working textbox had a bit of Arial text in it as well. So that gave me the idea to add a couple of spaces to the end of each Century Gothic textbox, and make one of those spaces Arial.

That cleared the Font property on the textbox, and then the Century Gothic font started displaying.

What a horrible, hacky fix 😦

SharePoint and CSOM – Useful links

It’s been a busy couple of weeks, with my head down working on some SharePoint madness which will form at least a couple of articles to come. It involved getting SP2007 to talk to SP2013, by way of the SP2010 client dlls. It’s been as fun as it sounds

I’ve had to some serious Googling, which has generally been my friend . SO here is another list of links that I’ve found invaluable and will be returning to again and again.

Complete basic operations using SharePoint 2013 client library code
https://msdn.microsoft.com/en-us/library/office/fp179912.aspx

SharePoint 2010 – Using the Client Object Model (good CAML resources)
https://msdn.microsoft.com/en-gb/library/ff798388.aspx
https://msdn.microsoft.com/en-us/library/ee857094.aspx

SharePoint 2010 – How to retrieve list items using the COM
https://msdn.microsoft.com/en-us/library/office/ee534956(v=office.14).aspx

CAML queries and the Client Object Model (this is a really excellent resource!)
https://karinebosch.wordpress.com/2012/02/03/caml-and-the-client-object-model/

Server 2003 needs hotfixes for SHA2 256 or higher encryption, or X.509 certificates

Are you still running Windows Server 2003? For shame!

Have you been keeping up with the hotfixes? Hmmm…

Well, you’re in good company. Forgetting for a moment that Microsoft ends support for Server 2003 on 16 July 2015, sometimes it’s easier to just let it keep running.

Beware what happened to us though. Our website stopped serving up a page in an iFrame from a secure site. We spoke to the company, who said the certificate had been updated and to just grab the new one. I had no problem on my local machine going directly to the page, but couldn’t do it via the website.

The company had updated their certificate to a version which our Server 2003 could no longer communicate with:

Windows Server 2003 and Windows XP clients cannot obtain certificates from a Windows Server 2008-based certification authority (CA) if the CA is configured to use SHA2 256 or higher encryption
https://support.microsoft.com/en-us/kb/968730

Applications that use the Cryptography API cannot validate an X.509 certificate in Windows Server 2003
https://support.microsoft.com/en-us/kb/938397

Not to mention that the server had IE6 on there. But thanks to Hotfixes and a swift restart, our 2003 Server machine lives to fight another day, until we finally put it out of its misery. Soon I hope.

Filtering by SharePoint repeating data in your InfoPath 2013 list item form

That was a tortuous post title! Another post to help me remember.

I created an InfoPath 2013 form to add a new list item. One of the fields was a lookup field using a column from another list.

The lookup field was a Person field, which in InfoPath looks like repeating data.

I needed the dropdown list to show values where there was nothing in this Person field. It took me a bit of messing about to get it right.

Filtering with repeating data

Filtering with repeating data

The trick is to filter on the group. In my instance, I needed to show all entries where there was nothing in the User field for that list item.

The logic required was “All occurrences of Person are blank”, on the List Item row.

Hope this helps someone…

ASP:Hyperlink with dynamic url value from C# – “Object reference not set to an instance of an object”

Another gotcha found today.

I’ve created my ASP:Hyperlink field in the aspx page, with runat=”server” (oh yes, that one ain’t catching me out anymore).

In the C# code behind file, I set the URL to be one thing or another, depending on some other logic. It’s MyHyperlink.NavigateUrl = “blah.aspx”.

I run the thing, and I get “Object reference not set to an instance of an object”. Dammit!

Have I forgotten how to instantiate the field properly? It’s not in a grid view, or anything fancy like that.

A random Google result gave me the answer, phew! .NET3.5 and above requires the Hyperlink to have its NavigateUrl property set to something when created. So on the page I set it to “#”  on creation and then set it dynamically as necessary.

Another one not to forget!