<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FuGeRTech &#187; LinkedIn</title>
	<atom:link href="http://fugertech.com/tag/linkedin/feed/" rel="self" type="application/rss+xml" />
	<link>http://fugertech.com</link>
	<description>Enduring, Sustainable Results</description>
	<lastBuildDate>Mon, 30 Aug 2010 16:49:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>SharePoint Log Files</title>
		<link>http://fugertech.com/2009/01/26/sharepoint-log-files/</link>
		<comments>http://fugertech.com/2009/01/26/sharepoint-log-files/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 15:30:01 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Administration]]></category>
		<category><![CDATA[Diagnostic Logging]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Microsoft SQL Server 2005]]></category>
		<category><![CDATA[Operations]]></category>
		<category><![CDATA[Trace Log]]></category>
		<category><![CDATA[WSS 3.0]]></category>

		<guid isPermaLink="false">http://www.fugertech.com/?p=86</guid>
		<description><![CDATA[I am willing to bet that not too many people run into this issue, but it is still good to know. On, my client&#8217;s web server began to stall due to a full C: drive. Their server is an economy model and the C: drive is only 16GB. After some quick investigation, I found that <a href='http://fugertech.com/2009/01/26/sharepoint-log-files/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>I am willing to bet that not too many people run into this issue, but it is still good to know. On, my client&#8217;s web server began to stall due to a full C: drive. Their server is an economy model and the C: drive is only 16GB. After some quick investigation, I found that 3.5GB were being used in the C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12LOGS folder. This is the default location for the trace log. The path must exist on all servers in the farm, too. I decided to turn down the logging, at least temporarily, to get the server running again. To complete this task, I took the following steps:</p>
<ol>
<li>Navigate to SharePoint Central Administration</li>
<li>Click Operations</li>
<li>Click Diagnostic Logging</li>
<li>Scroll to the bottom of the page to the Trace Log section</li>
<li>Change Number of log files to <strong><span style="text-decoration: underline;">1</span></strong></li>
<li>Change Number of minutes to use a log file to <strong><span style="text-decoration: underline;">5</span></strong></li>
</ol>
<p>My client&#8217;s server is back up and running again, and I should not have to worry about the Trace Log getting out of control again.</p>
<p>The downside is that my Trace Log only goes back to the last 5 minutes of work on the server. I am researching my options here. It may not be important enough though.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://fugertech.com/2009/01/26/sharepoint-log-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Server 2005 and NTFS Compressed Folders</title>
		<link>http://fugertech.com/2009/01/08/sql-server-2005-and-ntfs-compressed-folders/</link>
		<comments>http://fugertech.com/2009/01/08/sql-server-2005-and-ntfs-compressed-folders/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 06:37:00 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
				<category><![CDATA[Database Administration]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[compressed folders]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[Microsoft SQL Server 2005]]></category>
		<category><![CDATA[NTFS]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.fugertech.com/?p=78</guid>
		<description><![CDATA[Summary: SQL Server 2005 does not support compressed folders. Don&#8217;t use them for database storage or backups. I had a backup process running at work that would back up my server&#8217;s databases into a compressed folder. Everything was fine until my SharePoint database and another database grew larger than 32GB. My backups began to fail <a href='http://fugertech.com/2009/01/08/sql-server-2005-and-ntfs-compressed-folders/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Summary: SQL Server 2005 does not support compressed folders. Don&#8217;t use them for database storage or backups.</p>
<p>I had a backup process running at work that would back up my server&#8217;s databases into a compressed folder. Everything was fine until my SharePoint database and another database grew larger than 32GB. My backups began to fail with an error that read:</p>
<pre class="sql" style="padding-left: 30px;">The process cannot access the file
because another process has locked
a portion of the file.</pre>
<p>I was stumped! I contacted a colleague that is a SQL Server expert, and she suggested using <a href="http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx" target="_blank">FileMon</a> to watch for intruding processes. It may be the anti-virus software requesting the file in the middle of backing up. At that time, I ran my backups manually singling out the two that were failing to backup. I noticed that they would consistently fail at the 32GB mark. That drew my suspicion, and I did some googling to find that Microsoft SQL Server 2005 does NOT support compressed folders!</p>
<p>So, I moved my backups to a regular folder and all is well again. Even my expert colleague did not know of this problem. Luckily, I have read that SQL Server 2008 will support compressed folders.</p>
<p>I hope this information gets grabbed by the web crawlers as finding this information was NOT as easy as it should be.</p>
<p>Here&#8217;s another blogger that found this problem a year earlier than me!<a href="http://clay.lenharts.net/blog/2008/01/28/backing-up-to-a-ntfs-compressed-folder/" target="_blank"></p>
<p>http://clay.lenharts.net/blog/2008/01/28/backing-up-to-a-ntfs-compressed-folder/</a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://fugertech.com/2009/01/08/sql-server-2005-and-ntfs-compressed-folders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SharePoint: Recurring Events on Calendars</title>
		<link>http://fugertech.com/2008/11/21/sharepoint-recurring-events-on-calendars/</link>
		<comments>http://fugertech.com/2008/11/21/sharepoint-recurring-events-on-calendars/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 18:48:57 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[recurring]]></category>
		<category><![CDATA[WSS 3.0]]></category>

		<guid isPermaLink="false">http://www.fugertech.com/?p=60</guid>
		<description><![CDATA[While I am in the blogging mood today, I thought I would share a very helpful link. I was trying to figure out the proper way to retrieve the latest recurring events based on the current month. I Googled around for a bit before stumbling upon this: http://blogs.msdn.com/sharepoint/archive/2007/05/14/understanding-the-sharepoint-calendar-and-how-to-export-it-to-ical-format.aspx The key point is the query used: <a href='http://fugertech.com/2008/11/21/sharepoint-recurring-events-on-calendars/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>While I am in the blogging mood today, I thought I would share a very helpful link. I was trying to figure out the proper way to retrieve the latest recurring events based on the current month. I Googled around for a bit before stumbling upon this:</p>
<p><a href="http://blogs.msdn.com/sharepoint/archive/2007/05/14/understanding-the-sharepoint-calendar-and-how-to-export-it-to-ical-format.aspx">http://blogs.msdn.com/sharepoint/archive/2007/05/14/understanding-the-sharepoint-calendar-and-how-to-export-it-to-ical-format.aspx</a></p>
<p>The key point is the query used:</p>
<p><code>SPQuery query = new SPQuery();<br />
query.ExpandRecurrence = true;<br />
query.Query =<br />
    "&lt;Where&gt;" +<br />
        "&lt;DateRangesOverlap&gt;" +<br />
            "&lt;FieldRef Name='EventDate' /&gt;" +<br />
            "&lt;FieldRef Name='EndDate' /&gt;" +<br />
            "&lt;FieldRef Name='RecurrenceID' /&gt;" +<br />
            "&lt;Value Type='DateTime'&gt;&lt;Month /&gt;&lt;/Value&gt;" +<br />
        "&lt;/DateRangesOverlap&gt;" +<br />
    "&lt;/Where&gt;";<br />
// Look forward from the beginning of the current month<br />
query.CalendarDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); </code></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://fugertech.com/2008/11/21/sharepoint-recurring-events-on-calendars/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SharePoint: User Auditing</title>
		<link>http://fugertech.com/2008/11/21/sharepoint-user-auditing/</link>
		<comments>http://fugertech.com/2008/11/21/sharepoint-user-auditing/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 17:26:35 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[audit]]></category>
		<category><![CDATA[designer]]></category>
		<category><![CDATA[groups]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[membership]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[object model]]></category>
		<category><![CDATA[permissions]]></category>
		<category><![CDATA[users]]></category>
		<category><![CDATA[WSS 3.0]]></category>

		<guid isPermaLink="false">http://www.fugertech.com/?p=59</guid>
		<description><![CDATA[At my current place of employment, my development environment is limited to creating custom SharePoint tools through SharePoint Designer. I typically create an override to the OnLoad method to get my work done. Today&#8217;s topic: a simple interface for checking out who has group memberships and where they have them. I came up with the <a href='http://fugertech.com/2008/11/21/sharepoint-user-auditing/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>At my current place of employment, my development environment is limited to creating custom SharePoint tools through SharePoint Designer. I typically create an override to the OnLoad method to get my work done.</p>
<p>Today&#8217;s topic: a simple interface for checking out who has group memberships and where they have them. I came up with the idea after seeing the constant organizational changes and the employee role changes associated with them. So let&#8217;s talk about the two parts. If you just want the code without the breakdown, scroll to the bottom of the full article.</p>
<p><span id="more-59"></span></p>
<h2>User Lookup</h2>
<p>There are three methods to this (in addition to a base of methods that I find helpful with my custom pages). First let&#8217;s take a look at my basic header.</p>
<p><code>&lt;%@ Page language="C#"<br />
MasterPageFile="~masterurl/default.master"<br />
SmartNavigation="true"<br />
Inherits="Microsoft.SharePoint.WebPartPages.WebPartPage,<br />
Microsoft.SharePoint,<br />
Version=12.0.0.0,<br />
Culture=neutral,<br />
PublicKeyToken=71e9bce111e9429c"<br />
meta:progid="SharePoint.WebPartPage.Document" %&gt;<br />
&lt;%@ Import Namespace="Microsoft.SharePoint" %&gt;<br />
</code></p>
<p>It really is this simple. You only need the Microsoft.SharePoint library! Now I begin my &lt;script&gt; section that contains the OnLoad override and other methods needed.</p>
<p><code> protected SPSite site;<br />
protected SPWeb web;</code></p>
<p><code> protected override void OnLoad(EventArgs e)<br />
{<br />
try<br />
{<br />
site = new SPSite("http://server/");<br />
web = site.OpenWeb("webdev");<br />
SPGroup grpMembers = web.SiteGroups["Website Development Members"];<br />
if(grpMembers.ContainsCurrentUser)<br />
{<br />
mvViewManager.ActiveViewIndex = 1;<br />
runPage();<br />
}<br />
}<br />
catch (Exception err)<br />
{<br />
litError.Visible = true;<br />
litError.Text = err.Message;<br />
}<br />
}</code></p>
<p>The first thing I do is just a simple check to make sure that the user is in a group that is allowed to perform these tasks. I also wrap the entire thing in a try/catch just to make my life easier for error catching and display it in a Literal that is in the content of the page (you&#8217;ll see later). I have been playing around with ViewManagers lately, and that controls what content is displayed on the page. The content of the page is as follows.</p>
<p><code>&lt;asp:Content ContentPlaceHolderID="PlaceHolderPageTitle" runat="server"&gt;<br />
Web Development Admin Tools - User Audit<br />
&lt;/asp:Content&gt;<br />
&lt;asp:Content ContentPlaceHolderID="PlaceHolderMain" runat="server"&gt;<br />
&lt;asp:MultiView ID="mvViewManager" runat="server" ActiveViewIndex="0"&gt;<br />
&lt;asp:View ID="vNoPerms" runat="server"&gt;<br />
&lt;h3&gt;You do not have permissions to view this page!&lt;/h3&gt;<br />
&lt;/asp:View&gt;<br />
&lt;asp:View ID="vMain" runat="server"&gt;<br />
&lt;asp:DropDownList ID="ddlUsers" runat="server" AutoPostBack="true" OnSelectedIndexChanged="findUser"/&gt;<br />
&lt;br/&gt;<br />
&lt;br/&gt;<br />
&lt;asp:Literal ID="litOutput" runat="server"/&gt;<br />
&lt;/asp:View&gt;<br />
&lt;/asp:MultiView&gt;<br />
&lt;asp:Literal ID="litError" runat="server" Visible="false"/&gt;<br />
&lt;/asp:Content&gt;</code></p>
<p>The litOutput and litError Literals are used for displaying information. The ddlUsers DropDownList is used for displaying a list of all users. As mentioned before, there are two views inside the ViewManager mvViewManager. The first view (index 0) is the default view. If the group evaluation from OnLoad passes, the second view (index 1) is displayed. The rest of this section is pretty self explanatory. Onto the methods that manipulate the DropDownList and output Literal.</p>
<p><code> protected void runPage()<br />
{<br />
if(Request.HttpMethod != "POST")<br />
{<br />
populateUsers();<br />
}<br />
}</code></p>
<p>protected void populateUsers()<br />
{<br />
foreach(SPUser user in site.RootWeb.AllUsers)<br />
{<br />
ListItem li = new ListItem();<br />
li.Text = user.Name;<br />
li.Value = user.ID.ToString();<br />
ddlUsers.Items.Add(li);<br />
}<br />
}</p>
<p>protected void findUser(Object sender, EventArgs e)<br />
{<br />
SPUser user = site.RootWeb.AllUsers.GetByID(Convert.ToInt32(ddlUsers.SelectedItem.Value));<br />
litOutput.Text = &#8220;&#8221;" + user.Name + &#8220;&#8221; belongs to the following groups:&lt;br/&gt;&lt;br/&gt;&#8221;;<br />
litOutput.Text += userMembership(user, site.RootWeb, &#8220;&#8221;);<br />
}</p>
<p>protected string userMembership(SPUser user, SPWeb web, string webPath)<br />
{<br />
StringBuilder retVal = new StringBuilder();<br />
//retVal.AppendFormat(&#8220;{0}&lt;br/&gt;&#8221;, web.Name == &#8220;&#8221; ? &#8220;Root&#8221; : web.Name);<br />
webPath += (webPath == &#8220;&#8221; ? &#8220;&#8221; : &#8220;/&#8221;) + web.Name;<br />
foreach(SPGroup group in web.Groups)<br />
{<br />
try<br />
{<br />
group.Users.GetByID(user.ID);<br />
retVal.AppendFormat(&#8220;&lt;b&gt;{0}&lt;/b&gt; &#8211; &lt;a href=&#8221;removeUserFromGroup.aspx?uid={1}&amp;gid={2}&amp;web={3}&#8221;&gt;REMOVE&lt;/a&gt;&lt;br/&gt;&#8221;,<br />
group.Name,<br />
user.ID,<br />
group.ID,<br />
webPath);<br />
}<br />
catch { }<br />
}<br />
foreach(SPWeb subweb in web.Webs)<br />
{<br />
retVal.AppendFormat(&#8220;{0}&#8221;, userMembership(user, subweb, webPath));<br />
}<br />
return retVal.ToString();<br />
}<br />
&lt;/script&gt;</p>
<p>The methods we have here are: runPage(), populateUsers(), findUser(Object sender, EventArgs e), and userMembership(SPUser user, SPWeb web, string webPath). I try to keep my methods in the order in which they are called. This makes my life easier when debugging, etc. The first method called is runPage(). It is just a simple starter that does a check to make sure that the page was not a POST. If it was a POST, then someone must have accessed the page incorrectly or someone chose a user from the DropDownList. This avoids duplicate population of the user DropDownList, and improper access of the page. That takes us to populateUsers(). This method uses SPWeb.AllUsers to find all the users in the system and add them to the DropDownList. It makes their name the Text property and their userID the Value property. Notice the DropDownList gets the AutoPostBack property set to True and the OnSelectedIndexChanged property set to the findUser() method. This writes some header information to the output Literal, then kicks off a call to the recursive method userMembership. Using the SPUser object of the user chosen, SPWeb object of the current web in which we&#8217;re looking, and a string of the path to the web in which we&#8217;re looking, userMembership will traverse all webs and sub-webs in the site collection looking for memberships to groups in those webs. It will return a string that provides the group name and a link to remove that person from the group.</p>
<h2>Removing Users from a Group</h2>
<p>This page is fairly simple. It takes three GET parameters to determine which SPWeb to use, the SPUser.ID, and SPGroup.ID. The same permissions logic is used to determine if the person should be viewing this page. Then, it also makes sure that the Request.HttpMethod is set to GET. The runPage() method then takes these parameters and removes the user from that group. The code is below the userAudit.aspx code provided.</p>
<h2>userAudit.aspx</h2>
<p><code>&lt;%@ Page language="C#"<br />
MasterPageFile="~masterurl/default.master"<br />
SmartNavigation="true"<br />
Inherits="Microsoft.SharePoint.WebPartPages.WebPartPage,<br />
Microsoft.SharePoint,<br />
Version=12.0.0.0,<br />
Culture=neutral,<br />
PublicKeyToken=71e9bce111e9429c"<br />
meta:progid="SharePoint.WebPartPage.Document" %&gt;<br />
&lt;%@ Import Namespace="Microsoft.SharePoint" %&gt;<br />
&lt;script type="text/c#" runat="server"&gt;<br />
protected SPSite site;<br />
protected SPWeb web;<br />
protected override void OnLoad(EventArgs e)<br />
{<br />
try<br />
{<br />
site = new SPSite("http://server/");<br />
web = site.OpenWeb("webdev");<br />
SPGroup grpMembers = web.SiteGroups["Website Development Members"];<br />
if(grpMembers.ContainsCurrentUser)<br />
{<br />
mvViewManager.ActiveViewIndex = 1;<br />
runPage();<br />
}<br />
}<br />
catch (Exception err)<br />
{<br />
litError.Visible = true;<br />
litError.Text = err.Message;<br />
}<br />
}</code></p>
<p>protected void runPage()<br />
{<br />
if(Request.HttpMethod != &#8220;POST&#8221;)<br />
{<br />
populateUsers();<br />
}<br />
}</p>
<p>protected void populateUsers()<br />
{<br />
foreach(SPUser user in site.RootWeb.AllUsers)<br />
{<br />
ListItem li = new ListItem();<br />
li.Text = user.Name;<br />
li.Value = user.ID.ToString();<br />
ddlUsers.Items.Add(li);<br />
}<br />
}</p>
<p>protected void findUser(Object sender, EventArgs e)<br />
{<br />
SPUser user = site.RootWeb.AllUsers.GetByID(Convert.ToInt32(ddlUsers.SelectedItem.Value));<br />
litOutput.Text = &#8220;&#8221;" + user.Name + &#8220;&#8221; belongs to the following groups:&lt;br/&gt;&lt;br/&gt;&#8221;;<br />
litOutput.Text += userMembership(user, site.RootWeb, &#8220;&#8221;);<br />
}</p>
<p>protected string userMembership(SPUser user, SPWeb web, string webPath)<br />
{<br />
StringBuilder retVal = new StringBuilder();<br />
//retVal.AppendFormat(&#8220;{0}&lt;br/&gt;&#8221;, web.Name == &#8220;&#8221; ? &#8220;Root&#8221; : web.Name);<br />
webPath += (webPath == &#8220;&#8221; ? &#8220;&#8221; : &#8220;/&#8221;) + web.Name;<br />
foreach(SPGroup group in web.Groups)<br />
{<br />
try<br />
{<br />
group.Users.GetByID(user.ID);<br />
retVal.AppendFormat(&#8220;&lt;b&gt;{0}&lt;/b&gt; &#8211; &lt;a href=&#8221;removeUserFromGroup.aspx?uid={1}&amp;gid={2}&amp;web={3}&#8221;&gt;REMOVE&lt;/a&gt;&lt;br/&gt;&#8221;,<br />
group.Name,<br />
user.ID,<br />
group.ID,<br />
webPath);<br />
}<br />
catch { }<br />
}<br />
foreach(SPWeb subweb in web.Webs)<br />
{<br />
retVal.AppendFormat(&#8220;{0}&#8221;, userMembership(user, subweb, webPath));<br />
}<br />
return retVal.ToString();<br />
}<br />
&lt;/script&gt;<br />
&lt;asp:Content ContentPlaceHolderID=&#8221;PlaceHolderPageTitle&#8221; runat=&#8221;server&#8221;&gt;<br />
Web Development Admin Tools &#8211; User Audit<br />
&lt;/asp:Content&gt;<br />
&lt;asp:Content ContentPlaceHolderID=&#8221;PlaceHolderMain&#8221; runat=&#8221;server&#8221;&gt;<br />
&lt;asp:MultiView ID=&#8221;mvViewManager&#8221; runat=&#8221;server&#8221; ActiveViewIndex=&#8221;0&#8243;&gt;<br />
&lt;asp:View ID=&#8221;vNoPerms&#8221; runat=&#8221;server&#8221;&gt;<br />
&lt;h3&gt;You do not have permissions to view this page!&lt;/h3&gt;<br />
&lt;/asp:View&gt;<br />
&lt;asp:View ID=&#8221;vMain&#8221; runat=&#8221;server&#8221;&gt;<br />
&lt;asp:DropDownList ID=&#8221;ddlUsers&#8221; runat=&#8221;server&#8221; AutoPostBack=&#8221;true&#8221; OnSelectedIndexChanged=&#8221;findUser&#8221;/&gt;<br />
&lt;br/&gt;<br />
&lt;br/&gt;<br />
&lt;asp:Literal ID=&#8221;litOutput&#8221; runat=&#8221;server&#8221;/&gt;<br />
&lt;/asp:View&gt;<br />
&lt;/asp:MultiView&gt;<br />
&lt;asp:Literal ID=&#8221;litError&#8221; runat=&#8221;server&#8221; Visible=&#8221;false&#8221;/&gt;<br />
&lt;/asp:Content&gt;</p>
<h2>removeUserFromGroup.aspx</h2>
<p><code>&lt;%@ Page language="C#"<br />
MasterPageFile="~masterurl/default.master"<br />
SmartNavigation="true"<br />
Inherits="Microsoft.SharePoint.WebPartPages.WebPartPage,<br />
Microsoft.SharePoint,<br />
Version=12.0.0.0,<br />
Culture=neutral,<br />
PublicKeyToken=71e9bce111e9429c"<br />
meta:progid="SharePoint.WebPartPage.Document" %&gt;<br />
&lt;%@ Import Namespace="Microsoft.SharePoint" %&gt;<br />
&lt;script type="text/c#" runat="server"&gt;<br />
protected SPSite site;<br />
protected SPWeb web;<br />
protected override void OnLoad(EventArgs e)<br />
{<br />
try<br />
{<br />
site = new SPSite("http://server/");<br />
web = site.OpenWeb("webdev");<br />
SPGroup grpMembers = web.SiteGroups["Website Development Members"];<br />
if(grpMembers.ContainsCurrentUser &amp;&amp; Request.HttpMethod == "GET")<br />
{<br />
mvViewManager.ActiveViewIndex = 1;<br />
runPage();<br />
}<br />
}<br />
catch (Exception err)<br />
{<br />
litError.Visible = true;<br />
litError.Text = err.Message;<br />
}<br />
}<br />
protected void runPage()<br />
{<br />
int uid = Convert.ToInt32(Request.QueryString["uid"]);<br />
int gid = Convert.ToInt32(Request.QueryString["gid"]);<br />
litOutput.Text += uid + " " + gid;<br />
SPWeb thisWeb = site.OpenWeb(Request.QueryString["web"]);<br />
SPGroup group = thisWeb.Groups.GetByID(gid);<br />
SPUser user = site.RootWeb.AllUsers.GetByID(uid);<br />
thisWeb.AllowUnsafeUpdates = true;<br />
thisWeb.Update();<br />
group.Users.RemoveByID(uid);<br />
thisWeb.AllowUnsafeUpdates = false;<br />
thisWeb.Update();<br />
litOutput.Text = """ + user.Name + "" REMOVED FROM: " + group.Name;<br />
}<br />
&lt;/script&gt;<br />
&lt;asp:Content ContentPlaceHolderID="PlaceHolderPageTitle" runat="server"&gt;<br />
Web Development Admin Tools - Remove User From Group<br />
&lt;/asp:Content&gt;<br />
&lt;asp:Content ContentPlaceHolderID="PlaceHolderMain" runat="server"&gt;<br />
&lt;asp:MultiView ID="mvViewManager" runat="server" ActiveViewIndex="0"&gt;<br />
&lt;asp:View ID="vNoPerms" runat="server"&gt;<br />
&lt;h3&gt;You do not have permissions to view this page!&lt;/h3&gt;<br />
&lt;/asp:View&gt;<br />
&lt;asp:View ID="vMain" runat="server"&gt;<br />
&lt;asp:Literal ID="litOutput" runat="server"/&gt;<br />
&lt;/asp:View&gt;<br />
&lt;/asp:MultiView&gt;<br />
&lt;asp:Literal ID="litError" runat="server" Visible="false"/&gt;<br />
&lt;/asp:Content&gt;</code></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://fugertech.com/2008/11/21/sharepoint-user-auditing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dr. TransLog: Or How I Learned to Stop Worrying and Love SQL Server</title>
		<link>http://fugertech.com/2008/09/24/dr-translog-or-how-i-learned-to-stop-worrying-and-love-sql-server/</link>
		<comments>http://fugertech.com/2008/09/24/dr-translog-or-how-i-learned-to-stop-worrying-and-love-sql-server/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 16:15:20 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
				<category><![CDATA[Database Administration]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[DBA]]></category>
		<category><![CDATA[LDF]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[MDF]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Microsoft SQL Server 2005]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Transaction Log]]></category>
		<category><![CDATA[WSS 3.0]]></category>

		<guid isPermaLink="false">http://www.fugertech.com/?p=50</guid>
		<description><![CDATA[Preface My current day job is developing SharePoint-based web applications. On Thursday, September 11 (coincidence), the SharePoint site became unresponsive. It was not storing any new data, but viewing existing data was still possible. This was important as I have end-users that rely on reports stored in Document Libraries. The daily reports would not save <a href='http://fugertech.com/2008/09/24/dr-translog-or-how-i-learned-to-stop-worrying-and-love-sql-server/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<h2>Preface</h2>
<p>My current day job is developing SharePoint-based web applications. On Thursday, September 11 (coincidence), the SharePoint site became unresponsive. It was not storing any new data, but viewing existing data was still possible. This was important as I have end-users that rely on reports stored in Document Libraries. The daily reports would not save onto the website.</p>
<p>I&#8217;m sure that this article is SQL Server Administration 101 for most folks. For those diving into SharePoint with no DBA, this could be a lifesaver.</p>
<h2>Table of Contents</h2>
<p>Chapter 1: Transaction Log Deletion &#8211; what happens when I lost the WSS_Content transaction log<br />
Chapter 2: The Recovery &#8211; the steps to recovering the corrupt MDF file<br />
Chapter 3: Prevention &#8211; best practices for database and transaction log backup and truncation</p>
<p><span id="more-50"></span></p>
<h2>Chapter 1: Transaction Log Deletion</h2>
<p>After crawling around the servers a bit, I found out it was a disk space issue. Ends up that the Data drive for the SQL server that stores my SharePoint databases was full. I noticed a 136GB transaction log (LDF) file. I have not had formal SQL server training and the bulk of my experience is in the Linux world, so I was unsure of my next steps. Googling around I found people with similar issues and learned about sp_detach_db. I began to scramble as 8am was near and people would be coming into work. The detach was not working quickly enough. I shut down my SQL server processes and deleted the LDF file to start over on the transaction log. Little did I know that I just entered myself into a world of pain.</p>
<p>When the SQL server was brought back online, to my surprise, the WSS_Content database was toast. It would not allow access to it, and said that the database was corrupt. It was not shutdown cleanly&#8230; awesome news&#8230; lesson learned&#8230;</p>
<p>So, my first reaction is to call IT and ask for a restore of that file. More awesome news: &#8220;yea, the backups have been saying they were successful, but that file hasn&#8217;t been backed up&#8230;&#8221; Now I am worrying! I read further on Google results. I see forum replies saying things like, &#8220;well chances are if you lost your LDF file and the MDF won&#8217;t attach, the data is corrupt and you cannot get it back.&#8221;</p>
<p>I spend most of the day trying to find the right solution. Many of the answers on Google got me close, but did not work in the end. I find a piece of software called Stellar Phoenix SQL Database Recovery for $420. I think, well, I&#8217;ll try it and if it doesn&#8217;t work, I&#8217;ll get a refund. First problem I run into is the purchasing of the software. It takes 4 hours and 5 phone calls to get the software installed and the license working. They have a sales website that knows nothing about the software and their support team had me waiting on E-mails that never showed up. Again, lesson learned&#8230;</p>
<p>So, I finally have the software in hand. I rescue the MDF file, but to no avail. It transformed my 25GB MDF file into a 7MB MDF file. I apply for a refund (which is another story altogether). Soon, I learned to stop worrying and love SQL Server.</p>
<h2>Chapter 2: The Recovery</h2>
<p>At this point it is getting late in the evening and I am not getting anywhere. My brain is becoming mush, so I call it a night. The next morning I network around the office to learn of a colleague that is a SQL Server expert. She walks me through these steps and to my avail, the database comes back to life and SharePoint is happy. The icing on the cake is that I lost no data!</p>
<ol>
<li>Make a copy of the MDF file to a remote location just in case.</li>
<li>Rename the MDF file on the SQL server.</li>
<li>Run: <code>CREATE DATABASE WSS_Content</code> (Double check that it puts the MDF and LDF files in the same location as they were before. Add the proper options if need be.)</li>
<li>Shutdown the SQL server.</li>
<li>Copy original database MDF file over the newly created MDF file.</li>
<li>Rename, Move or Delete the newly create LDF file to &#8220;hide&#8221; it from SQL.</li>
<li>Start SQL server.</li>
<li>Run: <code>EXEC('ALTER DATABASE ''[WSS_Content]'' SET EMERGENCY');</code></li>
<li>Run: <code>ALTER DATABASE [WSS_Content] SET SINGLE_USER;</code></li>
<li>Run: <code>DBCC CHECKDB ([WSS_Content], REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS;</code></li>
<li>Run: <code>ALTER DATABASE [WSS_Content] SET MULTI_USER;</code></li>
</ol>
<h2>Chapter 3: Prevention</h2>
<p>At this point, my transaction log would still grow to enormous proportions without the proper practices. My colleague and SQL Server expert showed me how to run backups and truncate the transaction logs daily.</p>
<ul>
<li>Run full database backups that overwrite themselves the next day.
<ul>
<li>Create a job for running full backups as so for each database that needs to be backed up:<br />
<code>BACKUP DATABASE [WSS_Content] TO DISK='C:PATHTOBACKUP[WSS_Content].bak' WITH INIT</code></li>
<li>If the database needs to have the transaction log truncated, run this after the BACKUP DATABASE command:<br />
<code>BACKUP LOG [WSS_Content] TO DISK='C:PATHTOBACKUP[WSS_Content]_LOG.bak'</code></li>
<li>Schedule the job to run once nightly such that it will end prior to any tape backups.</li>
</ul>
</li>
<li>Optional, run transaction log backups every 4 hours to ensure that data from 4 hours ago can be recovered in case of a problem throughout the day.
<ul>
<li>For each database that needs to have the transaction log backed up and truncated run:<br />
<code>BACKUP LOG [WSS_Content] TO DISK='C:PATHTOBACKUP[WSS_Content]_LOG.bak'</code></li>
<li>Schedule the job to run every 4 hours and stop prior to the full database backup above.</li>
</ul>
</li>
</ul>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://fugertech.com/2008/09/24/dr-translog-or-how-i-learned-to-stop-worrying-and-love-sql-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Brought Back to Life: Compaq Presario 1277</title>
		<link>http://fugertech.com/2008/07/16/brought-back-to-life-compaq-presario-1277/</link>
		<comments>http://fugertech.com/2008/07/16/brought-back-to-life-compaq-presario-1277/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 00:59:07 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[1200 series]]></category>
		<category><![CDATA[1277]]></category>
		<category><![CDATA[AMD]]></category>
		<category><![CDATA[Anti-Spyware]]></category>
		<category><![CDATA[Compaq]]></category>
		<category><![CDATA[DIMM]]></category>
		<category><![CDATA[HP]]></category>
		<category><![CDATA[Laptop]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[Linksys]]></category>
		<category><![CDATA[Malwarebytes]]></category>
		<category><![CDATA[McAfee]]></category>
		<category><![CDATA[Memory]]></category>
		<category><![CDATA[Office 2000]]></category>
		<category><![CDATA[Presario]]></category>
		<category><![CDATA[RAM Upgrade]]></category>
		<category><![CDATA[SDRAM]]></category>
		<category><![CDATA[travel]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows 2000]]></category>
		<category><![CDATA[Wireless]]></category>
		<category><![CDATA[WPC54GX]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://www.fugertech.com/?p=16</guid>
		<description><![CDATA[First off, welcome to my first IT related post on FuGeRTech. A few weeks ago, my (soon to be) in-laws came to town. As they brought in their bags, Tamara&#8217;s father says to me, &#8220;hey Tony, I&#8217;ve got a project for you.&#8221; I turn to see a laptop bag in his hands. I think to myself, <a href='http://fugertech.com/2008/07/16/brought-back-to-life-compaq-presario-1277/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>First off, welcome to my first IT related post on FuGeRTech. A few weeks ago, my (soon to be) in-laws came to town. As they brought in their bags, Tamara&#8217;s father says to me, &#8220;hey Tony, I&#8217;ve got a project for you.&#8221; I turn to see a laptop bag in his hands. I think to myself, &#8220;must need an OS scrub, defrag, clean-up, etc.&#8221; I reply, &#8220;alright, what have you got there?&#8221; He pulls out the laptop. I see the first piece of it, and then it hit me&#8230; &#8220;OMG! My college laptop!&#8221; I had a 1200 series Presario my Freshman year.</p>
<p><a href="http://www.fugertech.com/wp-content/uploads/2008/07/presario-001.jpg"><img class="aligncenter size-medium wp-image-19" title="presario-001" src="http://www.fugertech.com/wp-content/uploads/2008/07/presario-001-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p><span id="more-16"></span>This machine in particular is a 1277 rev B. Here&#8217;s the specs.:</p>
<ul>
<li>Processor/Cache<br />
AMD K6-2 433MHz, 100MHz Bus, 512KB L2</li>
<li>Memory<br />
64MB SDRAM (soldered), 1 SO DIMM 144-PIN SDRAM slot (upgradeable to 192MB total)</li>
<li>Storage<br />
IDE Controller, 4.8GB Hard Drive, 3.5&#8243; 1.44MB Floppy, 24x CD-ROM</li>
<li>Display<br />
13&#8243;, SVGA (800&#215;600), 24-bit (16.7 million colors) display</li>
<li>Video<br />
Trident Blade 3D AGP, Shared Video Memory (UMA), External Display up to SXGA (1280&#215;1024)</li>
<li>Audio<br />
Sound Blaster 16/Pro, Integrated Microphone</li>
<li>Input Devices<br />
Keyboard, Trackpad</li>
<li>Telecom<br />
PCI Fax modem, 56Kbps, ITU V.90/Hayes AT command set</li>
<li>Expansion<br />
CardBus Type II, 15-pin HD-15, 4 PIN USB Type A, RS-232 DB-9, IEEE-1284 DB-25, PS/2 style mouse/keyboard, RJ-11 phone line, 3.5mm headphones, 3.5mm microphone</li>
</ul>
<p>I did not have this specifications list in front of me at the time, so seeing the 433MHz K6-2 and 64MB of RAM was funny to see at first. Onto the rest of the story. So, Tamara&#8217;s father asked me to clean it up and make it run smoothly so that Tamara&#8217;s mother can use it for gathering information on trips, etc. I power it up and the first thing I notice is&#8230;</p>
<p style="text-align: center;"><img class="size-medium wp-image-17" style="vertical-align: middle;" title="win98_logo" src="http://www.fugertech.com/wp-content/uploads/2008/07/win98_logo-300x224.jpg" alt="" width="300" height="224" /></p>
<p>That&#8217;s right folks Windows 98. Now I know what you&#8217;re thinking, &#8220;but that machine came with Windows 98 from the factory.&#8221; Well, it did. I know that. I just expected to see it running Windows 2000 I guess&#8230; So, it&#8217;s not a shock, but I haven&#8217;t seen this splash screen in so long&#8230;</p>
<p>So, the machine is running quite slow. I hop online and pray that I can find memory for this thing. Luckily, it wasn&#8217;t that hard. I found a handful of places still selling memory for this dinosaur. I ordered the largest DIMM I could (128MB). It was about $20 after shipping. This upgraded the machine to 192MB total.</p>
<p>I proceeded to attempt to install Windows XP. This was a mistake as XP was just about as slow as the old, hosed up Windows 98 (despite Microsoft&#8217;s published minimum requirements). So, I found an old Windows 2000 disk and slapped on that OS.</p>
<p>I also ordered a Linksys CardBus Type II wireless card (model: WPC54GX) from eBay for ~$20. I got it installed without a hitch and was then able to go to the Internet to get the latest Service Pack installed. I noticed a very annoying sound coming from the speakers when the wireless card was actively transferring data. After some brief Googling, I found that Compaq had a flawed design where the CardBus slots of their 1200 series and many other Presario models lacked proper EMF shielding. The sound card was susceptible to this EMF noise. The two solutions:</p>
<ol>
<li>Try to get a plastic-coated MU-Metal shield package from Compaq/HP</li>
<li>Plug in some headphones</li>
</ol>
<p>Having headphones plugged in to the laptop routed the noise to the headphones. I found an old pair of headphones that I did not care about and cut the wires off of the plug. This proved sufficient for hiding the noise while using the Internet&#8230; better than nothing I suppose.</p>
<p style="text-align: center;"><a href="http://www.fugertech.com/wp-content/uploads/2008/07/presario-003.jpg"><img class="aligncenter size-medium wp-image-20" title="presario-003" src="http://www.fugertech.com/wp-content/uploads/2008/07/presario-003-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p>Now the machine is up and running and ready to go with Windows 2000, Office 2000, McAfee Anti-Virus, Malwarebytes&#8217; Anti-Spyware, upgraded RAM, and a wireless card. It appears to run very smoothly. I forgot how nice and paired-down Windows 2000 is compared to XP and Vista. I really miss the simplicity of the operating system. It will make an excellent laptop for data gathering on the road.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save">Share/Save</a> </p>]]></content:encoded>
			<wfw:commentRss>http://fugertech.com/2008/07/16/brought-back-to-life-compaq-presario-1277/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
