Tuesday, October 23, 2012

The permissions granted to user 'mydomain\myAccount' are insufficient for performing this operation - rsAccessDenied


Just a short post re the above SQL Reporting Services 2008 R2 error when running in Integrated Mode.

I found that PWA Administrator users could run RS Reports without issue, but any Project Server users accessing the reports were greeted with rsAccessDenied - The permissions granted to user 'mydomain\myAccount' are insufficient for performing this operation
I checked my RDL details and confirmed that:

- Report published to ProjectBICenter\Reporting%20Services doclib
- DC published to ProjectBICenter\Data%20Connections%20for%20Performancepoint

So my users should have permissions as these libraries inherit from the BI Center.
After experimenting with these permissions for a little while, it turns out the SP permission required was "Contribute" permission.  Now that's a new one!

So, I've:
- Created a new SP group and granted Collaborate on the site/sublibraries
- allocated my ProjectReportAuthors and Readers groups (AD) to this SP group.

And it works...ta da!

Tuesday, September 18, 2012

setting up pwa as host header - project server 2010

setting up project server 2010 pwa as host header

Note:  this is a guide specifically for creating a secondary web application.  For root web app configuration, step one is not required.

this is my brief rough guide to PWA as a unique host-header site that differs from your web app host header in SharePoint:
- create an ALIAS dns records for your web app and point this to the root domain record for your IP address = e.g. programmes

- setup your web app and new iis site on port 80 with the host header record as created above


- create a root site collection

- now cross-check to IIS and ensure that the binding on your new iis site has the appropriate host entry

- once done, create a new ALIAS DNS record that points to your web app site host header as the target host.  This will be your PWA host header URL = e.g. http://itchange



- in IIS, create a new binding for the above host entry

- now create your pwa site as normal ensuring that you use the correct web application (Programmes) and the above URL as the host header record (checking the box to use this as a host header also)




once done and after some jiggery-pokery you end up with this:



note:  In my scenario I had to do a dns flush to get this to propagate correctly.


Friday, July 27, 2012

What to do when your application server goes bang

What happens when someone kills your Application Server?

So imagine the scenario:

Three Server Solution
- SQL
- SharePoint 2010 and Project Server 2010 Application Server (Central Admin Host)
- Wfe/ReportServer

We wake one bleary Monday morning to find that some numpty has killed the application server and the users are baying for blood.

Well surprisingly SharePoint handles this disaster recovery scenario particularly well.  Well.  Better than I thought it would to be honest.

Rough steps:

- quick SQL backup to be safe
- Rebuild your application server
- reinstall pre-reqs
- reinstall SP, PS, SPFSP1, SPS+PSSP1, Cumulative Update and other stuff you usually put on there.
- Run your configuration wizard to reattach to the Farm, and select Host CA Site

The last step was what I was VERY wary of.  Would the server simply reattach to the Farm, even when there is no CA server available?  

Bingo your back.... almost.... you are going to get errors a-gogo in your event log as things just aren't quite back to normal after the farm had its head cut off.

Error:  Navigate to your Project Server site and select BI Center:  Unexpected error occurred
Logs:  URL events stating System.ServiceModel.ServerTooBusyException:  Secure Store Service Did Not Performed (sic) the operation
Fix:       Secure Store needs to be reset 

> Service Applications | Secure Store Properties
> Regenerate Key

Just for safety i went through and reset all properties for configured Service Applications.

Started Microsoft SharePoint Foundation Web Application Service as IIS was also not showing the same sites on application server as on the WFE.

Outstanding issues:
- Navigating to performancepoint content returns an Unexpected Error & Event Log shows
"the user xxxxx attempted to access an item in the following location http://..............."
Verify the location exists and that the user has the Read Items permission

Ok so I missed resetting the PerformancePoint Service Application properties... after doing this, all is well

Search:
Application SErver Administration Job Failed for SErvice instance Microsoft.office.server.search.administration.searchServiceInstance
Reason: There is no project Portal_Content mounted under gatherer application 68d05007-b712-46f2-adc6-58c22066dbd0.

I didnt find a way around this... recreated Search Service Application

Anyway that was my route to getting this farm up and running again.  we were lucky we didnt have any code recover from the dead app server.


At the end of this process we had:
- SP Sites back up and available
- CA Back up and available
- PWA sites and BI reports


Hope it helped some...


Carl

Tuesday, January 24, 2012

Quick and dirty "Portfolio Gantt" report

We all like Project Centre, with its lists of projects and useful fields, but sometimes you just want it to do a little more.  For example:
- what if you could display some key milestones on the gantt
- what if you could easily display colour-coded gantt bar by phases.

The second point above (or variant of)  has been requested so many times and as of yet I have not seen anyone deliver such a report or view, so I decided to give it a go.

Now, before we go ahead, the following is done with no coding and no complex Reporting Services reports.  I am sure (and have seen) some amazing report views in SRS similar to this requirement, but this is a Proof of Concept solution.  Go work out your own way :P

So, a Portfolio Report:

Ingredients:
- Excel
- SP2010 Farm with Excel Services configured
- an ODC
- Some formulas
- Some conditional formatting

Step 1:  Define
This PoC is done working on the following:
- There are 5 Phases for each project
- The Gantt should include coloured bars by each of the 6 phases for the project
- This should update automagically based on current planned dates
- The date periods should be weeks across the columns

Note:  In this scenario I haven't added any other Project Categories into the Table view, or report filters.  I may get onto this later when defining the ODC connection

