Applying a custom webtemplate to a sitecollection works on powershell ise and not on powershell console - sharepoint

I'm working on a automated script for deploying sharepoint projects. I'm using a sandbox level webtemplate that must be applied when de site is created. I had a lot of troubles doing that because it seems like sharepoint caches the list of webtemplates and get-spwebtemplate doens't find the new added one. The way I made it work is this:
[system.reflection.assembly]::LoadWithPartialName("Microsoft.Sharepoint")
$site= new-Object Microsoft.SharePoint.SPSite($web_application_complete_url)
$site.OpenWeb().ApplyWebTemplate($web_template_name)
$site.Dispose()
As you can see, I'm using the .net sharepoint api instead of the cmdlets. This works sweet in PowerShell ISE but in the PowerShell console it throws an exception regarding a referenced DLL:
Exception calling "ApplyWebTemplate" with "1" argument(s): "Could not load file
or assembly 'XXX.SharePoint.Common, Version=1.0.0.0, Culture=neutral, PublicK
eyToken=534c125b45123456' or one of its dependencies. The system cannot find th
e file specified."
At C:\Build\SharePointBuild.p
s1:318 char:37
+ $site.OpenWeb().ApplyWebTemplate <<<< ($web_template_name)
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordE
xception
+ FullyQualifiedErrorId : DotNetMethodException
The assembly is perfectly registered in the GAC when installing the web template sandbox solution in the sitecollection.
Any ideas? thanks!

Is there any chance you are running 64-bit ISE and 32-bit PowerShell console (or vice-versa)? If it's not that then another difference is that ISE runs in COM STA mode whereas PowerShell Console runs in MTA by default. This would only matter if SharePoint uses COM under the covers (which I think it does). You could verify this by running PowerShell Console in STA mode like so:
C:\> Start-Process PowerShell -arg -sta
Assuming you're on PowerShell 2.0 for the Start-Process cmdlet.

Related

Add-SPOTheme is not recognized – SharePoint Management Shell

I’m a SharePoint Online Administrator, I want to register a customized Company Theme for our Office 365 tenant. Using SharePoint Online Management Shell, I came across the error message “Add-SPOTheme is not recognized as the name of a cmdlet, function, script file, or operable program”.
I have tried the solution from this site: https://www.technologytobusiness.com/microsoft-sharepoint/add-spotheme-not-recognized with no luck.
I also tried running the command on both 32 and 64 bit versions of PowerShell with no luck.
So, I’m not sure what am I missing?
You have to install Microsoft.Online.SharePoint.PowerShell PowerShell module before using the Add-SPOTheme cmdlet:
Install-Module -Name Microsoft.Online.SharePoint.PowerShell
If already installed, update to latest version.
Follow this documentation: Get started with SharePoint Online Management Shell

different behaviour of azure devops agents on hosted vm when different computer access the vm

