Welcome to Kraft Kennedy

Kraft & Kennedy, Inc. provides technology and strategic consulting services to law firms, corporate legal departments and financial services firms. We can help you analyze, plan, implement and manage business and technology solutions to optimize your organization's functionality and processes.

Kraft Kennedy | Technology Blog

Archive for 'Development'

The Citrix Web Interface allows you to publish desktop applications as links on a web page.  If only one link is published, such as a “Windows 7 Desktop” link, then users will have to come into the web interface and manually click on the link to launch it.  It’s easy however, to update the code on the home page so that the published desktop automatically launches when the user opens the web interface.  This shortcut saves users a click and some time, and makes the process more streamlined, especially if there is only one published application.


Continue reading…

The Problem – Hidden Outlook Reminders

In Outlook 2003, 2007, and 2010, reminder windows pop up in Outlook, but they do not steal the focus if you are working in another program.  For example, if you currently working in Word or Internet Explorer, you won’t see a reminder window if one pops up, since you’re not in Outlook.

In previous versions of Windows, this wasn’t as big of a deal because you would still see the reminder window in the task bar.  So even though you didn’t see the actual window, you would see the tab for it flashing on the taskbar.

In Windows 7 however, the default grouping of same-application windows, makes is much harder to see when a reminder window pops up. For example, the image below shows a second Outlook window, which is actually a reminder window.


Continue reading…

In SharePoint 2007, menus in some master pages opened behind page content and Flash animations.  However, there was an easy fix which was to just locate the css style for the dynamic menus, and change the “z-index” property to a high number.  This same fix does not work in 2010 however, and to make matters worse, the menus on the default master page in 2010 always open behind Flash videos.  (The built-in Silverlight web part in 2010 does not have this problem, but I suspect there are still many people who will have home pages with Flash content.)
Continue reading…

A common situation in organizations is to make calendars public, so that employees can see other employee’s availability, and collaborate better.  Users may also delegate rights to other users to view their messages, tasks, and contacts.  In these situations, people may rely on marking sensitive items private to hide them from other users.  In Outlook or OWA, other users will see a placeholder for the private items, but won’t be able to view any of the details.  However, you should keep in mind that this privacy is only a feature of the client application–Outlook or OWA–and is not inherent to Exchange.  Exchange itself does not support any kind of item-level security or privacy, and only has a field called “sensitivity” which is used by Outlook and OWA.  The client applications look at that field to determine whether to display the item.
Continue reading…

Most of the information in an employee’s MySite profile comes from the Active Directory profile import, which is set up in the SharePoint Shared Service Provider.  However, this can be tricky with employee photos since links to photos are not normally stored in Active Directory.  An easy way around this if you don’t want to store the links in Active Directory, is to simply create a picture library in SharePoint and upload all of the employee photos to the picture library with a standard name, such as username.jpg.  Then you can write a script to update each MySite profile and associate the photo with the person.
Continue reading…

Windows SharePoint Services (WSS) doesn’t come with a whole lot of web parts out of the box, but here’s a few handy ones we’ve found to spice up some of the home pages we’ve built.  These are all free and work with WSS.

Only MOSS comes with an RSS reader, and even that one can display only one feed.  This web part is invaluable if you’re using WSS.  This is the best free RSS feed web part that I’ve found, and it allows you to neatly pull multiple feeds next to each other.

This web part neatly displays the weather in 3 cities side-by-side and can optionally display the time if they are in different time zones.  This is a nice looking web part and tends to fit nicely on the right-hand side of a home page for a firm with multiple offices.

This web part displays stock quotes, company names, changes, and percent changes pulled from MSN Money.  It’s the best free web part I’ve seen to do this, and will save a lot of time over trying to follow one of the examples online for doing this with a data view.

This uses the twitter search API to search twitter based on the parameters you specify in the web part, and you can download the wsp or the source code from the web page.

  • Kraft & Kennedy Google Search Box
    (Code below)