Step 2:  mockup in excel
- Create a new file
- Create a table to include the following columns.  This will be the basis for the data connection data later:
  1. Project Name (COL B)
  2. Phase 1 Start (COL C)
  3. Phase 1 finish
  4. Phase 2 Start
  5. Phase 2 Finish
  6. ......
  7. Phase 6 Finish (COL N)

Now in adjoining colums to the above table, create the same number of columns (two for each phase), using data formatting of Number, and reference the first set of colums, so:
  1. IF([COL C] = "","",[COL C]
  2. IF([COL D] = "","",[COL D]
  3. etc
  4. IF([COL N] = "","",[COL N]
So now we have

Now we want to set up our timephased column headers.  Initially we will do this manually so:

- on your first available column, enter the date you wish to start from:
- then on the next column, same row, create a formula to add 7d to the previous date
- copy this formula field to the right as far as you wish the report to go.
- once done, create a formula in the cell row above the dates entered (ive done this in Row 2), and convert each date to a number field (as we did before)


Now then.  How do we colour scheme our table by phase?  we are going to write a nested IF Statement that compares the Date Value fields for each phase (created in the second image above) to the column date value created in the step previous to identify whether the formula will result in:
"1" = Phase 1
etc
"5" = Phase 5
or 
NO PHASE

Note: In this example, one phase can only happen in one week.

The formula:
=IF($P7=AB$2,1,IF($P7=AB$2,1,IF($R7=AB$2,2,IF($R7=AB$2,2,IF($T7=AB$2,3,IF($T7=AB$2,3,IF($V7=AB$2,4,IF($V7=AB$2,4,IF($X7=AB$2,5,IF($X7=AB$2,5,IF($Z7=AB$2,6,IF($Z7=AB$2,6))))))))))))))))))

where:  
$P7 = Project Phase 1 Start
$Q7 = Project Phase 1 End
etc
$AA7 = Phase 6 End
and
AB$2 = the timephased period in column AB2 (the first date period)

Now copy this formula down the column to the bottom of the table, and across to the end of the timephased period defined 


Now we will do the conditional formatting on the timephased periods:

Now once this report is published to a SP2010 report library it looks like this:


Next Steps:

- Add a Current Date marker
- Make this a live report by connecting the Excel file to a SP2010 Data Connection and Project Server 2010 Reporting Database
- Improve on formatting

Monday, January 9, 2012

Someone killed your farm #projectserver

** WARNING ** following this post may kill your already sickly farm....

Imagine the scenario:
- during some troubleshooting, someone deletes some EPM databases that they believe no longer point to a PWA Site (but actually do)
or
- when deleting a PWA Site, some environmental issue interrupts the process before it completes
or
- an issue occurred during PWA Site provisioning
or
- who knows what, sometimes bad things happen......

what you will see:

Sharepoint will continually report events such as :

An exception occurred while running the job scheduler.   Reason: Cannot open database "ProjectServer_Published" requested by the login. The login failed.  Login failed for user xxxxxxxxxxxxxxxxx.  Technical Details: System.Data.SqlClient.SqlException: Cannot open database "ProjectServer_Published" requested by the login. The login failed.  Login failed for user xxxxxxxxxxxxxx     at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception

and

Project Server Queue 7626  Critical  Cannot start queue. SSP: 150e20ee-631b-420d-9de8-7f47b43fc67e  SiteUID: 5afc4aab-f94e-4e69-b7ba-7127a75535c4 Url:  Queue: ProjectQ
Project Server Queue 7626   Critical Cannot start queue. SSP: 150e20ee-631b-420d-9de8-7f47b43fc67e  SiteUID: 5afc4aab-f94e-4e69-b7ba-7127a75535c4 Url:  Queue: TimesheetQ

- your event log will clog up with the above
- any other EPM site queues will begin to slow down
- users get very angry

What's happening under the hood?

basically deleting stuff from a SP farm WITHOUT doing so via STSADM, Powershell or the CA UI will cause all kinds of horrible problems that will mean you will either have to recreate Service Apps OR the whole farm (Depending on the scenario) to resolve.

What can you do:
well, beside hitting the person that did it in the first place, there is an STSADM command that could save you.  However I will repeat the warning at the top of this page.  running this command may kill your farm completely so ensure you have a DR strategy in place and ready to implement.

The command is:  stsadm -o deleteconfigurationobject -id {GUID}

Now the GUID bit is the ID of the object you wish to delete from the Configuration Database "Objects" Table.  

Which object should I delete, there are 1000's

- Objects are linked together via the Dependencies table
- your aim should be to attempt to identify the PWA site object that links to these now orphased DB objects.  therefore start with any GUIDs linked to errors in the event log
- passing the PWA site GUID through the STSADM command will delete the site (this is your only option) but SHOULD also delete all the dependent orphaned objects, thus stopping the errors occurring as all trace of the site will be removed.

Note:  In some scenarios, dependencies may be broken, which may cause some residual records to remain and problems to persist.  It is worth identifying all the dependant objects prior to beginning this process.


An Example of a query that will help identify the relevant PWA Site Objects from the Farm is as follows:

SELECT *
  FROM [SharePoint_Config].[dbo].[Objects]
  where Properties like '

an example query to identify orphaned records is here (mileage may vary)

SELECT OD.ID,OD.Name, O.ID,O.Name
FROM Objects
INNER JOIN Dependencies ON O.ID = D.ObjectID
INNER JOIN Objects AS OD ON D.DependantID = OD.ID
WHERE O.Name like '[INSERT-DB-NAME-IN-EVENT-LOG-ENTRIES HERE]'

                        above query courtesy of this post http://viksrini.blogspot.com/2010/04/delete-orphaned-project-server-database.html

have fun!