Edit : After a lots of testing, we managed to find a comon point between the machines which, when connected using RDP to our environment, breaked the excecution of excel funtionnalities called from a powershell script launched by an azure devops agent : All these machines have a touchscreen, machines without a touchscreen do not break it (tryed with 3 machines with touchscreen, different contructors and 4 machines without touchscreen)
Edit 2: When the touchscreen is disabled being connected to the machine with RDP do not break the script anymore
I'm using AzureDevops agents to execute a powershell task on a Cloud Hosted environment, the task is very simple it justs creates a workbook and saves it:
try{
write-host 'initalized excel'
$Excel = New-Object -ComObject Excel.Application
write-host 'adding WB'
$Workbook = $Excel.Workbooks.Add()
write-host 'Saving Wb'
$Workbook.SaveAs('C:\test\test.xlsx')
}
finally{
write-host 'quitting excel'
$Excel.quit()
}
Here's the output of the devops Task :
##[section]Starting: PowerShell Script
==============================================================================
Task : PowerShell
Description : Run a PowerShell script on Linux, macOS, or Windows
Version : 2.151.2
Author : Microsoft Corporation
Help : https://learn.microsoft.com/azure/devops/pipelines/tasks/utility/powershell
==============================================================================
Generating script.
========================== Starting Command Output ===========================
##[command]"C:\windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command ". 'C:\agent\_work\_temp\33ed6d09-53ba-427a-a7ac-ea425a98767c.ps1'"
initalized excel
adding WB
quitting excel
Exception from HRESULT: 0x800A03EC
At C:\agent\_work\_temp\33ed6d09-53ba-427a-a7ac-ea425a98767c.ps1:6 char:5
+ $Workbook = $Excel.Workbooks.Add()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:) [], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException
This is what happens when my colleague is connected to the virtual machine on which the agent executes the script. My colleague is connected with the windows remote desktop tool.
When I'm the one connected on the VM using RDP it works fine :
##[section]Starting: PowerShell Script
==============================================================================
Task : PowerShell
Description : Run a PowerShell script on Linux, macOS, or Windows
Version : 2.151.2
Author : Microsoft Corporation
Help : https://learn.microsoft.com/azure/devops/pipelines/tasks/utility/powershell
==============================================================================
Generating script.
========================== Starting Command Output ===========================
##[command]"C:\windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command ". 'C:\agent\_work\_temp\436b2d56-2a41-4f75-97bb-01d4c41407e6.ps1'"
initalized excel
adding WB
Saving Wb
quitting excel
##[section]Finishing: PowerShell Script
My colleage and I RDP to the virtual machine with the same exact user.
We tried on another virtual machine with another devops agent, the same issue arise.
I'm a bit lost and I dont know how to troubleshoot this issue at all, also if you have any other suggestion for the title I'll take every piece of advice.
Edit:
We also tried to put this script in a loop and write if it succeed or fail, when I rdp to the virtual machine, it works, if I disconnect it works, as soon as my colleague RDP into the virtual machine it starts failing, if I reconnect (thus disconnecting my colleague) it works again. (We RDP with the same user)
Edit2 :
I'm receiving an edit suggestion from someone who noticed me that :
From the user's comment->' when the agent is already running and
creating excel files in a loop, the simple fact my colleague rdp to
the vm breaks the excel file creation.' This issue seems to have
nothing to do with azure devops. The reason for the problem is due to
rdp
Well it's an azure devops agent problem as well since simply running the script manually works for both of us. It's a RDP issue that cause the Devops agent to be unable to use some of the excel-powershell functions, so I think the Azure Devops tag is still accurate
Edit :
In the finally block try outputting the full error stack with: $Error
| Format-List -Force – HAL9256
Here's the error :
Exception : System.Runtime.InteropServices.COMException (0x800706BE): The remote procedure call failed.
(Exception from HRESULT: 0x800706BE)
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode,
IntPtr errorInfo)
at System.Management.Automation.ComInterop.ComRuntimeHelpers.CheckThrowException(Int32
hresult, ExcepInfo& excepInfo, ComMethodDesc method, Object[] args, UInt32 argErr)
at CallSite.Target(Closure , CallSite , ComObject )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at CallSite.Target(Closure , CallSite , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at System.Management.Automation.Interpreter.DynamicInstruction`2.Run(InterpretedFrame frame)
at
System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame
frame)
TargetObject :
CategoryInfo : OperationStopped: (:) [], COMException
FullyQualifiedErrorId : System.Runtime.InteropServices.COMException
ErrorDetails :
InvocationInfo : System.Management.Automation.InvocationInfo
ScriptStackTrace : at <ScriptBlock>, C:\agent\_work\_temp\fae3ef7a-700d-49c1-8f1f-7f7d2bc0d49e.ps1: line 8
at <ScriptBlock>, <No file>: line 1
PipelineIterationInfo : {}
PSMessageDetails :
Running Excel under an automated, unattended process (such as an Azure DevOps Agent) in unsupported and can lead to all kinds issues, like the ones you are running into.
The official recommendation is to rely on a 3rd party component like Excel Package Plus (free), NPOI (free), SpreadSheetGear (Commercial) or Aspose Cells.NET (Commercial). Or to use System.IO.Packaging and edit the XML for the Office document directly. These do not depend on having Excel installed on your server, are actually supported and don't have all kinds of license issues associated with them. Migrating your scrips over to these other package types is often not very hard, since they take a very similar API for portability.
Besides the technical issues you're running into, the licensing may be even hairier, as Office isn't allowed to be automated 'on behalf of other users' and generally isn't allowed to run on a server.
Besides the technical problems, you must also consider licensing issues. Current licensing guidelines prevent Office applications from being used on a server to service client requests, unless those clients themselves have licensed copies of Office. Using server-side Automation to provide Office functionality to unlicensed workstations is not covered by the End User License Agreement (EULA).
https://support.microsoft.com/en-us/help/257757/considerations-for-server-side-automation-of-office
You may be able to solve some of the issues, like the one you are experiencing now, but you're likely going to run into new ones. Running the Azure DevOps agent interactively may help, that way Excel will be launched in the interactive session as well, instead of a protected hidden user session with no real desktop. What's likely happening, is that the second user connecting over RDP is closing all other sessions when they log on, or locking all sessions as they log off.
here are security risks when you enable automatic logon or disable the screen saver because you enable other users to walk up to the computer and use the account that automatically logs on. If you configure the agent to run in this way, you must ensure the computer is physically protected; for example, located in a secure facility. If you use Remote Desktop to access the computer on which an agent is running with auto-logon, simply closing the Remote Desktop causes the computer to be locked and any UI tests that run on this agent may fail. To avoid this, use the tscon command to disconnect from Remote Desktop. For example:
%windir%\System32\tscon.exe 1 /dest:console
https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/agents?view=azure-devops#interactive-or-service
Another problem concerning excel automation on a server, is that existing Excel instances are re-used. This may cause the host excel to run under different credentials than the process doing the automation.
To run the agent interactively configure the serves to auto-logon (this utility encrypts the credentials used) and add run.cmd in the agent folder to the start-up executable list (either in the registry or a shortcut in the start menu). You can also make the agent executable (c:\windows\system32\cmd.exe /c path\to\agent\run.cmd) the default shell. There are quite a few docs on setting a custom shell.
You'll need to disable the screensaver and lockscreen for this session as well, which well require you to physically secure the server, otherwise anyone with access to the servers console will be able to access the running interactive session.
And you must unsure you always disconnect the remote desktop session without locking it (like above).
We finally identified that the problem only happened when using the RDP from a laptop having a touchscreen.
We then disabled the touchscreen using this documentation :
In the search box on the taskbar, type Device Manager, then select
Device Manager.
Select the arrow next to Human Interface Devices and
then select HID-compliant touch screen. (There may be more than one
listed.)
Select the Action tab at the top of the window.
Select Disable device or Enable device, and then confirm. If there's more
than one HID-compliant touchscreen device listed, perform steps 2–3
for that one too.
https://support.microsoft.com/en-us/help/4028019/windows-enable-and-disable-your-touchscreen-in-windows-10
And the script stopped crashing.
If someone want to post an answer to solve this problem without disabling touchscreen by tweaking the parameters in RDP or in the server we RDP to, i'd accept his answer as it's easier to change the parameter once than to ask people to disable their touchscreen when they rdp to our machine.

Unabled to deploy service fabric application to azure remote cluster from VSTS continuous inrgration

I have configured a CI build for a Service Fabric application, in Visual Studio Team Services, according to this documentation: https://azure.microsoft.com/en-us/documentation/articles/service-fabric-set-up-continuous-integration.
However I've changed the deployment portion specified on the document above. As I want to deploy on my previously created remote azure cluster so I call the
Deploy-FabricApplication.ps1 with the required parameters using power shell. But unfortunately this is not working. I'm getting the below error:
[void](Connect-ServiceFabricCluster #ClusterConnectionParameters)
InvalidOperation: (:) [Connect-ServiceFabricCluster], FabricException
FullyQualifiedErrorId : CreateClusterConnectionErrorId,Microsoft.ServiceFabric.Powershell.ConnectCluster
WARNING: Unable to Verify connection to Service Fabric cluster.
[error]Test-ServiceFabricClusterConnection : Cluster connection instance is null
[error]At C:\Program Files\Microsoft SDKs\Service
[error]Fabric\Tools\PSModule\ServiceFabricSDK\Publish-NewServiceFabricApplication.ps1:119 char:16
void
: ResourceUnavailable: (:) [Test-ServiceFabricClusterConnection], NullReferenceException
FullyQualifiedErrorId : GetClusterConnectionErrorId,Microsoft.ServiceFabric.Powershell.TestClusterConnection
I can deploy successfully using visual studio. Even if I run the Deploy-FabricApplication.ps1 from the build machine using power shell the application gets deployed without any error. But only if I run it using VSTS build step (part of CI), then the error mentioned above occurs.
Please note that as per the suggestion of Charisk on another stackoverflow thread I've modified the Deploy-FabricApplication.ps1 file to put the below line after line 169.
$global:clusterConnection = $clusterConnection
This doesn't help either. Thanks in advance for your kind help.
In your publish profile http://s30.postimg.org/bttleqitd/cloud.jpg you use StoreLocation="CurrentUser" but if you followed https://azure.microsoft.com/en-us/documentation/articles/service-fabric-set-up-continuous-integration and specifically the Import your automation certificate section under Set up your build machine then you probably have imported your certificate to the LocalMachine store location.
Simply change StoreLocation in your publish profile from CurrentUser to LocalMachine and you should be good to go.
dot source notation means call the script with . "xxx.ps1". Refer to this link for details: PowerShell – What is dot sourcing and why use it?

Getting publish files windows azure

The steps I have taken:
1) Get-AzurePublishSettingsFile
I then download the file.
2) Import-AzurePublishSettingsFile
now the problem is here, I have put the first file in the C drive, but it cant seem to find it.
I do the following
Import-AzurePublishSettingsFile C:\-credentials.publishsettings
powershell returns the following error
CategoryInfo : InvalidArgument: (:) [Import-AzurePublishSettingsFile], ParameterBindingException
FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.WindowsAzure.Management.Cmdlets.ImportAzurePublish
SettingsCommand
any idea how to resolve this.
thanks
You are passing the the incorrect publishsettings file location in your command as below and that's why you are getting the exception:
PS> import-AzurePublishSettingsFile C:\-credentials.publishsettings
Nobody knows where you are storing the publishsettings in your machine so what you really need is to download publishsettings file again using Get-AzurePublishSettingsFile PS command and this time remember where you are saving it in your local machine.
Once you know the publishsettings file path pass it correctly with import-AzurePublishSettingsFile PS command and it will work.
PS> import-AzurePublishSettingsFile CORRECT_PATH_TO_PUBLISHSETTINGS_FILE
I have created a sample PS script menu to use Windows Azure so you can take a look here.
From what I understand, there are 2 ways to publish to Azure using VS 2012: the first one is 1) via "publish" and 2) the second one is "publish via azure".
1) If you are selecting "publish" which is just to Azure websites the while it gives up an option to select the downloaded publish settings these settings do not actually import and the only way I get the website deployed is by setting up the profile manually.
2) to use your downloaded publish settings, you must select "publish to azure", which then imports the certificate and allows you proceed to the next steps within the VS 2012 deployment to a cloud service.
It took me a while to understand that publishing via VS 2012 is a completely separate process from using Azure Powershell to manage Azure VMs (or blobs) which also requires you to work with the downloaded publishsettings which I left in my "downloads" folder per below:
PS C:> Import-AzurePublishSettingsFile 'C:\Users[me]\Downloads[Pay-As-You-Go-credentials.publishsettings]'
Note: the single quotes seem to be required.

Receiving error when executing New-SPSite in PowerShell

I have two web applications in SharePoint 2010 that are both empty (and were created the same way through Central Admin). I have a PowerShell script that creates a new site collection and then automates various other tasks after the site collection is created. I can execute my script successfully in the first web application. Then, when executing the same script on the second web application, the following error is rendered:
"The system cannot find the file specified."
After some investigation, I have found that this command was breaking:
New-SPSite -url $newsite -name $newname -template "STS#0"
The specific error is happening because the site template (STS#0) cannot be found. I have also tried creating the site with different templates, but I get the same error. It is acting as if the second web application cannot find any of the site templates.
Thoughts?
Must have been an IIS issue. Rebooted the box and all is well.

Resources