Error When Using PowerShell to Call SharePoint Web Service

New-WebServiceProxy : The HTML document does not contain Web service discovery information.
At C:\myScript.ps1:91 char:17
+ ...    $Service = New-WebServiceProxy -UseDefaultCredential -uri $webServ
+                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (http://mySharePoint....bin/Search.asmx:Uri) [New-WebServiceProxy], InvalidOperationException
    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.NewWebServiceProxy

First attempt at calling the search.asmx service.

$webServ = ""
$Service = New-WebServiceProxy -UseDefaultCredential -uri $webServ
$Results = $Service.Query($QueryPacket.OuterXml)

After adding ?wsdl to the uri string, it worked.

$webServ = ""
$Service = New-WebServiceProxy -UseDefaultCredential -uri $webServ
$Results = $Service.Query($QueryPacket.OuterXml)

Use UserGroup.asmx to get all the users in a SharePoint site

This is a little tricky. I was looking for a way to list all the users that you see in Site Settings –> People and Groups, but I found more info than I needed. This post will be updated once I can track down the actual site users.

The script uses the Users and Groups web service to pull all the users in the site collection.

In my case, the LoginName is setup like this: domain\username

First try:

$webServ = "http://sharepointed/sites/MySiteCollection/_vti_bin/UserGroup.asmx"
$Service = New-WebServiceProxy -UseDefaultCredential -uri $webServ 
$Users = $Service.GetUserCollectionFromSite().Users 
$UserNames = New-Object System.Collections.Generic.List[System.Object]

$Users.User | ForEach-Object {
	$spUser = $_.LoginName.Split('\')[1]

Found the answer to my question. Using the Lists.asmx service, I was able to query the UserInfo list for all the site users.

$webServ = "http://sharepointed/sites/MySiteCollection/_vti_bin/Lists.asmx"
$Service = New-WebServiceProxy -UseDefaultCredential -uri $webServ 

$UserNames = New-Object System.Collections.Generic.List[System.Object]

$listname = 'UserInfo'
$listItems = $Service.GetListItems($listname, $null, $null, $null, $null, $null, $null)

for ($counter = 0;$counter -lt $;$counter++)
	$UserNames += $[$counter].ows_Name

Using c# to get at the information. Here I output the LoginName (domain\userName).

            #create a Web Reference to http://yoursiteURL/_vti_bin/usergroup.asmx?wsdl
            #in my case, i named the reference wsUsersGroups
            wsUsersGroups.UserGroup _WSUsersGroups = new wsUsersGroups.UserGroup();
            _WSUsersGroups.Url = "http://sharepointSite/sites/SiteCollectionName/_vti_bin/usergroup.asmx";
            _WSUsersGroups.Credentials = System.Net.CredentialCache.DefaultCredentials;
            XmlNode ndUsers = _WSUsersGroups.GetAllUserCollectionFromWeb();

            StringReader rdrGroups = new StringReader(ndUsers.OuterXml);
            DataSet dsGroups = new DataSet();

            StringBuilder sb = new StringBuilder();

            foreach (DataRow item in dsGroups.Tables[1].Rows)

            File.WriteAllText("C:\\Users\\myname\\Desktop\\siteUSers.csv", sb.ToString());

Virtual Box VT-x is not available (VERR_VMX_NO_VMX)

Ran into this error when trying to start my Virtual Box VM: VT-x is not available (VERR_VMX_NO_VMX).

Turns out, enabling Hyper-V on a Windows 10 install messes with Virtual Box (or something). Seeing how there is no real need to run Hyper-V and Virtual Box, I simply disabled Hyper-V (reboot required), and the error went away.

Guess Microsoft and Oracle still can’t get along.

PowerShell to get all users group and objects from Active Directory

Get every object and property:

Get-ADUser -Filter * -Properties *| select * | Export-CSV "C:\PS_Every_Object.csv"

^ Depending on the number of user this could take a few minutes to run. This is also handy to hunt for properties.

This will export userId, email, employee Id, and company name.

Get-ADUser -Filter * -Properties SamAccountName,EmailAddress,EmployeeID,Company | select SamAccountName,EmailAddress,EmployeeID,Company | Export-CSV "C:\Email_Addresses.csv"

SOLVED: Exception calling “StartWorkflow” with “X” argument(s)

Trying to start a SharePoint workflow using PowerShell and I couldn’t get past this error:

Exception calling “StartWorkflow” with “4” argument(s): “Object reference not set to an instance of an object.”
Exception calling “StartWorkflow” with “3” argument(s): “Object reference not set to an instance of an object.”
NO clue if there is a bug in my farm, but the script below works.  Ended up having to re-get the item when running the workflow. $manager.StartWorkflow($list.GetItemById($item.ID),$assoc,$data,$true)

$web = Get-SPWeb ""
$list = $web.Lists["Shared Documents"]

$assoc = $list.WorkFlowAssociations |Where { $_.Name -eq "tacoWF"}
$data = $assoc.AssociationData
$manager = $web.Site.WorkflowManager

$sQuery = New-Object Microsoft.SharePoint.SPQuery 

#Get all items with an ID greater than 5 
$caml = '<Where><Gt><FieldRef Name="ID" /><Value Type="Counter">5</Value></Gt></Where>'
$sQuery.Query = $caml
$fItems = $list.GetItems($sQuery)

Foreach($item in $fItems)

Ran into this again on a SharePoint 2016 farm.
The following commands fixed the problem:
$webapp = Get-SPWebApplication -identity http://

SharePoint OfficialFile.asmx NotFound

When using the SubmitFile method of the OfficialFile.asmx service, I was returned this value: NotFound


Simple fix was to add my account to the Records Center Web Service Submitters group on the site.

Healthy return message from the service:

Good example on how to upload load files to the Drop Off Library using OfficialFile.asmx service.

The post outlines setting up routing rules and submitting files.

More info on the web service can be found here:[MS-OFFICIALFILE].pdf

Value                                                   Meaning
Success                                                    The operation is successful.
MoreInformation                                  The operation is successful but further action is needed.
InvalidRouterConfiguration               The operation failed because the repository was not configured for routing.
InvalidArgument                                   The operation failed because of an invalid argument.
InvalidUser                                             The operation failed because of an invalid user.
NotFound                                                The operation failed because the user was not authorized to submit files.
FileRejected                                            The operation failed because of a rejected file.
UnknownError                                       The operation failed because of an unknown error.

SharePoint 2016 new-spconfigurationdatabase the user does not exist

When installing SharePoint 2016 from PowerShell, make sure you use the machineName\userName when prompted.



New-SPConfigurationDatabase –DatabaseName SharePoint_Config –DatabaseServer machineName\sqlInstance –AdministrationContentDatabaseName SharePoint_Content –Passphrase (ConvertTo-SecureString BigTaco@12345 –AsPlaintext –Force) –FarmCredentials (Get-Credential) -localserverrole SingleServerFarm

A login prompt will appear.

for the username: enter your machine name \ username (WIN-SP16\spUser).

Error I received when I tried to use spUser without the machine name.

new-spconfigurationdatabase the user does not exist

Are SharePoint Designer Workflows Using Custom Features or Solutions (iLoveSharePoint)

Needed to audit a farm to see if a CodePlex solution was being used in SharePoint Designer workflows.  In my case, I needed to see where the iLove SharePoint  solution was being used. The script below is only targeted at one web and is looking for word “ILoveSharePoint” in the XML.


if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null) 
	Add-PSSnapin "Microsoft.SharePoint.PowerShell"


		$resultsarray =@()
		#output file name
		$fileName = "C:\ilsp-" + $(Get-Date -Format "yyyyMMddHHmmss") + ".csv"
		#name of the feature we are looking for
		$wFeatureName = "ILoveSharePoint"

		Function GetFiles($folder)
			foreach($file in $folder.Files)
				if($file.Name.Split('.')[-1] -eq "xoml")
					$web2 = Get-SPWeb $file.Web.Url
					$wFile = $web2.GetFileOrFolderObject($web2.URL +"/"+ $file.URL)

					if ($wFile.Exists -eq "True")
						$wXml = (New-Object System.Text.UTF8Encoding).GetString($wFile.OpenBinary());
						$nsDetail = $wXml.OuterXml.ToLower()
						$wFeatureName = $wFeatureName.ToLower()
						if($nsDetail -Like "*$wFeatureName*")
							$outFolder = $folder -replace "Workflows/",""

							$outObject = new-object PSObject
							$outObject | add-member -membertype NoteProperty -name "URL" -Value $web2.Url
							$outObject | add-member -membertype NoteProperty -name "Workflow" -Value $outFolder
							$outObject | add-member -membertype NoteProperty -name "Created By" -Value $wFile.Author
							$outObject | add-member -membertype NoteProperty -name "Created Date" -Value $wFile.TimeCreated
							$outObject | add-member -membertype NoteProperty -name "Modified By" -Value $wFile.ModifiedBy
							$outObject | add-member -membertype NoteProperty -name "Modified Date" -Value $wFile.TimeLastModified

							$global:resultsarray += $outObject

			# Use recursion to loop through all subfolders.
			foreach ($subFolder in $folder.SubFolders)

		$WebApplications = Get-SPWebApplication

		foreach($webApp in $WebApplications)
			foreach($site in $webApp.Sites)
				if ((Get-SPSite $site.url -ErrorAction SilentlyContinue) -ne $null) 
					foreach($web in $site.AllWebs)
						if ((Get-SPWeb $web.url -ErrorAction SilentlyContinue) -ne $null) 
							$list1 = $web.Lists.TryGetList("Workflows")
							if($list1 -ne $null)

		#output file
		$resultsarray | Export-csv $fileName -notypeinformation


CAML Query to Return Items Less Than or Greater Than Now

Quick example how to query a list or library for items created more than 5 minutes ago. You can use the Get-Date cmdlet to increment all sorts of values.

$nowMinus5Minutes = [Microsoft.SharePoint.Utilities.SPUtility]::CreateISO8601DateTimeFromSystemDateTime((Get-Date).AddMinutes(-5))
$nowPlus5Minutes = [Microsoft.SharePoint.Utilities.SPUtility]::CreateISO8601DateTimeFromSystemDateTime((Get-Date).AddMinutes(5))

#get items created less than 5 minutes ago
		$caml = '<Where><Lt><FieldRef Name="Modified" /><Value Type="DateTime">' + $nowMinus5Minutes + '</Value></Lt></Where>'
		$sQuery.Query = $caml

Classic ASP Update Records in Access Error [Microsoft][ODBC Microsoft Access Driver] Operation must use an updateable query.

I was trying to update an Access database from a classic ASP page and encountered this error:

[Microsoft][ODBC Microsoft Access Driver] Operation must use an updateable query.

The fix is outlined here:

In a modern OS, you need add the local IUSR account to the folder that holds your database.  The account will need read and write access.

Who knew that classic ASP was so much fun to work with?