<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Integration Points &#187; c#</title>
	<atom:link href="http://dmgorman.wordpress.com/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://dmgorman.wordpress.com</link>
	<description>Extending Corporate Data ...</description>
	<lastBuildDate>Wed, 16 Dec 2009 16:27:47 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='dmgorman.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/09ff9c9336e6ecd7cc49045a62d1aab3?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Integration Points &#187; c#</title>
		<link>http://dmgorman.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://dmgorman.wordpress.com/osd.xml" title="Integration Points" />
		<item>
		<title>#08 Folder Creation</title>
		<link>http://dmgorman.wordpress.com/2008/05/30/08-folder-creation/</link>
		<comments>http://dmgorman.wordpress.com/2008/05/30/08-folder-creation/#comments</comments>
		<pubDate>Fri, 30 May 2008 18:11:43 +0000</pubDate>
		<dc:creator>dmgorman</dc:creator>
				<category><![CDATA[Custom Methods]]></category>
		<category><![CDATA[c#]]></category>

		<guid isPermaLink="false">http://dmgorman.wordpress.com/?p=19</guid>
		<description><![CDATA[The following code creates folders off of a Work Flow call. I have removed some of the unusual code we use to check the current folders and align our names. There are a number of unimplemented but known improvements needed (better error processing &#8211; I drop some exceptions And I should send back the message properly [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dmgorman.wordpress.com&blog=2497805&post=19&subd=dmgorman&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>The following code creates folders off of a Work Flow call. I have removed some of the unusual code we use to check the current folders and align our names. There are a number of unimplemented but known improvements needed (better error processing &#8211; I drop some exceptions And I should send back the message properly to the user via WF - see the development kit)  That being noted this code will need an Active Directory ID with write access to your file stores.  Please contact me if you have any questions.  This is using the 1.1 asp.net framework.</p>
<p><strong>Credit Due:</strong> <a href="http://thedotnet.com/blogs/rick_strahl/archive/2005/02/24/125731.aspx">http://thedotnet.com/blogs/rick_strahl/archive/2005/02/24/125731.aspx</a> (for AD Impersonation)</p>
<p><strong>C# Class &amp; Method</strong></p>
<p>using System;<br />
using System.DirectoryServices;<br />
using System.IO;<br />
using System.Runtime.InteropServices;<br />
using System.Text.RegularExpressions;<br />
using System.Data.SqlClient;</p>
<p>namespace deltekCustom<br />
{<br />
public class CreateFolders<br />
{</p>
<p>protected static string sServer01 = @&#8221;\server1dfsrootPRJ&#8221;;<br />
protected static string sServer02 = @&#8221;\server2PRJ&#8221;;</p>
<p>const int LOGON32_PROVIDER_DEFAULT        = 0;<br />
const int LOGON32_LOGON_INTERACTIVE       = 2;<br />
const int LOGON32_LOGON_NETWORK           = 3;<br />
const int LOGON32_LOGON_BATCH             = 4;<br />
const int LOGON32_LOGON_SERVICE           = 5;<br />
const int LOGON32_LOGON_UNLOCK            = 7;<br />
const int LOGON32_LOGON_NETWORK_CLEARTEXT = 8;<br />
const int LOGON32_LOGON_NEW_CREDENTIALS   = 9;<br />
protected static string connDeltek = &#8220;***&#8221;;</p>
<p>[DllImport("advapi32.dll", SetLastError=true)]<br />
public static extern int LogonUser(<br />
string lpszUsername,<br />
string lpszDomain,<br />
string lpszPassword,<br />
int dwLogonType,<br />
int dwLogonProvider,<br />
out IntPtr phToken<br />
);<br />
[DllImport("advapi32.dll", SetLastError=true)]<br />
public static extern int ImpersonateLoggedOnUser(<br />
IntPtr hToken<br />
);</p>
<p>[DllImport("advapi32.dll", SetLastError=true)]<br />
static extern int RevertToSelf();</p>
<p>public CreateFolders()   {      }</p>
<p>public string SetupClientFolders(string ClientID, string WBS1, string Server1, string Server2, string AUX )<br />
{<br />
IntPtr lnToken;</p>
<p>int TResult = LogonUser(&#8220;***&#8221;,&#8221;***&#8221;, @&#8221;***&#8221;,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,out lnToken);</p>
<p>ImpersonateLoggedOnUser(lnToken);</p>
<p>if ( TResult &gt; 0 )<br />
{<br />
bool bOK = true;<br />
// VALIDATE KEY PARMS<br />
if (AUX.Trim().Length &gt; 0)<br />
bOK = validAdditionalFolderText(AUX);</p>
<p>if (WBS1.Trim().Length == 0)<br />
{<br />
sReturn  = &#8220;Missing Job Number &#8211; Error on Folder Creation&#8221;;<br />
bOK = false;<br />
}</p>
<p>string Client = getClient(ClientID);<br />
if (Client.Trim().Length == 0)<br />
{<br />
sReturn  = &#8220;Missing Client ID &#8211; Error on Folder Creation&#8221;;<br />
bOK = false;<br />
}</p>
<p>// PROCESS EACH SERVER SELECTED if VALID<br />
if (bOK)<br />
{<br />
string sAUX = &#8220;&#8221;;<br />
if (Server1 == &#8220;Y&#8221;)<br />
CreeateJobFolders(sServer01 , Client, WBS1, AUX);<br />
if (Server2 == &#8220;Y&#8221;)<br />
CreeateJobFolders(sServer02 , Client, WBS1, AUX);<br />
}</p>
<p>RevertToSelf();</p>
<p>}<br />
else<br />
sReturn  = &#8220;Security Error on Folder Creation&#8221;;</p>
<p>return sReturn;<br />
}</p>
<p>/// &lt;summary&gt;<br />
///  Get Client Code from CL table<br />
/// &lt;/summary&gt;<br />
/// &lt;param name=&#8221;WBS1?&gt;&lt;/param&gt;<br />
/// &lt;returns&gt;Client Code &lt;/returns&gt;<br />
private string getClient(string ClientID)<br />
{<br />
SqlDataReader dr;<br />
string sClientCode = &#8220;&#8221;;</p>
<p>string strSQL = &#8220;Select Distinct CL.CLient as ClientCode FROM CL WHERE CL.ClientID =  ‘&#8221; + ClientID + &#8220;‘&#8221;;</p>
<p>SqlConnection conn = new SqlConnection(connDeltek);</p>
<p>SqlCommand cmdSelect  = new SqlCommand(strSQL, conn);</p>
<p>try<br />
{<br />
conn.Open();<br />
dr = cmdSelect.ExecuteReader();</p>
<p>if (dr.Read())<br />
{<br />
sClientCode = dr["ClientCode"].ToString();<br />
}<br />
}</p>
<p>catch (Exception)<br />
{<br />
}</p>
<p>finally<br />
{<br />
if (conn != null) { conn.Close(); conn.Dispose(); }<br />
if (cmdSelect != null) { cmdSelect.Dispose(); }<br />
}</p>
<p>return sClientCode;</p>
<p>}</p>
<p>/// &lt;summary&gt;<br />
/// Validate the Auxiliary text added to folder name<br />
/// &lt;/summary&gt;<br />
/// &lt;returns&gt;&lt;/returns&gt;<br />
private bool validAdditionalFolderText( string AuxText)<br />
{<br />
Regex objRegex;</p>
<p>objRegex = new Regex(&#8220;^[ a-zA-Z0-9._#s-]+$&#8221;);</p>
<p>return objRegex.IsMatch(AuxText);<br />
}</p>
<p>private string getJobFolderEndingName( string sJob )<br />
{<br />
string sJobEnding = &#8220;.00&#8243;;<br />
if (sJob.Length == 9 )<br />
sJobEnding = sJob.Substring(7,2);</p>
<p>switch (sJobEnding)<br />
{<br />
case &#8220;00&#8243; : return( &#8220;00-Overhead&#8221;);<br />
case &#8220;10&#8243; : return( &#8220;10-Proposal&#8221; );<br />
case &#8220;20&#8243; : return( &#8220;20-GISMapping&#8221; );<br />
case &#8220;30&#8243; : return( &#8220;30-ReportStudy&#8221; );<br />
case &#8220;40&#8243; : return( &#8220;40-Design&#8221; );<br />
case &#8220;50&#8243; : return( &#8220;50-DesignBuild&#8221; );<br />
case &#8220;60&#8243; : return( &#8220;60-Construction&#8221; );<br />
case &#8220;70&#8243; : return( &#8220;70-Operations&#8221; );<br />
case &#8220;80&#8243; : return( &#8220;80-PlanReview&#8221; );<br />
case &#8220;90&#8243; : return( &#8220;90-GeneralMunicipalServices&#8221; );<br />
default: return( sJob );</p>
<p>}</p>
<p>}</p>
<p>/// &lt;summary&gt;<br />
/// Create sub-folders on particular server for client/job<br />
/// &lt;/summary&gt;<br />
/// &lt;param name=&#8221;sServerPath&#8221;&gt;&lt;/param&gt;<br />
private void createJobFolders( string sServerPath , string Client, string WBS1 , string Aux )<br />
{<br />
string sWBS1Root =  &#8220;&#8221;;</p>
<p>if (WBS1.Length &gt; 6)<br />
sWBS1Root = WBS1.Substring(0,6);<br />
else<br />
sWBS1Root = WBS1;</p>
<p>// BASE CLIENT DIRECTORY<br />
createDirectory(sServerPath +  @&#8221;" + Client );</p>
<p>// BASE JOB ROOT DIRECTORY<br />
string sBaseJobPath = sServerPath +  @&#8221;" + Client +  @&#8221;" + sWBS1Root + Aux;<br />
createDirectory(sBaseJobPath);</p>
<p>// DRAWING DIRECTORY UNDER JOB ROOT<br />
createDirectory(sBaseJobPath + @&#8221;CADD-SURVEY&#8221;);<br />
createDirectory(sBaseJobPath + @&#8221;CADD-SURVEYSURVEY&#8221;);<br />
createDirectory(sBaseJobPath + @&#8221;CADD-SURVEYDRAWINGS&#8221;);<br />
createDirectory(sBaseJobPath + @&#8221;CADD-SURVEYPLOTS&#8221;);<br />
createDirectory(sBaseJobPath + @&#8221;CADD-SURVEYSCANS&#8221;);<br />
// BASE JOB SUBNUMBER DIRECTORY<br />
string JobSubnumberPath = sBaseJobPath +  @&#8221;" + getJobFolderEndingName(WBS1);<br />
createDirectory(JobSubnumberPath);</p>
<p>// DEFAULT DIRECTORIES<br />
createDirectory(JobSubnumberPath + @&#8221;AS SENT&#8221;);</p>
<p>createDirectory(sBaseJobPath  +    @&#8221;CADD-SURVEYDRAWINGSDGNS&#8221;);<br />
createDirectory(sBaseJobPath  +    @&#8221;CADD-SURVEYDRAWINGSDWGS&#8221;);</p>
<p>}</p>
<p>private bool createDirectory ( string sDirName )<br />
{<br />
// Determine whether the directory exists.<br />
if (Directory.Exists(sDirName))<br />
{<br />
return(false);<br />
}</p>
<p>DirectoryInfo di = Directory.CreateDirectory( sDirName );</p>
<p>return(true);</p>
<p>}<br />
}<br />
}</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dmgorman.wordpress.com/19/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dmgorman.wordpress.com/19/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dmgorman.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dmgorman.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dmgorman.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dmgorman.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dmgorman.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dmgorman.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dmgorman.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dmgorman.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dmgorman.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dmgorman.wordpress.com/19/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dmgorman.wordpress.com&blog=2497805&post=19&subd=dmgorman&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://dmgorman.wordpress.com/2008/05/30/08-folder-creation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0f40e4ba23d8f519bc9491fe6ae71f78?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dmgorman</media:title>
		</media:content>
	</item>
	</channel>
</rss>