Tuesday, January 25, 2011

List all user profile properties with PowerShell - PowerShell query

The following script spits out all UserProfile properties for users on Sharepoint 2007:

[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server")
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server.UserProfiles")
# Function:          Get-UserProfiles
# Description:       return a UserProfileManager object containing all user profiles
# Parameters:        SSPName          SSPName    
#
Function global:Get-UserProfiles($SSPName)
{
    $ServerContext = [Microsoft.Office.Server.ServerContext]::GetContext($SSPName);
    $UPManager = new-object Microsoft.Office.Server.UserProfiles.UserProfileManager($ServerContext);
    return $UPManager.GetEnumerator();
}

$profiles = Get-UserProfiles("SharedServices");
$profiles | ForEach-Object { $_.GetEnumerator();}

However, what I want to do is be able to return a table, or csv file of all in the profile,

So far I am only able to get specific properties (see answer below). I have tried piping the output to |ft and | select but this just returns blanks.

I feel like I am so close. I don't want to replace the $_.GetEnumerator() call with lots of $_.Item("property") calls and it doesn't feel like I should have to. Any ideas?

  • I've further developed the code so that it now accepts a comma delimited list of properties and writes them to a delimited file.

    # Outputs a delimited file with specified user profile properties for each user in Sharepoint
    
    # Create array of desired properties
    $arProperties = 'UserName','FirstName','LastName','Title','WorkEmail','WorkPhone','Manager','AlternateContact','RoleDescription','PictureURL';
    # Specify output file
    $outfile = 'UserProfiles.csv';
    #Specify delimiter character (i.e. not one that might appear in your user profile data)
    $delim = '^';
    # Specify Shared Service Provider that contains the user profiles.
    $SSP = "SharedServices";
    
    [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server")
    [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server.UserProfiles")
    
    # Function:          Get-UserProfiles
    # Description:       return a UserProfileManager object containing all user profiles
    # Parameters:        SSPName          SSPName    
    #
    Function global:Get-UserProfiles($SSPName)
    {
     $ServerContext = [Microsoft.Office.Server.ServerContext]::GetContext($SSPName);
     $UPManager = new-object Microsoft.Office.Server.UserProfiles.UserProfileManager($ServerContext);
     return $UPManager.GetEnumerator();
    }
    $profiles = Get-UserProfiles($SSP);
    
    #Initialise Output file with headings
    $header = [string]::join($delim,$arProperties);
    Write-Output $header | Out-File $outfile
    
    #Output the specified properties for each
    $profiles | ForEach-Object {
     foreach($p in $arProperties){
      # Get the property name and add it to a new array, which will be used to construct the result string
      $arProfileProps += $_.Item($p);
     }  
     $results = [string]::join($delim,$arProfileProps);
     # Get rid of any newlines that may be in there.
     $CleanResults = $results.Replace("`n",'');
     Write-Output $CleanResults
     Remove-Variable -Name arProfileProps
    } | Out-File -Append $outfile
    

    This gets me a bit closer. I'd still really like a script that iterates through all the profile properties and puts them into a CSV or XML file more gracefully. This will do for now.

    From dunxd

0 comments:

Post a Comment