Oct 21 2008

Retrieve All Documents from SharePoint

I needed a way to quickly retrieve all documents from SharePoint. You can specify which files to retrieve by changing the WHERE clause in the SQL query.  Otherwise, just pass it a path for the output files and set the connection string for your SharePoint content database.

Props to Michael O’Donovan for his helpful article on recovering SharePoint files.

public static void GetDocs(string path)
{
    SqlConnection _conn = new SqlConnection(Settings.Default.conn);
 
    string sql = "SELECT AllDocs.LeafName, AllDocs.DirName, AllDocStreams.[Content] ";
    sql += "FROM AllDocs INNER JOIN AllDocStreams ON AllDocStreams.Id = AllDocs.Id AND AllDocs.[Level] = AllDocStreams.[Level] ";
    sql += "WHERE AllDocs.IsCurrentVersion = 1 AND right(AllDocs.LeafName, 4) in ('.doc','.pdf','.xls','.csv','.ppt','docx','xlsx','pptx','.rtf','.txt','.xps','.mdb','.msg','.wmv','.xsn','.vsd')";
 
    SqlCommand getEmp = new SqlCommand(sql, _conn);
 
    FileStream fs;                          // Writes the BLOB to a file (*.bmp).
    BinaryWriter bw;                        // Streams the BLOB to the FileStream object.
    int bufferSize = 100;                   // Size of the BLOB buffer.
    byte[] outbyte = new byte[bufferSize];  // The BLOB byte[] buffer to be filled by GetBytes.
    long retval;                            // The bytes returned from GetBytes.
    long startIndex = 0;                    // The starting position in the BLOB output.
    string filename = string.Empty;         // The orignial filename.
    string outfile = string.Empty;
    string subpath = string.Empty;
    int i = 0;
 
    // Open the connection and read data into the DataReader.
    _conn.Open();
    SqlDataReader myReader = getEmp.ExecuteReader(CommandBehavior.SequentialAccess);
 
    while (myReader.Read())
    {
        i++;
 
        // Get the filename and build the file path for the output files.
        filename = myReader.GetString(0);
        subpath = myReader.GetString(1).Replace("/", "\\") + "\\";
        outfile = path + subpath + filename;
 
        if (!Directory.Exists(path + subpath))
        {
            Directory.CreateDirectory(path + subpath);
        }
 
        // To prevent overwriting files.
        if (File.Exists(outfile))
        {
            outfile = path + subpath + "_" + i.ToString() + filename;
        }
 
        // Create a file to hold the output.
        fs = new FileStream(outfile, FileMode.Create, FileAccess.Write);
        bw = new BinaryWriter(fs);
 
        // Reset the starting byte for the new BLOB.
        startIndex = 0;
 
        // Read the bytes into outbyte[] and retain the number of bytes returned.
        retval = myReader.GetBytes(2, startIndex, outbyte, 0, bufferSize);
 
        // Output status messages
        string msg = String.Format("{0} ", subpath + filename); 
        Console.Write(Right(msg,48));
 
        while (retval == bufferSize)
        {
            bw.Write(outbyte);
            bw.Flush();
 
            // Reposition the start index to the end of the last buffer and fill the buffer.
            startIndex += bufferSize;
            retval = myReader.GetBytes(2, startIndex, outbyte, 0, bufferSize);
        }
 
        // Write the remaining buffer.
        bw.Write(outbyte, 0, (int)retval);
        bw.Flush();
 
        // Close the output file.
        bw.Close();
        fs.Close();
        Console.Write(" [Complete]");
        Console.WriteLine();
    }
 
    // Close the reader and the connection.
    myReader.Close();
    _conn.Close();
}


Apr 30 2008

Search Commands

Frustrated by the Office ribbon? I just stumbled across this project on Microsoft Office Labs.  Can’t find that button that you know was there in Office XP/2003?  Just type what you’re looking for and you’re presented with the missing button.

Search Commands


Apr 19 2008

Enable Self-Service user in Salesforce.com using C#

I won’t walk through connecting to the Salesforce.com api because that is well documented.  One thing I didn’t find documented was how to enable self-service for a Salesforce contact.  Well here it is.

First 3 methods used by the main EnableSelfService() method:

   1: /// <summary>
   2: /// Retrieves a Contact object for the specified contactId
   3: /// </summary>
   4: /// <param name="contactId">contactId</param>
   5: /// <returns>Contact object (containing contact name, phone and email address</returns>
   6: public Contact GetContact(string contactId)
   7: {
   8:     //Verify that we are already authenticated, if not
   9:     //call the login function to do so
  10:     if (!loggedIn)
  11:     {
  12:         if (!Login())
  13:             return null;
  14:     }
  15:     // Invoke retrieve call and save results in an array of SObjects
  16:     sObject[] records = binding.retrieve("FirstName, LastName, Email, Phone, MySequenom_Enabled_On__c, AccountId, Account.Name, Account.BillingState", "Contact", new String[] { contactId });
  17:     Contact contact = null;
  18:     // Iterate through the results
  19:     if (records!=null && records.Length > 0)
  20:     {
  21:         contact = (Contact)records[0];
  22:     }
  23:     return contact;
  24: }

 

   1: /// <summary>
   2: /// Find existing self-service user by email address
   3: /// </summary>
   4: /// <param name="email">Email address</param>
   5: /// <returns>Self-Service userid</returns>
   6: private string GetExistingSelfServiceUserId(string email)
   7: {
   8:     //Verify that we are already authenticated, if not
   9:     //call the login function to do so
  10:     if (!loggedIn)
  11:     {
  12:         if (!Login())
  13:             return null;
  14:     }
  15:     QueryResult qr = binding.query(string.Format("Select Id from SelfServiceUser where Email = '{0}'", email));
  16:     string ssuId = null;
  17:     if (qr.size != 0)
  18:     {
  19:         ssuId = qr.records[0].Id;
  20:     }
  21:     return ssuId;
  22: } 

 