We’ve had a few instances where we were asked to put a Google search box on a SharePoint page.  This can easily be accomplished by just inserting a content editor web part on the page and editing the HTML directly.  You can paste in the following code, which includes JavaScript, to open a Google results page after the person enters a search term and presses enter or clicks a button.  This is of course a simple approach–you could also federate search results in your search center to include Google–but this simple html code works well in many cases.

Search Google

<P align=left>Search Google: <INPUT id=Google name=Google onkeydown="javascript:if (event.which || event.keyCode){if ((event.which == 13) || (event.keyCode == 13)) {
window.open('http://www.google.com/search?hl=en&amp;q=' + this.value + '&amp;btnG=Google+Search','_blank','');
return false;}};"> <IMG alt="Go" id="btnGo" name="btnGo" src="/images1/icongo.gif" onclick="window.open('http://www.google.com/search?hl=en&amp;q=' + document.all.Google.value + '&amp;btnG=Google+Search','_blank','')"  onmouseover="this.style.cursor='hand'">
</P>

Research in Motion (RIM) offers two ways of writing applications for BlackBerry devices–Native Java, and the Microsoft Visual Studio plugin.  As a VB.Net developer, I was tempted to go the Visual Studio plugin approach, but I decided against it for the following reasons:

  • It’s geared more towards rapid forms-based applications that communicate by web services.
  • It requires the user to be on a BlackBerry Enterprise Server.
  • It does not provide access to all of the APIs and BlackBerry features that you get with Java; for example, camera, phone, Bluetooth, address book, GPS, BlackBerry Maps, and BlackBerry Message features.
  • It doesn’t support the BlackBerry Storm touch screen and accelerometer.
  • Debugging and deployment is more difficult, and the Visual Studio plugin only comes with a BlackBerry Bold simulator.  The Java tools come with a BlackBerry Storm simulator.

For these reasons, to be able to debug for the Storm, and to have access to the entire BlackBerry library, I decided to go with the Java approach.  The transition is quite easy, once you get the development environment in place and write your first test application.  The BlackBerry website has a lot of good information for developers, if you’re able to find it.

I found that this page has everything you need to get started developing BlackBerry applications:

http://na.blackberry.com/eng/developers/resources/tutorials.jsp#tab_tab_development

Rather than copy and paste information from their guides, I’ll just point out some of the things I wish were clearer in each document.


Continue reading…

WSS does not have a user profile service and does not allow any kind of native targeting of content to users in different groups. This is one of the more serious limitations of WSS, especially for corporate intranets, where pages might need to be customized for users in different offices. MOSS, on the other hand, allows for the creation of audiences and easy targeting of content. As is typically the case with WSS, it is possible to achieve this functionality by writing code.

One way to do this is by adding a reference in your code to “System.DirectoryServices,” which allows you to query Active Directory. With that class, you can compare the current user to an Active Directory group’s membership collection, and add logic based on whether or not the user is in the group. If you plan to edit an aspx page directly, you will also have to add a page parser path in web.config, so that the code in the page will run. Rather than editing the page directly, it is often preferable to create a control or web part for security and manageability reasons.

If editing an aspg page directly in SharePoint Designer, just add the following line to the top of the page, so that the correct assembly is referenced.

<%@ Assembly Name="System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" %>

Then add a code block into the page that gets the current user and compares it to the group membership. The following example uses VB.Net and sees if the current user is in the “NY Staff” group. If so, then the script redirects to the page “NY.aspx.” Rather than redirecting, you could also add code to write out customized content based on the membership information.

               <%

    Try
   'Get group membership for current user
        Dim DomainUser As String = Replace(User.Identity.Name, "\", "/")
        Dim ADEntry As New System.DirectoryServices.DirectoryEntry("WinNT://" & DomainUser)
        Dim MembersCollection As Object 'Underlaying is a IADsMembers interface
        MembersCollection = ADEntry.Invoke("Groups")
        Dim group As Object 'IADsGroup interface
        Dim vFound As Boolean = False
        For Each group In MembersCollection
            If LCase(group.Name) = "ny staff" Then
                vFound = True
                Exit For
            End If
        Next
        'Do something if group is found
        If vFound Then
            Response.redirect("NY.aspx")
        End If
      Catch ex As Exception
        'response.write(ex.message)
      End Try
%>