# encoding: ascii
# api: powershell
# title: SharePoint UserID grab
# description: Use the MOSS (Microsoft Office SharePoint Server) .NET Libraries to find SharePoint ID of known user.
# version: 0.1
# author: Craig Pilkenton
# license: CC0
# x-poshcode-id: 740
# x-archived: 2008-12-21T05:41:19
#
# Overloaded with params so that if no user is passed in, a list of all users for that
# #	specific Site Collection will be returned.
# Can be used for injecting specific users into the CreatedBy & ModifiedBy column when 
# #	migrating data between Lists, sites, or farms.
#
## .\SharePoint_Users_Read.ps1 "http://some.urlname.com/" "User Information List" ""
## .\SharePoint_Users_Read.ps1 "http://some.urlname.com/" "User Information List" "user, someone"

param(
[string] $rqurdstrPath = $(Throw "--SharePoint Core Path required."), #required parameter
[string] $rqurdstrListName = $(Throw "--SharePoint List Name required."), #required parameter
[string] $strTargetUser = "" #non-required user name for ID Return
)

Write-Host "Beginning Processing--`n"


## Global Variables ##
$strUserIDReturn = ""

write-host "rqurdstrPath: $rqurdstrPath "
write-host "rqurdstrListName: $rqurdstrListName "

## Load SharePoint .NET Libraries ##
[void][System.reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
$site = new-object Microsoft.SharePoint.SPSite($rqurdstrPath)
$userlist = $site.RootWeb.Lists[$rqurdstrListName]

write-host "site: $site "
write-host "userlist: $userlist`n"

# Print the ID and Title of each list item  #$userlist.Items | Format-List -property ID, Title
if($strTargetUser -eq "") {
	Write-Host "--Displaying all Portal Users"
	foreach($strItem in $userlist.Items) {
		[string]$strItem.ID + "--"+$strItem.Title
	}
}
else {
	write-host "--Targeting specific user to return ID"	
	$intUserIDReturn = -1
	
	foreach($strItem in $userlist.Items) {
		$intUserID=[int]$strItem.ID
		$strUserName=$strItem.Title
		if($strUserName -eq $strTargetUser) {
			$intUserIDReturn = $intUserID
			break;
		}
	}
	$intUserIDReturn
}

## NOTE: don't forget to dispose your .NET objects! ##
$site.RootWeb.Dispose()
$site.Dispose()



## End Processing ##
Write-Host "`nEnd Processing--`n"