Reset a self-service user’s password:

   1: /// <summary>
   2: /// Sets the password for the given userid/selfserviceuserid
   3: /// </summary>
   4: /// <param name="id">userId or selfserviceuserId</param>
   5: /// <returns>auto generated password.</returns>
   6: public string ResetPassword(string id)
   7: {
   8:     //Verify that we are already authenticated, if not
   9:     //call the login function to do so
  10:     if (!loggedIn)
  11:     {
  12:         if (!Login())
  13:             return null;
  14:     }
  15:     string newPassword = StringHelper.GetPassword(6, true, false, false);
  16:     // Invoke setPassword call and save results in SetPasswordResult 
  17:     SetPasswordResult spr = binding.setPassword(id, newPassword);
  18:     // returns the generated password 
  19:     return newPassword;
  20: }    

 

And finally enable self-service:

   1: /// <summary>
   2: /// Enables self-service for the specified contactId
   3: /// </summary>
   4: /// <param name="contact">Contact object</param>
   5: /// <returns>password for the newly created Self-Service user.</returns>
   6: public string EnableSelfService(Contact contact)
   7: {
   8:     string email, firstName, lastName, contactId;
   9:     //Verify that we are already authenticated, if not
  10:     //call the login function to do so
  11:     if (!loggedIn)
  12:     {
  13:         if (!Login())
  14:             return null;
  15:     }
  16:     email = contact.Email;
  17:     firstName = contact.FirstName;
  18:     lastName = contact.LastName;
  19:  
  20:     // I needed to make some changes to the contact first. So update the contact...
  21:     contactId = contact.Id;
  22:     contact = new Contact();
  23:     contact.Id = contactId;
  24:     contact.Enable_MySequenom__c = true;
  25:     contact.Enable_MySequenom__cSpecified = true;
  26:     contact.MySequenom_Enabled_On__c = DateTime.Now;
  27:     contact.MySequenom_Enabled_On__cSpecified = true;
  28:  
  29:     // then save the contact.
  30:     try
  31:     {
  32:         SaveResult[] srContact = binding.update(new sObject[] { contact });
  33:     }
  34:     catch (Exception e)
  35:     {
  36:         throw new ApplicationException("Unable to update contact record for contactid: " + contactId + Environment.NewLine + e.ToString());
  37:     }
  38:  
  39:     // open the contact back up.
  40:     contact = GetContact(contactId);
  41:  
  42:     // check to see if a self-service user already exists for this contact.
  43:     string ssuId = GetExistingSelfServiceUserId(contact.Email);
  44:  
  45:     // Self-Service user already exists, just reset password.
  46:     if (ssuId != null){
  47:         return ResetPassword(ssuId);
  48:     }
  49:  
  50:     // Create the new self-service user.
  51:     SelfServiceUser ssu = new SelfServiceUser();
  52:     ssu.ContactId = contactId;
  53:     ssu.Email = email;
  54:     ssu.FirstName = firstName;
  55:     ssu.LastName = lastName;
  56:     ssu.Username = contact.Email;
  57:     ssu.IsActive = true;
  58:     ssu.IsActiveSpecified = true;
  59:     ssu.LanguageLocaleKey = "en_US";
  60:     ssu.LocaleSidKey = "en_US";
  61:     ssu.TimeZoneSidKey = "America/Los_Angeles";
  62:  
  63:     // Invoke the create call, passing in the SelfServiceUser properties
  64:     // and saving the results in a SaveResult object
  65:     SaveResult[] srSsu;
  66:     try
  67:     {
  68:         srSsu = binding.create(new sObject[] { ssu });
  69:     }
  70:     catch (Exception e)
  71:     {
  72:         throw new ApplicationException("Unable to create self-service user for contactid: " + contactId + Environment.NewLine + e.ToString());
  73:     }
  74:  
  75:     // Access the new ID and generate a new password
  76:     ssuId = srSsu[0].id;
  77:     string newPassword = null;
  78:     if (ssuId != null && ssuId != string.Empty)
  79:     {
  80:         newPassword = ResetPassword(ssuId);
  81:     }
  82:     return newPassword;
  83: }


Apr 18 2008

Working with Users and Groups in SharePoint 2007

As I am about to show you, one of the easier things to do in SharePoint (programmatically) is that add a user to a group and add a user or group to a site.

I’ll be using the SharePoint web service to do this, so first we need to setup the web reference.  Add a web reference to your project using the URL: http://[sitename]/_vti_bin/usergroup.asmx (of course you’ll substitute your site name).

Then we need to setup the web service object (I named my web reference AdminService):

   1: static AdminService.UserGroup userService = new AdminService.UserGroup();
   2: userService.Credentials = System.Net.CredentialCache.DefaultCredentials;

NextI have an enum, class and method to make it easy to remember and work with the different permission types.

   1: /// <summary>
   2: /// Enumeration representing the various permission levels in SharePoint
   3: /// </summary>
   4: public enum SharePointPermissionType
   5: {
   6:     /// <summary>
   7:     /// Full Control - Has full control.
   8:     /// </summary>