<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<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/"
	>

<channel>
	<title>ldap &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/ldap/</link>
	<description>Feed of posts on WordPress.com tagged "ldap"</description>
	<pubDate>Sun, 12 Oct 2008 16:53:46 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[How Shared Services Works]]></title>
<link>http://erichelmer.wordpress.com/?p=38</link>
<pubDate>Fri, 10 Oct 2008 03:31:19 +0000</pubDate>
<dc:creator>Eric Helmer</dc:creator>
<guid>http://erichelmer.pt-br.wordpress.com/2008/10/10/how-shared-services-works/</guid>
<description><![CDATA[What Shared Services Does
Shared Services is a component of the “foundation services”.  It is t]]></description>
<content:encoded><![CDATA[<h4><span style="text-decoration:underline;"><strong><span style="color:#888888;">What Shared Services Does</span></strong></span></h4>
<p>Shared Services is a component of the “foundation services”.  It is the mechanism that provides a common framework for user security and administration.  It is the first component that is installed in an installation.  Once up and running, all Hyperion products and modules “plug-in” to this base.  Shared Services provides a single interface to:</p>
<ol>
<li>Define Eternal Authentication providers (ie – corporate LDAP, MSAD, etc)</li>
<li>Provision Users and Groups</li>
<li>Life Cycle Management (promotion of artifacts between DEV and PROD)</li>
</ol>
<p>Products communicate with Shared services though a common API which allows all the products to employ true single sign-on between the products.</p>
<h4><span style="text-decoration:underline;"><strong>Shared Services components</strong></span></h4>
<p>There are 4 major components of what we collectively call Shared Services:</p>
<ol>
<li>Shared Services web server.  The Web Server for the Shared Services communication and interface.  Default URL and port is <strong>http://&#60;server&#62;:58080/interop</strong></li>
<li>Native Directory.  A small file-based OpenLDAP directory that comes with Shared Services to store provisioning information</li>
<li>Relational Repository.  A small relational database (ie Oracle, SQL Server, etc) that stores location information</li>
<li>Corporate External Authentication (optional).  Your (already existing) corporate external authentication mechanism.</li>
</ol>
<p>If you do not have a corporate external authentication provider you can use the provided Native Directory to create users and passwords to provision.  However, doing this puts you into the password and account maintenance business. If you do have one, you will want to use it, as that will be taken care of for you. Shared Services will not store passwords of externally authenticated users, it simply forwards on the ID/Password combination to the provider for a thumbs-up or thumbs-down. You can have multiple user directories configured and set a search order for them.</p>
<p>The Native directory holds user IDs and Passwords of Natively authenticated users, provisioning information for all users, and tracks user-group relationships.  Again, this is stored in the OpenLDAP repository that comes with Shared Services. The OpenLDAP that comes with HSS  is a simple file-based database that is in LDAP format which runs on port 58089.  You can actually use an LDAP browser and connect to OpenLDAP and browse around using a base DN of <strong>dc=css,dc=hyperion,dc=com</strong>.</p>
<p>The relational component is a separate database (or schema in Oracle) that holds registration information about the products in the environment.</p>
<p>The following diagram summarizes the components.  Again, the corporate LDAP authenticates the user (are they who they say they are), the relational holds product registration information (can they access this particular product), and the native directory handles authorization (do they have permission to do what they are requesting to do in this product).</p>
<h2><a href="http://erichelmer.files.wordpress.com/2008/10/hss1.jpg"><img class="aligncenter size-large wp-image-50" title="Shared Services" src="http://erichelmer.wordpress.com/files/2008/10/hss1.jpg?w=497" alt="" width="497" height="241" /></a></h2>
<h4><strong><span style="text-decoration:underline;">Provisioning users and Groups</span></strong></h4>
<p>The User Management console using the URL <strong>http://&#60;server&#62;:58080/interop</strong> is used to provision users.  Provisioning is the process of granting access to users to certain products and services.  Here we browse through the users, and provision Henry for the BBB Essbase Application and the Finsrvs FDM application, and the TotPlan Planning Application.</p>
[caption id="attachment_43" align="alignnone" width="399" caption="Show all users"]<a href="http://erichelmer.wordpress.com/files/2008/10/users.png"><img class="size-medium wp-image-43" title="Users" src="http://erichelmer.wordpress.com/files/2008/10/users.png?w=300" alt="Browse users" width="399" height="196" /></a>[/caption]
[caption id="attachment_40" align="alignnone" width="300" caption="Right click on Henry"]<a href="http://erichelmer.wordpress.com/files/2008/10/provision.png"><img class="size-medium wp-image-40" title="provision" src="http://erichelmer.wordpress.com/files/2008/10/provision.png?w=300" alt="Right click on Henry" width="300" height="150" /></a>[/caption]
[caption id="attachment_44" align="alignnone" width="300" caption="Provision"]<a href="http://erichelmer.wordpress.com/files/2008/10/provisioning1.png"><img class="size-medium wp-image-44" title="provisioning1" src="http://erichelmer.wordpress.com/files/2008/10/provisioning1.png?w=300" alt="Provision" width="300" height="210" /></a>[/caption]
<h4><span style="text-decoration:underline;">The Process of Authentication</span></h4>
<p>Once a product is registered with Shared Services, it receives and stores location of the user directories.  So when a user logs into a product, the process is as follows:</p>
<ol>
<li>The user enters the ID and Password into the product log-in screen</li>
<li>The product queries all the configured user directories to verify the credentials.  Upon success, the user is authenticated.</li>
<li>Once authenticated, the product contacts Shared Services to lookup the provisioning information of the user to see if the user has been given the access to the product and service.</li>
<li>SSO is enabled for this user now for the rest of the products they are provisioned for.</li>
</ol>
<h4><span style="text-decoration:underline;">What This Means for our System Administrator Brethren</span></h4>
<ol>
<li>Shared Services must be the first to be installed and configured</li>
<li>Shared Services must be the first to be started (along with OpenLDAP).  Note:  it can take a while for Shared Services to come up.  Make sure you wait a while and check that HSS is all the way up by going to the URL before starting the other services)</li>
<li>Shared Services is a single point of failure for all Hyperion Products.</li>
<li>You must be diligent in backing up Shared Services, including
<ul>
<li>Shared Services relational database</li>
<li>OpenLDAP (see the <a title="9.3.1 Backup and Recovery Guide" href="http://download.oracle.com/docs/cd/E10530_01/doc/epm.931/hfm_backup.pdf" target="_blank">backup/recovery guide</a> ....there is a utility that backs up the OpenLDAP directory)</li>
</ul>
</li>
</ol>
]]></content:encoded>
</item>
<item>
<title><![CDATA[JMS, time-to-live and Websphere MQ]]></title>
<link>http://virgo47.wordpress.com/?p=101</link>
<pubDate>Thu, 09 Oct 2008 22:28:19 +0000</pubDate>
<dc:creator>virgo47</dc:creator>
<guid>http://virgo47.pt-br.wordpress.com/2008/10/09/jms-time-to-live-and-websphere-mq/</guid>
<description><![CDATA[Without long-winded introduction&#8230; I had a problem setting message expiration using JMS and Web]]></description>
<content:encoded><![CDATA[<p>Without long-winded introduction... I had a problem setting message expiration using <a href="http://java.sun.com/products/jms/">JMS</a> and <a href="http://www-01.ibm.com/software/integration/wmq/">Websphere MQ</a> as an underlying JMS provider. As you may (not) know there is a big difference if you <a href="http://java.sun.com/javaee/5/docs/api/javax/jms/MessageProducer.html#setTimeToLive(long)">set time to live</a> on QueueSender (which should work) or <a href="http://java.sun.com/javaee/5/docs/api/javax/jms/Message.html#setJMSExpiration(long)">JMS expiration</a> on the message (which is actually ignored before you send the message and specified so). I used JMS to send a request and waited for response in the same method subsequently. Because the reply is received in a synchronous manner and after timeout it's not processed it's good idea to set time to live on the request.</p>
<p>I expect you know JMS so the following code excerpts are not complete compilable examples. Client has some initialization code:</p>
<pre>queueConnection = queueConnectionFactory
  .createQueueConnection("mqm", "mqm");
queueSession = queueConnection
  .createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
queueSender = queueSession
  .createSender(requestQueue);</pre>
<p>Request queue is looked up in the JNDI - in my case it was the LDAP with following object for the queue (LDIF):</p>
<pre><span style="font-family:'Lucida Grande';line-height:19px;white-space:normal;">d</span>n: cn=request.q, ...
objectClass: javaContainer
objectClass: javaObject
objectClass: javaNamingReference
objectClass: top
javaReferenceAddress: #0#VER#1
javaReferenceAddress: #1#DESC#Request Q
javaReferenceAddress: #2#EXP#0
javaReferenceAddress: #3#PRI#-1
javaReferenceAddress: #4#PER#-1
javaReferenceAddress: #5#CCS#1250
javaReferenceAddress: #6#TC#1
javaReferenceAddress: #7#ENC#273
javaReferenceAddress: #8#QU#SERVICE_REQ
javaReferenceAddress: #9#QMGR#
javaClassName: com.ibm.mq.jms.MQQueue
javaFactory: com.ibm.mq.jms.MQQueueFactory
cn: request.q</pre>
<p>Message is sent in the following code:</p>
<pre>queueSender.setTimeToLive(MAX_RETAIL_TIMEOUT / 2);
queueSender.getTimeToLive();
queueSender.send(jmsMsg);
jmsMsg.getJMSExpiration();</pre>
<p>The trouble is that while getTimeToLive really returns some number (in ms), getJMSExpiration that should return the timestamp when the message expires returns zero instead. And really - the message never expires. Something is wrong when sender claims the time-to-live is set but it actually is not. It was funny to find out that the same code works perfectly fine in EJB container - getJMSExpiration returns real timestamp and the message is removed from the queue as expected. It took me some time to find out the difference in the debug process.</p>
<p>QueueSender in application server (<a href="https://glassfish.dev.java.net/">Glassfish</a> was used) is implemented by the com.sun.genericra.outbound.MessageProducerProxy and this object holds actual com.ibm.mq.jms.MQQueueSender while in outside of the container there is no <a href="https://genericjmsra.dev.java.net/">genericjmsra</a> proxy in the way - but this wasn't the problem. IBM's class holds something called queueSpec. In appserver it was:</p>
<pre>queue:///SERVICE_REQ?targetClient=1</pre>
<p>While in the standalone JVM:</p>
<pre>queue:///SERVICE_REQ?<strong>expiry=0</strong>&#38;priority=-1&#38;persistence=-1&#38;CCSID=1250&#38;targetClient=1</pre>
<p>I was suddenly very suspicious whether parameters in that URL don't override my programmatic settings on the queue sender. And where they come from? Yeah, you can guess - they are part of the queue object reference in the LDAP. Queue for appserver was stored in its JNDI and it was configured some other way. So I tried to modify my LDAP object to remove values with EXP (and some other along the way) of the attribute javaReferenceAddress:</p>
<pre>dn: cn=reqest.q, ...
objectClass: javaContainer
objectClass: javaObject
objectClass: javaNamingReference
objectClass: top
javaReferenceAddress: #0#VER#1
javaReferenceAddress: #1#DESC#Request Q
javaReferenceAddress: #2#PER#-1
javaReferenceAddress: #3#CCS#1250
javaReferenceAddress: #4#TC#1
javaReferenceAddress: #5#QU#SERVICE_REQ
javaReferenceAddress: #6#QMGR#
javaFactory: com.ibm.mq.jms.MQQueueFactory
javaClassName: com.ibm.mq.jms.MQQueue
cn: request.q</pre>
<p>Yup, my code started to work. In case you want some command to check the Websphere MQ as well, you can try this one from samples (here on Solaris, should work on other UNIX too):</p>
<pre>$ cd /opt/mqm/samp/bin
$ ./amqsbcg AS4_DOMPAY_REQ

AMQSBCG0 - starts here
**********************

  MQOPEN - 'AS4_DOMPAY_REQ'

  MQGET of message number 1

****Message descriptor****
  StrucId  : 'MD  '  Version : 2
  Report   : 0  MsgType : 1
  Expiry   : 15  Feedback : 0</pre>
<p>... the rest is not important</p>
<p>Expiry value -1 means "never expire". This message also disappeared after another few seconds. That was what I wanted. What is the point behind my unlucky LDAP configuration? First - I don't know if it's correct when queue sender returns some time-to-live but it actually doesn't work in the end. I don't know how this works with another JMS providers. I don't care. I just googled the whole damned Internet to finally get to the result on my own. If you have searched for the problem, found this and it would helped, be my guest.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[IBM - Configuring SSO between WebSphere Portal and Lotus Sametime when each use a different user directory]]></title>
<link>http://tokenblog.wordpress.com/2008/10/08/ibm-configuring-sso-between-websphere-portal-and-lotus-sametime-when-each-use-a-different-user-directory/</link>
<pubDate>Thu, 09 Oct 2008 02:25:23 +0000</pubDate>
<dc:creator>Rainier</dc:creator>
<guid>http://tokenblog.wordpress.com/2008/10/08/ibm-configuring-sso-between-websphere-portal-and-lotus-sametime-when-each-use-a-different-user-directory/</guid>
<description><![CDATA[How do you configure an environment for Single Sign-on (SSO) when IBM® WebSphere® Portal authentic]]></description>
<content:encoded><![CDATA[<p>How do you configure an environment for Single Sign-on (SSO) when IBM® WebSphere® Portal authenticates against one Lightweight Directory Access Protocol (LDAP) directory (IBM Directory Server, in our example here) and Lotus® Sametime® authenticates against Native IBM Lotus Domino®?</p>
<p>via <a href="http://www-01.ibm.com/support/docview.wss?rs=688&#38;context=SSHRKX&#38;uid=swg21231292&#38;loc=en_US&#38;cs=utf-8&#38;lang=en">IBM - Configuring SSO between WebSphere Portal and Lotus Sametime when each use a different user directory</a>.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[The Most Magical Bullet]]></title>
<link>http://idlogger.wordpress.com/?p=515</link>
<pubDate>Wed, 08 Oct 2008 17:06:25 +0000</pubDate>
<dc:creator>jbohren</dc:creator>
<guid>http://idlogger.pt-br.wordpress.com/2008/10/08/the-most-magical-bullet/</guid>
<description><![CDATA[Ashraf Motiwala has some interesting thoughts about why IdM POCs are &#8220;difficult&#8221;. Mike T]]></description>
<content:encoded><![CDATA[<p>Ashraf Motiwala has some interesting <a href="http://identityman.blogspot.com/2008/10/why-most-identity-management-pocs-suck.html">thoughts</a> about why IdM POCs are "difficult". Mike Trachta follows up with why the successful POCs cause <a href="http://mike.trachta.org/archives/20">headaches</a> for the SIs that have to produce the wonderful scenarios shown in the POCs. Both of these posts are worth reading.</p>
<p>I would like to throw my two cents in as the developer backstopping both the sales engineer doing the POC and the SI putting together the production system.</p>
<p>IdM POCs and the following rollout are very difficult for two main reasons. First the customer is often already in a bad way and is looking for a magic bullet. The IdM salesman has sold him on the IdM product as a most magical bullet that will make their problems go away. Solve all your identity problems! Out of the box! Easy as pie! The winner of the POC is often the sales engineering who makes their demo closest to this fantasy as possible. Then the brunt of making that fantasy a reality falls on the SI, and depending on the size and motivation of the vendor, the product development team.</p>
<p>This is a very bad way for an enterprise to solve their identity problems. Lost is the trade-off analysis that should be happening. For example when the POC focuses on provisioning Unix accounts, there is never any discussion about externalizing the identity (via a PAM or similar framework) rather than synchronizing it. This kind of logic leads to deployments that are difficult to maintain, don't scale, and need major follow on investments as the IT infrastructure changes. Instead of doing a POC of who has "The Most Magical Bullet", enterprise would be better suited to craft a long term IdM strategy and chose a vendor whose product best aligns with it.</p>
<p>The second reason IdM POCs are so difficult is that so few IT systems support externalized identity. This is an old hobby-horse of mine, but everyone who has done IdM POCs knows the pain I am talking about. And of course there are little in the way of identity standards deployed in most enterprise system, with the exception of LDAP (or at least the AD flavor of it).</p>
<p>Until those two thing change, IdM POCs will continue to be difficult. And the vendor with the Most Magical Bullet will continue to win, often to the long-term detriment of the customer.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Ubuntu and Active Directory in 10 Minutes]]></title>
<link>http://bluhaloit.wordpress.com/?p=23</link>
<pubDate>Mon, 06 Oct 2008 22:12:24 +0000</pubDate>
<dc:creator>Simon Green</dc:creator>
<guid>http://bluhaloit.pt-br.wordpress.com/2008/10/06/ubuntu-and-active-directory-in-10-minutes/</guid>
<description><![CDATA[This aims to be a short and simple step-by-step guide on how to get your blank box running Ubuntu se]]></description>
<content:encoded><![CDATA[<p>This aims to be a short and simple step-by-step guide on how to get your blank box running Ubuntu server, joined to Active Directory and login to it with your AD credentials. Once installed, you can tailor this to your own environment easily. We use this on our local development servers to allow users to have their own home directories on each server with their own sites without having to juggle 6 different passwords. It also adds security in that once a user is locked out of AD, they are locked out of everywhere.</p>
<p>This article assumes you already have a functioning Windows 2003 server running AD.<!--more--><strong>What is Ubuntu?</strong></p>
<p>Ubuntu is a community driven distribution of Linux, with flavors suitable for both Desktops and Servers. It's based on Debian, and uses the same .deb package system. In most cases, any Debian package will work on Ubuntu.</p>
<p><strong> Download &#38; Install Ubuntu</strong></p>
<p><strong></strong></p>
[caption id="attachment_27" align="alignright" width="180" caption="Installing Ubuntu"]<a href="http://bluhaloit.files.wordpress.com/2008/10/1.png"><img class="size-medium wp-image-27 " title="Installing Ubuntu" src="http://bluhaloit.wordpress.com/files/2008/10/1.png?w=300" alt="Installing Ubuntu" width="180" height="135" /></a>[/caption]
<p>Download the server edition of Ubuntu from the <a title="Ubuntu Download Page" href="http://www.ubuntu.com/getubuntu/download">official site</a>. The site offers a selection of mirrors ot choose from. Once downloaded, assuming you are on a windows machine, burn the ISO to CD using something like the lightweight and free <a title="ISO Recorder" href="http://isorecorder.alexfeinman.com/isorecorder.htm">ISO Recorder.</a></p>
<p><strong></strong>Installing Ubuntu is pretty painless. It's all basic options such as country, keyboard layout, and finally you are presented with a short list of generic server environments to choose from such as LAMP, Mail, DNS, etc. Out of these, the only one you should choose is OpenSSH Server.</p>
<p><strong> What is Likewise Open?</strong></p>
<p><strong></strong>Likewise Open allows you to integrate Linux, UNIX and Mac computers with Active Directory, without having to change your LDAP schema or mess around with NIS.</p>
<p><strong> Download and Install Likewise Open</strong></p>
[caption id="attachment_32" align="alignright" width="180" caption="Joining the domain with Likewise"]<a href="http://bluhaloit.wordpress.com/files/2008/10/6.png"><img class="size-medium wp-image-32 " title="Joining the domain with Likewise" src="http://bluhaloit.wordpress.com/files/2008/10/6.png?w=300" alt="Joining the domain with Likewise" width="180" height="103" /></a>[/caption]
<p><span style="font-weight:normal;">You can get the latest copy of Likewise Open from <a title="Likewise Open Download Page" href="http://www.likewisesoftware.com/community/index.php/download/">their site</a>. Make sure you get the latest Debian package (32 bit or 64 bit to match your install). the package is self executing. After downloading, add execute permissions (chmod +x filename) and run it. It needs root privileges, so it will need to be run with sudo or as root. Once you've installed, a simple one line command will join you to the domain:</span></p>
<p><code>/opt/likewise/bin/domainjoin-cli join <em>domainName ADjoinAccount</em></code></p>
[caption id="attachment_33" align="alignleft" width="180" caption="Ubuntu server visible in AD"]<a href="http://bluhaloit.wordpress.com/files/2008/10/7.png"><img class="size-medium wp-image-33 " title="Ubuntu server visible in AD" src="http://bluhaloit.wordpress.com/files/2008/10/7.png?w=300" alt="Ubuntu server visible in AD" width="180" height="135" /></a>[/caption]
<p><strong> Configuring Likewise</strong></p>
<p><strong><span style="font-weight:normal;">Most configuration variables are set in the file "</span><span style="font-weight:normal;">/etc/likewise/lsassd.conf&#38;quot;. You can customise the login shell, the home directory template, set a character to replace spaces. Example:</span></strong></p>
<p><code>login-shell-template = /bin/bash<br />
homedir-template = /home/%D/%U<br />
separator-character = ^</code></p>
<p><strong> Login</strong></p>
<p>And finally, you can login to your machine as a domain user. Remember to use the &#38;quot;DOMAIN\user&#38;quot; syntax, in the same way you would on a Windows machine. If you are connecting to it from a Linux command prompt remotely (eg via SSH), you will need to escape the backslash eg: &#38;quot;DOMAIN\\user&#38;quot;.</p>
[caption id="attachment_26" align="aligncenter" width="450" caption="Logged in using AD credentials"]<a href="http://bluhaloit.wordpress.com/files/2008/10/8.png"><img class="size-large wp-image-26" title="Logged in using AD credentials" src="http://bluhaloit.wordpress.com/files/2008/10/8.png?w=450" alt="Logged in using AD credentials" width="450" height="221" /></a>[/caption]
<p>Full guides are produced by Likewise in PDF form. There is a <a title="10 Minute Setup Guide for Linux" href="http://www.likewisesoftware.com/resources/user_documentation/Likewise-Open-5-Quick-Start-Linux.pdf">10-minute setup guide</a> and an <a title="Installation and Administration Guide" href="http://www.likewisesoftware.com/resources/product_documentation/Likewise-Open-5-Guide.pdf">Installation and Admin guide</a>.</p>
[gallery]
]]></content:encoded>
</item>
<item>
<title><![CDATA[Querying Active Directory using LDAP and VBScript]]></title>
<link>http://resourcefuladmin.wordpress.com/?p=35</link>
<pubDate>Fri, 03 Oct 2008 22:22:22 +0000</pubDate>
<dc:creator>boycie</dc:creator>
<guid>http://resourcefuladmin.pt-br.wordpress.com/2008/10/03/querying-ad-using-ldap-and-vbscript/</guid>
<description><![CDATA[I have lost count of the amount of times I have queried Active Directory for an object and its prope]]></description>
<content:encoded><![CDATA[<p>I have lost count of the amount of times I have queried Active Directory for an object and its properties. As I routinely perform this operation, I wrote two convenience subroutines in VBScript.</p>
<p>I call these subroutines when opening and closing ADODB Sessions.</p>
<p>Note: The Strings 'oRoot,sBase,sDepth,Conn,Comm,sDomain' need to be PUBLIC Strings. (Declared at the top of the script.)</p>
<p>E.g.</p>
<pre><span style="color:#3366ff;">Dim oRoot,sDomain,Conn,Comm,sBase,sDepth</span></pre>
<p>When opening the session/connection you need to pass the "Context" of the container required.<br />
Once completed you just need to call the 'ADODisconnect' to clean up the connection.</p>
<p>See below.</p>
<pre><span style="color:#3366ff;">Sub ADOConnect(Context)
Set oRoot = GetObject("</span><span style="color:#3366ff;">LDAP://rootDSE</span><span style="color:#3366ff;">")
sDomain = oRoot.Get(Context)
Set oDomain = GetObject("LDAP://" &#38; sDomain)
Set Conn = CreateObject("ADODB.Connection")
Set Comm = CreateObject("ADODB.Command")
sBase = "&#60;" &#38; oDomain.ADsPath &#38; "&#62;"
sDepth = "subTree"
Conn.Provider = "ADsDSOObject"
Conn.Open "ADs Provider"
Comm.ActiveConnection = Conn
Comm.Properties("searchscope") = 100
Comm.Properties("Page Size") = 1000
Comm.Properties("Cache Results") = False
Comm.CommandTimeout = 15
End Sub</span>
<span style="color:#3366ff;">Sub ADODisconnect()
Set oRoot = Nothing
Set oDomain = Nothing
Set Conn = Nothing
Set Comm = Nothing
sDomain = ""
sBase = ""
sDepth = ""
End Sub</span></pre>
<p>An example of using these subroutines would be to connect to AD by passing the correct context to the ADOConnect Sub and then using an LDAP filter pull the displayName attribute from a user object.</p>
<p>Note: Replace "UserCN" with a valid user object 'common name'.</p>
<p>See Below.</p>
<pre><span style="color:#3366ff;">Dim oRoot,sDomain,Conn,Comm,sBase,sDepth
sFilter = "(cn=UserCN)"
Call ADOConnect("defaultNamingContext")
sAttribs = "distinguishedName"
sQuery = sBase &#38; ";" &#38; sFilter &#38;  ";" &#38; sAttribs &#38; ";" &#38; sDepth
Comm.CommandText = sQuery
 Set rs = Comm.Execute
  If Not rs.eof Then
   rs.MoveFirst
   Set oUser = GetObject("LDAP://" &#38; rs("distinguishedName") )
   WScript.Echo "User: " &#38; oUser.displayName
  Else
   Wscript.Echo "User Not Found"
  End If
Set oUser = Nothing
rs.close
ADODisconnect()
WScript.Quit

Sub ADOConnect(Context)
Set oRoot = GetObject("</span><span style="color:#3366ff;">LDAP://rootDSE</span><span style="color:#3366ff;">")
sDomain = oRoot.Get(Context)
Set oDomain = GetObject("LDAP://" &#38; sDomain)
Set Conn = CreateObject("ADODB.Connection")
Set Comm = CreateObject("ADODB.Command")
sBase = "&#60;" &#38; oDomain.ADsPath &#38; "&#62;"
sDepth = "subTree"
Conn.Provider = "ADsDSOObject"
Conn.Open "ADs Provider"
Comm.ActiveConnection = Conn
Comm.Properties("searchscope") = 100
Comm.Properties("Page Size") = 1000
Comm.Properties("Cache Results") = False
Comm.CommandTimeout = 15
End Sub

Sub ADODisconnect()
Set oRoot = Nothing
Set oDomain = Nothing
Set Conn = Nothing
Set Comm = Nothing
sDomain = ""
sBase = ""
sDepth = ""
End Sub</span></pre>
<p>Hope this helps.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Exporting an Active Directory User Object to XML]]></title>
<link>http://resourcefuladmin.wordpress.com/?p=18</link>
<pubDate>Fri, 03 Oct 2008 20:24:49 +0000</pubDate>
<dc:creator>boycie</dc:creator>
<guid>http://resourcefuladmin.pt-br.wordpress.com/2008/10/03/exporting-an-ad-user-object-to-xml/</guid>
<description><![CDATA[I always export out the users details to an XML file producing a &#8216;backup&#8217; of critical se]]></description>
<content:encoded><![CDATA[<p>I always export out the users details to an XML file producing a 'backup' of critical settings when I am scripting a solution to administer Active Directory accounts. If I need to restore an account, the resultant XML file could be easily leveraged with code to restore settings.</p>
<p>I often utilize this technique when I am disabling a users mailbox in Active Directory.  One step during the disablement process is to remove a users mail enabled group memberships; this limits delivery failures while the account is retained in AD for a cool off period.  The XML files created during the disablement process are kept until the account is removed from Active Directory.</p>
<p>To export a users details we use an ADODB connection to AD, and locate the users account using LDAP. Once the account is retained in a 'Record Set', you can save the appropriate properties into a String. The XML formatting is added to the String during the export of properties from the 'Record Set'. Once the String build is completed, the String is written to a file with a .XML extension.</p>
<p>This resultant file can then be parsed in the future using the XML-DOM object.</p>
<p>(I will go over an example of that in another article.)</p>
<p>So to the code,</p>
<pre><span style="color:#3366ff;">On Error Resume Next
Dim StrXML, XMLFile, OutFile, StrArg
Const ForReading = 1
Const ForWriting = 2
Set oFSO = CreateObject("Scripting.FileSystemObject")
StrXML = ""
StrXML = StrXML &#38; "&#60;?xml version="&#38;Chr(34)&#38;"1.0"&#38;Chr(34)&#38;_
" encoding="&#38;Chr(34)&#38;"UTF-8"&#38;Chr(34)&#38;"?&#62;"&#38;vbNewLine
StrArg = InputBox("Please Enter Users 'Common Name'","Input Request")
If StrArg = "" Then
Call MsgBox("'Common Name' was not entered.",16,"Status")
End If
StrXML = StrXML &#38; "&#60;UserDump Date = '"&#38;Now&#38;"'&#62;"&#38;vbNewLine
StrXML = StrXML &#38; GetUserData(StrArg)
StrXML = StrXML &#38; "&#60;/UserDump&#62;"&#38;vbNewLine
XMLFile = "C:\"&#38;StrArg&#38;"_"&#38;Month(Date)&#38;"_"&#38;Day(Date)&#38;"_"&#38;year(Date)&#38;"_"&#38;Hour(Time)&#38;"_"&#38;_
Minute(Time)&#38;".xml"
Set OutFile = oFSO.OpenTextFile(XMLFile,ForWriting,True)
OutFile.write StrXML
Function GetUserData(cn)
On Error Resume Next
Dim oRoot,sDomain,Conn,Comm,sBase,sDepth
Dim sAttribs, sQuery, sFilter, sData
sData = ""
Set oRoot = GetObject("</span><a href="//rootDSE"><span style="color:#3366ff;">LDAP://rootDSE</span></a><span style="color:#3366ff;">")
sDomain = oRoot.Get("defaultNamingContext")
Set oDomain = GetObject("LDAP://" &#38; sDomain)
Set Conn = CreateObject("ADODB.Connection")
Set Comm = CreateObject("ADODB.Command")
sBase = "&#60;" &#38; oDomain.ADsPath &#38; "&#62;"
sDepth = "subTree"
Conn.Provider = "ADsDSOObject"
Conn.Open "ADs Provider"
Comm.ActiveConnection = Conn
Comm.Properties("searchscope") = 100
Comm.Properties("Page Size") = 1000
Comm.Properties("Cache Results") = False
Comm.CommandTimeout = 15
If Err.Number &#60;&#62; 0 Then
Call MsgBox("Failed"&#38;vbNewLine&#38;"Error: "&#38;Err.Number&#38;vbNewLine&#38;"Description: "&#38;Err.Description,16,"Error")
Err.Clear
WScript.Quit
End If
sFilter = "(&#38;(objectCategory=person)(objectClass=user)(cn="&#38;cn&#38;"))"
sAttribs = "adspath" 'LDAP filter return attributes
sQuery = sBase &#38; ";" &#38; sFilter &#38;  ";" &#38; sAttribs &#38; ";" &#38; sDepth
Comm.CommandText = sQuery
Set rs = Comm.Execute 'Returned recordset
If Err.Number &#60;&#62; 0 Then
Call MsgBox("Search Failed.",16,"Error")
Else
End If
 If Not rs.EOF Then
  Do While Not Rs.EOF
  rs.MoveFirst
  Set oUser = GetObject(Rs.Fields("adspath"))
      sData = sData &#38; "&#60;ObjectCategory&#62;"&#38;oUser.objectCategory&#38;_
"&#60;/ObjectCategory&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;DistinguishedName&#62;"&#38;oUser.distinguishedName&#38;_
"&#60;/DistinguishedName&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;UserAccountControl&#62;"&#38;oUser.userAccountControl&#38;_
"&#60;/UserAccountControl&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;USNCreated&#62;"&#38;oUser.whenCreated&#38;_
"&#60;/USNCreated&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;LastChanged&#62;"&#38;oUser.whenChanged&#38;_
"&#60;/LastChanged&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;ADsPath&#62;"&#38;oUser.ADsPath&#38;_
"&#60;/ADsPath&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;CN&#62;"&#38;oUser.cn&#38;_
"&#60;/CN&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;UserPrincipalName&#62;"&#38;oUser.userPrincipalName&#38;_
"&#60;/UserPrincipalName&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;SN&#62;"&#38;oUser.sn&#38;"&#60;/SN&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;Initials&#62;"&#38;oUser.initials&#38;"&#60;/Initials&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;GivenName&#62;"&#38;oUser.givenname&#38;"&#60;/GivenName&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;DisplayName&#62;"&#38;oUser.displayname&#38;"&#60;/DisplayName&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;Description&#62;"&#38;oUser.description&#38;"&#60;/Description&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;LastLogonTimestamp&#62;"&#38;oUser.lastLogonTimestamp&#38;"&#60;/LastLogonTimestamp&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;Country&#62;"&#38;oUser.c&#38;"&#60;/Country&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;City&#62;"&#38;oUser.l&#38;"&#60;/City&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;Office&#62;"&#38;oUser.physicalDeliveryOfficeName&#38;"&#60;/Office&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;Department&#62;"&#38;oUser.department&#38;"&#60;/Department&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;Title&#62;"&#38;oUser.title&#38;"&#60;/Title&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;legacyExchangeDN&#62;"&#38;oUser.legacyExchangeDN&#38;_
"&#60;/legacyExchangeDN&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;msExchALObjectVersion&#62;"&#38;_
oUser.msExchALObjectVersion&#38;_
"&#60;/msExchALObjectVersion&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;msExchUserAccountControl&#62;"&#38;oUser.msExchUserAccountControl&#38;_
"&#60;/msExchUserAccountControl&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;HomeMDB&#62;"&#38;oUser.homeMDB&#38;"&#60;/HomeMDB&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;HomeMTA&#62;"&#38;oUser.homeMTA&#38;"&#60;/HomeMTA&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;msExchHomeServerName&#62;"&#38;oUser.msExchHomeServerName&#38;_
"&#60;/msExchHomeServerName&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;mDBUseDefaults&#62;"&#38;oUser.mDBUseDefaults&#38;_
"&#60;/mDBUseDefaults&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;Warning&#62;"&#38;oUser.mDBStorageQuota&#38;"&#60;/Warning&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;SendLimit&#62;"&#38;oUser.mDBOverQuotaLimit&#38;"&#60;/SendLimit&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;MailNickname&#62;"&#38;oUser.mailNickname&#38;"&#60;/MailNickname&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;Mail&#62;"&#38;oUser.mail&#38;"&#60;/Mail&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;ProxyAddresses&#62;"&#38;vbNewLine 
       If IsArray(oUser.proxyAddresses) Then
        For Each present In oUser.proxyAddresses
        sData = sData &#38; "&#60;ProxyAddress&#62;"&#38;present&#38;"&#60;/ProxyAddress&#62;"&#38;vbNewLine
        Next
       Else
        sData = sData &#38; "&#60;ProxyAddress&#62;"&#38;oUser.proxyAddresses&#38;"&#60;/ProxyAddress&#62;"&#38;vbNewLine
       End If
      sData = sData &#38; "&#60;/ProxyAddresses&#62;"&#38;vbNewLine
      sData = sData &#38; "&#60;Groups&#62;"&#38;vbNewLine
       If IsArray(oUser.memberof) Then
        For Each present In oUser.memberof
        sData = sData &#38; "&#60;Group&#62;"&#38;present&#38;"&#60;/Group&#62;"&#38;vbNewLine
        Next
       ElseIf oUser.memberof &#60;&#62; "" Then
        sData = sData &#38; "&#60;Group&#62;"&#38;oUser.memberof&#38;"&#60;/Group&#62;"&#38;vbNewLine
       End If
      sData = sData &#38; "&#60;/Groups&#62;"&#38;vbNewLine
  Set oUser = Nothing
  rs.MoveNext
  Loop
 Else
 Call MsgBox("No User/s found in AD with those details!",16,"Status")
 End If
rs.Close
Set Rs = Nothing
Set oRoot = Nothing
Set oDomain = Nothing
Set Conn = Nothing
Set Comm = Nothing
sDomain = ""
sBase = ""
sDepth = ""
sData = Replace(sData,"&#38;","&#38;amp;")
GetUserData = sData
End Function</span></pre>
<p><span style="color:#000000;">The above code can be copied into a *.vbs file and run from the cmd line or double clicked from the file through windows explorer.</span></p>
<p>Note: The messages from the script utilize 'MSGBOX' so they are displayed rather than pushed to the command line.</p>
<p>Basicaly the code produces the base XML file in a String "sData" then a function is called that queries the relevant AD domain and using LDAP connects to the users "common name" entered in to the input box at the initiation of the script. The data is added to the sData String and then finaly written to the XML File.</p>
<p>Hope this helps!</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[PHP: Wykorzystanie LDAP]]></title>
<link>http://ostr.wordpress.com/?p=6</link>
<pubDate>Tue, 30 Sep 2008 17:50:46 +0000</pubDate>
<dc:creator>Robert</dc:creator>
<guid>http://ostr.pt-br.wordpress.com/2008/09/30/php-wykorzystanie-ldap/</guid>
<description><![CDATA[To jest zalążek artykułu&#8230;
Pracuję nad wykorzystaniem LDAP za pośrednictwem PHP. W tej chw]]></description>
<content:encoded><![CDATA[<p>To jest zalążek artykułu...</p>
<p>Pracuję nad wykorzystaniem LDAP za pośrednictwem PHP. W tej chwili testuję to rozwiązanie, ale za kilka dni będę miał pełen obraz sytuacji i wtedy rozwinę ten post. Na razie trochę...</p>
<p><strong>Resources:</strong></p>
<p><a title="LDAP" href="http://pl2.php.net/ldap" target="_blank">Lightweight Directory Access Protocol</a></p>
<p><a title="OpenLDAP" href="http://www.openldap.org/" target="_blank">OpenLDAP</a></p>
<p><a title="RFC2251-LDAP" href="http://www.faqs.org/rfcs/rfc2251.html" target="_blank">RFC2251 - Lightweight Directory Access Protocol (v3)</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[LDAP/Jira user importing: jira-ldap-userimporter]]></title>
<link>http://quimicefa.wordpress.com/?p=208</link>
<pubDate>Sun, 28 Sep 2008 18:26:17 +0000</pubDate>
<dc:creator>Alex Pérez</dc:creator>
<guid>http://quimicefa.pt-br.wordpress.com/2008/09/28/ldapjira-user-importing-jira-ldap-userimporter/</guid>
<description><![CDATA[


I&#8217;ve slightly modified the jira-ldap-userimporter script to fit my needs. This script manag]]></description>
<content:encoded><![CDATA[<dl class="wp-caption alignleft">
<dt class="wp-caption-dt"><a href="http://www.atlassian.com/software/jira/"><img class="size-full wp-image-61" title="jira_logo_small" src="http://quimicefa.wordpress.com/files/2008/06/jira_logo_small.gif" alt="JIRA - Bug tracking, issue tracking and project management software" width="111" height="30" /></a></dt>
</dl>
<p>I've slightly modified the <a href="http://confluence.atlassian.com/display/JIRA/Importing+user+from+LDAP">jira-ldap-userimporter</a> script to fit my needs. This script manages the <a href="http://www.atlassian.com/software/jira/docs/latest/ldap.html">Jira-LDAP integration</a>, by doing a LDAP query to a server and generating a Jelly Script that can run througt the <a href="http://www.atlassian.com/software/jira/docs/latest/jelly.html">Jira's Jelly Runner</a>. The goal of this modification is accepting some parameters in the ldap.properties to optionally wrap the <a href="http://www.atlassian.com/software/jira/docs/latest/jelly.html#CreateUser">&#60;jira:createUser&#62;</a> tags with a <a href="http://www.atlassian.com/software/jira/docs/latest/jelly.html#Login">&#60;jira:Login&#62;</a> tag, this way the resulting <a href="http://confluence.atlassian.com/display/KB/JSP-24195+-+Not+able+to+run+Jelly+Script+as+service">Jelly script can be run as a service</a>.</p>
<p>In my scenario there are continuously adding/removing users, so I should run the jira-ldap-userimporter with crontab and executing the output as Jelly service. I found this modification may be useful for other people.</p>
[caption id="" align="aligncenter" width="200" caption="Jelly - Jelly : Executable XML"]<a href="http://commons.apache.org/jelly/"><img src="http://commons.apache.org/jelly/images/logo.jpg" alt="Executable XML" width="200" height="74" /></a>[/caption]
<p>You can download the jar file from the <a href="http://code.google.com/p/jira-ldap-userimporter/">project's page</a>, and set the jelly.service=1, jelly.username and jelly.password in ldap.properties.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[PostMark]]></title>
<link>http://kkalev.wordpress.com/?p=30</link>
<pubDate>Sun, 28 Sep 2008 10:50:55 +0000</pubDate>
<dc:creator>kkalev</dc:creator>
<guid>http://kkalev.pt-br.wordpress.com/2008/09/28/postmark/</guid>
<description><![CDATA[After many months of straggling with hardware stability issues of our new directory service infrastr]]></description>
<content:encoded><![CDATA[<p>After many months of straggling with hardware stability issues of our new directory service infrastructure we managed to solve them and tried to actually move to using it. What we found out was that our master servers (almost identical with the read-only replicas except for Fibre Channel capabilities and disk controller on-card instead of on-board) had terrible performance compared to the read-only replicas. Talk about taking a day(!!) to create some new sub-string indexes on a 200,000 entries database.</p>
<p>We needed to find a way to consistently measure i/o performance on top of the (solaris) OS (and not just a disk read benchmark) so that we could open a case to our server manufacturer. After some searching we came across PostMark, an i/o benchmarking utility originally from NetApp. It seems that the software is not maintained anymore but you can find the source code on <a href="http://packages.debian.org/stable/utils/postmark">Debian</a>. It's only one tiny .c file so you just need to run 'gcc -o postmark postmark.c' to get things going.</p>
<p>This is the configuration i used in order to simulate a directory server instance. In general, create 20 files ranging from 5 - 30 MB's each (common index file size), only run reads and appends on them (with a 4/1 ratio) and no creates/deletes:</p>
<p><em>set location &#60;your location directory&#62;</em></p>
<p><em>set size 5000000 30000000</em></p>
<p><em>set number 20</em></p>
<p><em>set bias read 2</em></p>
<p><em>set bias create -1</em></p>
<p>The results were a bit... terrifying: Our read-only servers were actually three times faster (while having same disks and almost the same controller). It would be a nice idea to always run Postmark on your servers to see what's happening and how different servers can handle the same i/o load.</p>
<p>Read-Only Replica:<br />
2568.57 megabytes read (91.73 megabytes per second)<br />
572.20 megabytes written (20.44 megabytes per second)</p>
<p>Master Server:<br />
2568.57 megabytes read (25.69 megabytes per second) (1/3!!)<br />
572.20 megabytes written (5.72 megabytes per second) (1/4!!)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Catatan ldapsearch ke active directory]]></title>
<link>http://praban.wordpress.com/?p=82</link>
<pubDate>Fri, 26 Sep 2008 03:24:18 +0000</pubDate>
<dc:creator>praban</dc:creator>
<guid>http://praban.pt-br.wordpress.com/2008/09/26/catatan-ldapsearch-ke-active-directory/</guid>
<description><![CDATA[Contoh ldapsearch untuk melakukan query ke ldapnya Active Directory :
# ldapsearch -x -D "cn=Adminis]]></description>
<content:encoded><![CDATA[<p>Contoh ldapsearch untuk melakukan query ke ldapnya Active Directory :</p>
<p><code># ldapsearch -x -D "cn=Administrator,cn=users,dc=praban,dc=com" -b "dc=praban,dc=com" mail -h 192.168.1.5 -p 389 -W</code></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[AD-04-APPLICATION DESIGNER ]]></title>
<link>http://careeratkbs.wordpress.com/?p=35</link>
<pubDate>Mon, 22 Sep 2008 04:37:01 +0000</pubDate>
<dc:creator>careeratkbs</dc:creator>
<guid>http://careeratkbs.pt-br.wordpress.com/2008/09/22/ad-04-application-designer/</guid>
<description><![CDATA[ AD-04-APPLICATION DESIGNER

Hi,
Here the placement for Application  Designer.
Req.  ID:
Req-AD-04 -]]></description>
<content:encoded><![CDATA[<p><strong><span style="color:#cc0000;"> AD-04-APPLICATION DESIGNER</span></strong></p>
<p align="center"><span style="font-size:x-small;font-family:Arial,Helvetica,sans-serif;"><a href="http://www.jobsearchworld.com/"><img src="http://www.jobsearchworld.com/jobs2.jpg" border="0" alt="jobs" width="253" height="89" /></a></span></p>
<p>Hi,</p>
<p>Here the placement for <strong><span style="color:#660000;">Application  Designer.<br />
</span><span style="color:#ff6600;">Req.  ID:</span><br />
</strong><span style="color:#333399;">Req-AD-04 - Application  Designer<br />
</span><strong><span style="color:#008080;">Primary  Skills:<br />
</span></strong>LDAP,Database systems,Daytona data  management,SQL,UNIX and C development and web development,HTML, JavaScript,  Perl, UNIX, Linux…<br />
<strong><span style="color:#33cccc;">Secondary  Skills:<br />
</span></strong>LDAP, Windows, SQL, AWK, C, CGI..</p>
<p><strong><span style="color:#993366;">Description:<br />
</span></strong>Dynamic  Development Role with Telecom Leader! Project Name Application Designer, Fraud  Management Project Description: Global Fraud Management system which is a  continuous analytical engine and case manager that uses pattern recognition to  detect fraud.</p>
<p><strong><span style="color:#ff00ff;">Job Description: </span></strong></p>
<p>Developer will create new applications and enhance existing application using  C, CGI, JavaScript, Perl, Shell, AWK, HTML, and SQL. Only submit extremely  technically qualified candidates. Also desired:LDAPDatabase systems Daytona data  managementBasic knowledge of database systemsDesign.</p>
<p><strong><span style="color:#800080;">SQL Database  concept:</span></strong></p>
<p>Must be expert in all aspects of UNIX and C development and web  development.Responsible for development and maintenance of mission-critical  applications that support high-visibility client organizations and external  customers on a24×7x365 basis. Technical assessment will be done on candidates.  Background check will be required before the candidate can start the  assignment.</p>
<p><strong><span style="color:#cc99ff;">REQUIRED SKILLS:</span></strong></p>
<p>HTML, JavaScript, Perl, UNIX, Linux</p>
<p><strong><span style="color:#00ffff;">PREFERRED SKILLS:</span></strong></p>
<p>LDAP, Windows, SQL, AWK, C, CGI</p>
<p><span style="color:#00ccff;"><strong>Rate</strong>:</span>DOE,</p>
<p><strong><span style="color:#99cc00;">Job Type</span></strong>: Contract,</p>
<p><strong><span style="color:#008080;">Total Exp</span></strong>: 6+Yrs,</p>
<p><strong><span style="color:#ff99cc;">Duration</span>:</strong> 6+ Months,</p>
<p><strong><span style="color:#993300;">Number Of Openings</span>:</strong> 1,</p>
<p><strong><span style="color:#ff6600;">Location:</span></strong> Florham Park,  NJ</p>
<p><strong><span style="color:#ff99cc;">Contact Us:</span></strong></p>
<p><strong><span style="color:#3333ff;">KBS</span> <span style="color:#ff0000;">consultants</span></strong></p>
<p>Flat H,Kulothungan Apts,</p>
<p>No, 5 Natesan Road,</p>
<p>Ashoknagar,</p>
<p>Chennai 600 083</p>
<p>India</p>
<p>Phone: +91-44 2489 5341 / 2371 9622</p>
<p><strong><span style="color:#993366;">Visit us:</span></strong></p>
<p><strong>Email:</strong>www.kbsconsultants.com</p>
<p><a href="http://www.kbsconsultants.org.in/">www.kbsconsultants.org.in/</a></p>
<p><a href="http://www.kbsconsultants.net.in/">www.kbsconsultants.net.in/</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Asterisk 1.6.beta9 Realtime LDAP auth + Hylafax + IAXModem + Adhearsion + FlashOperator + CDR]]></title>
<link>http://zanolla.wordpress.com/?p=6</link>
<pubDate>Tue, 16 Sep 2008 23:43:12 +0000</pubDate>
<dc:creator>Caio Zanolla</dc:creator>
<guid>http://zanolla.pt-br.wordpress.com/2008/09/16/asterisk-16beta9-realtime-ldap-auth-hylafax-iaxmodem-adhearsion-flashoperator-cdr/</guid>
<description><![CDATA[Este guia pretende mostrar a configuração de um sistema de telefonia para empresas utilizando o As]]></description>
<content:encoded><![CDATA[<p>Este guia pretende mostrar a configuração de um sistema de telefonia para empresas utilizando o Asterisk* equipado de extras básicos para um sistema de pequeno a medio porte. são eles:</p>
<p>- Peers realtime utilizando LDAP.<br />
- Call Detail Record armazenado em MySQL e viewer básico em PHP<br />
- Gateway AGI para execucao de dialplan via Adhearsion (Ruby)<br />
(a execucao externa de dialplan é escolha pessoal e torna-se obrigatória dependendo da complexidade do plano de discagem)<br />
- Servidor para envio e recebimento de fax (Hylafax)<br />
- Flash Operator Panel</p>
<p>A primeira etapa compreende a configuração básica do sistema e todo o processo assume que se está logado como root.</p>
<p>Configuração básica do servidor<br />
----------------------------------------------------------------------------<br />
Configuracao de sistema baseado em Debian, especificamente Ubuntu.</p>
<p>- habilitar ssh<br />
<code># apt-get install openssh-server<br />
# echo "AllowUsers root seuusername" &#62;&#62; /etc/ssh/sshd.conf</code></p>
<p>- update do server<br />
<code># apt-get update &#38;&#38; apt-get upgrade &#38;&#38; reboot</code></p>
<p>- baixar os headers e compiladores e libs necessárias<br />
<code># apt-get install linux-headers-`uname -r` build-essential libncurses-dev ldap-utils libldap2-dev libmysqlclient15</code></p>
<p>Instalacao e configuracao do Asterisk<br />
----------------------------------------------------------------------------<br />
Uma placa Digium será configurada neste sistema e portanto algumas regras básicas devem ser respeitadas. Provavelmente estas regras se aplicam tambem a placas de outros fabricantes, e mesmo que não sejam necessárias, são boas práticas para um sistema em produção.</p>
<p>- Desativar opção de Plug and Play na bios<br />
- Desabilitar saidas seriais, paralelas, som, usb (em alguns casos pode ser necessário manter usb para que o zaptel tenha uma boa fonte de clock).<br />
- Desligar o drive de cd se houver. Desabilitar a controladora do respectivo drive.<br />
- Certificar-se de que o hd está em modo DMA. "hdparm -i"<br />
- Desabilitar ACPI no boot.<br />
- Certificar-se de que a placa digium tem seu proprio IRQ. Verifique com um "cat /proc/interrupts" e caso esteja compartilhado, tente mudar a placa de slot.<br />
- Em casos onde o Moh(music on hold) fica picotado ou metalico, desabilitar hyperthreading pode resolver. Em outros casos, desabilitar SMP tambem pode ajudar.</p>
<p>- baixar e descompactar sources do asterisk, libpri, addons e zaptel<br />
<code># wget http://downloads.digium.com/pub/asterisk/releases/asterisk-1.6.0-beta9.tar.gz<br />
# wget http://downloads.digium.com/pub/asterisk/asterisk-addons-1.6.0-beta4.tar.gz<br />
# wget http://downloads.digium.com/pub/libpri/libpri-1.4.6.tar.gz<br />
# wget http://downloads.digium.com/pub/zaptel/zaptel-1.4.11.tar.gz<br />
# tar -zxvf asterisk-1.6.0-beta9.tar.gz<br />
# tar -zxvf asterisk-addons-1.6.0-beta4.tar.gz<br />
# tar -zxvf libpri-1.4.6.tar.gz<br />
# tar -zxvf zaptel-1.4.11.tar.gz</code></p>
<p>- compilar e instalar<br />
(para habilitar bloqueio de chamada a cobrar aplique o patch disponivel 3 ou 4 posts atras. Ele é para uma versao mais antiga da libpri mas serve tbm para versoes mais novas)<br />
<code># cd libpri-1.4.6/<br />
# make &#38;&#38; make install<br />
# cd ../zaptel-1.4.11/<br />
# ./configure &#38;&#38; make &#38;&#38; make install &#38;&#38; make config<br />
# cd ../asterisk-1.6.0-beta9/</code></p>
<p>(se estiver fazendo upgrade não esqueça de apagar os modulos em: /usr/lib/asterisk/modules e suprimir "make samples" pois vai sobreescrever os arquivos de configuração)</p>
<p><code># ./configure &#38;&#38; make &#38;&#38; make install &#38;&#38; make samples</code><br />
<code># cd ../asterisk-addons-1.6.0-beta4/</code></p>
<p>inserir "CFLAGS+=-DMYSQL_LOGUNIQUEID" em cdr/Makefile<br />
inserir "#define MYSQL_LOGUNIQUEID" em cdr/cdr_addon_mysql.c</p>
<p>(se estiver fazendo upgrade nao esqueça de suprimir "make samples" pois vai sobreescrever os arquivos de configuração)</p>
<p><code># ./configure --with-mysqlclient=/usr/ &#38;&#38; make &#38;&#38; make install &#38;&#38; make samples<br />
# cd ..</code></p>
<p>- selecionar somente o modulo necessário para sua placa digium em:<br />
<code>/etc/defaults/zaptel</code></p>
<p>- configurar o hardware<br />
conteudo de /etc/zaptel.conf<br />
(consulte sua operadora para valores compatíveis)</p>
<p><code>span=1,1,0,ccs,hdb3,crc4<br />
bchan=1-15<br />
dchan=16<br />
loadzone=br<br />
defaultzone=br</code></p>
<p>Configurar Iaxmodem<br />
----------------------------------------------------------------------------</p>
<p><code># wget http://ufpr.dl.sourceforge.net/sourceforge/iaxmodem/iaxmodem-1.1.1.tar.gz<br />
# tar -zxvf iaxmodem-1.1.1.tar.gz<br />
# cd iaxmodem-1.1.1<br />
# ./build static<br />
# cp iaxmodem /usr/bin/iaxmodem<br />
# cd..<br />
# mkdir /etc/iaxmodem</code></p>
<p>-conteudo do /etc/iaxmodem/ttyIAX</code></p>
<p><code>device /dev/ttyIAX<br />
owner root:root<br />
mode 660<br />
port 45699<br />
refresh 300<br />
server 127.0.0.1<br />
peername numerodoramaliax<br />
secret senhaparaoramaliax<br />
cidname IAX Modem 1<br />
cidnumber numerodoramaliax<br />
codec slinear</code></p>
<p>-servico de iax em /etc/event.d/iax<br />
(em sistemas mais antigos utilizar o /etc/inittab)</p>
<p><code>start on runlevel 2<br />
start on runlevel 3<br />
start on runlevel 4<br />
start on runlevel 5<br />
stop on runlevel 0<br />
stop on runlevel 1<br />
stop on runlevel 5<br />
stop on runlevel 6<br />
respawn<br />
exec /usr/bin/iaxmodem ttyIAX&#38;&#62; /var/log/iaxmodem-ttyIAX</code></p>
<p>-servico de fax em /etc/event.d/fax<br />
(em versoes antigas utilizar o /etc/inittab)</p>
<p><code>start on runlevel 2<br />
start on runlevel 3<br />
start on runlevel 4<br />
start on runlevel 5<br />
stop on runlevel 0<br />
stop on runlevel 1<br />
stop on runlevel 5<br />
stop on runlevel 6<br />
respawn<br />
exec /usr/local/sbin/faxgetty ttyIAX<br />
</code><br />
- conteudo de /etc/asterisk/iax2.conf</p>
<p><code>[general]<br />
bindaddr=127.0.0.1:4569<br />
allow=all<br />
disallow=g723.1<br />
disallow=gsm<br />
disallow=lpc10<br />
allow=ulaw<br />
allow=alaw<br />
jitterbuffer=no<br />
forcejitterbuffer=no<br />
autokill=yes<br />
codecpriority=host<br />
tos_audio=0xB8<br />
[888]<br />
username=numerodoramaliax<br />
type=friend<br />
secret=senhaparaoramaliax<br />
qualify=no<br />
notransfer=yes<br />
host=dynamic<br />
context=local<br />
callerid="Fax Corporativo"<br />
allow=all<br />
disallow=lpc10          ; Icky sound quality...  Mr. Roboto.<br />
disallow=gsm<br />
allow=ulaw<br />
allow=alaw</code></p>
<p>Configurar Exim e HylaFax<br />
----------------------------------------------------------------------------</p>
<p>- baixar e instalar exim4<br />
<code># apt-get install exim4</code></p>
<p>- configure o exim para utilizar seu gateway de email como smarthost<br />
<code># dpkg-reconfigure exim4-config</code></p>
<p>- baixar e instalar o Hylafax<br />
<code># apt-get install libtiff-tools libtiff4 libtiff4-dev gs<br />
# wget ftp://ftp.hylafax.org/source/hylafax-4.2.3.tar.gz<br />
# tar -zxvf hylafax-4.3.1.tar.gz<br />
# cd hylafax-4.3.1<br />
# ./configure &#38;&#38; make &#38;&#38; make install<br />
# faxsetup</code><br />
(neste ponto o configurador do hylafax entra em acao e a maioria das configuracoes deve permanecer default)</p>
<p>-configurar OpenLDAP<br />
-configurar asterisk para utilizar ldap<br />
-etcetera, etcetera, etcetera<br />
(este tutorial será atualizado e finalizado em breve)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Active Directory and ASP.NET 2.0]]></title>
<link>http://mystepstones.wordpress.com/?p=34</link>
<pubDate>Tue, 16 Sep 2008 06:24:47 +0000</pubDate>
<dc:creator>ruimelo</dc:creator>
<guid>http://mystepstones.pt-br.wordpress.com/2008/09/16/active-directory-and-aspnet-20/</guid>
<description><![CDATA[While trying to create something as simple as a forms authentication mechanism with as Active Direc]]></description>
<content:encoded><![CDATA[<p>While trying to create something as simple as a forms authentication mechanism with as Active Directory provider, I came accros a nice set of problems.</p>
<p>The main issue had to do with the actual connection to the active directory itself.</p>
<p>All done by the book and still no connection. How do you deal with this? Forget debug... you have to go lower.</p>
<p>I started by using ADSIEDIT, a tool that comes with ADAM. With this tool, you can connect and navigate a remote active directory. It worked, no problem, so there was no network problem. Opening a command prompt in the domain controller machine and executing the netstat -a command, I could see my machine connecting to the LDAP port.</p>
<p>After that I tried to run my web aplication and.. no deal. No ports oppening, no nothing.</p>
<p>I then added the following lines of code in the .cs file in order to try to undernstand if the connection was established:</p>
<p><strong>        string appName = Membership.ApplicationName;</strong></p>
<p>An exception is then thrown with the text</p>
<p><em>"System.Configuration.ConfigurationErrorsException was unhandled by user code<br />
  Message="Unable to establish secure connection with the server (C:\\bla\\bla\\WebSites\\DevelopmentWebsite\\web.config line 117)"<br />
  Source="System.Web"<br />
  BareMessage="<strong>Unable to establish secure connection with the server</strong>"<br />
  Filename="C:\\bla\\bla\\WebSites\\DevelopmentWebsite\\web.config" Line=117<br />
  StackTrace:<br />
       at System.Web.Configuration.ProvidersHelper.InstantiateProvider(ProviderSettings providerSettings, Type providerType)<br />
       at System.Web.Configuration.ProvidersHelper.InstantiateProviders(ProviderSettingsCollection configProviders, ProviderCollection providers, Type providerType)<br />
       at System.Web.Security.Membership.Initialize()<br />
       at System.Web.Security.Membership.get_ApplicationName()<br />
       at _Default.Logon_Click(Object sender, EventArgs e) in c:\bla\bla\WebSites\DevelopmentWebsite\Login.aspx.cs:line 39<br />
       at System.Web.UI.WebControls.Button.OnClick(EventArgs e)<br />
       at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)<br />
       at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)<br />
       at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)<br />
       at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)<br />
       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)<br />
"</em></p>
<p>By the time I got knocking my head against the walls, I found this information: <a href="http://support.microsoft.com/kb/321051">How to enable LDAP over SSL with a third-party certification authority</a></p>
<p>That was it... It solved my problem.</p>
<p>Here are a couple of good information on this topic. Hope they help you. They helped me :)</p>
<ul>
<li><a href="http://blogs.msdn.com/gduthie/archive/2005/08/17/452905.aspx">Active Directory and ASP.NET 2.0 Beta 2 </a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/ms998360.aspx">How To: Use Forms Authentication with Active Directory in ASP.NET 2.0</a></li>
</ul>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Access Active Directory from Sharepoint]]></title>
<link>http://ajaymatharu.wordpress.com/?p=117</link>
<pubDate>Sun, 14 Sep 2008 08:06:46 +0000</pubDate>
<dc:creator>matharuajay</dc:creator>
<guid>http://ajaymatharu.pt-br.wordpress.com/2008/09/14/access-active-directory-from-sharepoint/</guid>
<description><![CDATA[Here is the sample code thar you can use to access Active Directory details from a sharepoint site,
]]></description>
<content:encoded><![CDATA[<p>Here is the sample code thar you can use to access Active Directory details from a sharepoint site,</p>
<p>DirectoryEntry oDE;<br />
oDE = new DirectoryEntry("LDAP://&#60;ldapserver&#62;,"ADusername","ADpassword",AuthenticationTypes.Secure);</p>
<p>DirectoryEntry de = oDE;</p>
<p>DirectorySearcher deSearch = new DirectorySearcher();</p>
<p>deSearch.Filter = "(&#38;(objectClass=user)(SAMAccountName=" + SPContext.Current.Web.CurrentUser.LoginName + "))";</p>
<p>deSearch.SearchScope = SearchScope.Subtree;</p>
<p>SearchResult results = deSearch.FindOne();</p>
<p>if (!(results == null))<br />
{<br />
de = new DirectoryEntry(results.Path,"AD username","AD password",AuthenticationTypes.Secure);</p>
<p>//if you know the propertyname you want to get value from you can use this<br />
de.Properties["propertyname"].ToString();</p>
<p>//this code will loop thru all the properties in active directory<br />
ResultPropertyCollection propertiesCollection;</p>
<p>propertiesCollection = results.Properties;</p>
<p>//loop thru all the properties in AD<br />
foreach (string currentProperty in propertiesCollection.PropertyNames)<br />
{</p>
<p>Response.Write("Property Name: " + currentProperty);</p>
<p>//loop thru all the sub properties<br />
foreach (Object thisCollection in propertiesCollection[currentProperty])<br />
{</p>
<p>Response.Write(thisCollection.ToString() + "&#60;br/&#62;");<br />
}<br />
}<br />
}</p>
<p>The above code reads and writes the values of the properties from the Active directory for the current user.<br />
But to be able to run the above code you need to make sure that you import System.DirectoryServices,<br />
&#60;%@ Import Namespace="System.DirectoryServices" %&#62;<br />
Also you need to make sure Web.config has an entry for the System.DirectoryServices in its Assemblies Section,</p>
<p>&#60;assemblies&#62;<br />
&#60;add assembly="System.DirectoryServices, Version=2.0.0.0,<br />
Culture=neutral, PublicKeyToken=b77a5c561934e089" /&#62;<br />
&#60;/assemblies&#62;</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Who's got that e-mail address?!]]></title>
<link>http://graycat.wordpress.com/?p=116</link>
<pubDate>Tue, 09 Sep 2008 15:22:16 +0000</pubDate>
<dc:creator>graycat</dc:creator>
<guid>http://graycat.pt-br.wordpress.com/2008/09/09/whos-got-that-e-mail-address/</guid>
<description><![CDATA[Don&#8217;t you just hate it when you go to add a custom e-mail address to either an account or publ]]></description>
<content:encoded><![CDATA[<p>Don't you just hate it when you go to add a custom e-mail address to either an account or public folder only to find out that it's already in use and not in your documentation?! You go to add this new custom requested address (usually requested by a marketing department for some reason or other that must make sense during a long liquid lunch) but are confronted with a lovely pop-up error message like this:</p>
<blockquote><p>This email address aready exists in this organization.</p>
<p>ID no: XXXXXXX Exchange System Manager</p></blockquote>
<p>Indeed that's not the most useful of error messages I've ever run across .... can you actually run over error messages? Interesting thought but I digress!</p>
<p>Being the concentious admin cat that you are, you'll not let the rest there but will want to know how to find where it is in use. Doing this manually in your average SME will mean checking hundreds off user accounts and god forbid you are using mail enable public folders! You could be there until the end of time and still not find the darn thing.</p>
<p>Well here's how to track down who'd in possession of that address in a nice and easy step by step guide:</p>
<ul>
<li>Open the Active Directory Users and Computers Management Console</li>
<li>Right Click on the domain &#62; Select <strong>Find</strong></li>
<li>Select <strong>Custom Search</strong> in the Find field</li>
<li>Select the <strong>Advanced</strong> tab</li>
<li>To find the entity with the email address <strong>whatever@yourdomain.com</strong> for example, enter the following in the LDAP query field:</li>
<div class="code">(<strong>proxyAddresses=smtp:whatever@yourdomain.com</strong>)</div>
<li>This will list the entity containing the email address entered.</li>
</ul>
<p>If you're lucky and it is assigned to a user account then this will display clearly in the bottom box of the search and  you'll be able to open its properties from there. If you can't find where is hidden in your millions of user accounts, try using a dsquery to produce the info you need as to OU location.</p>
<p>Mail enabled public folders make things a little bit more interesting as is their usual method. Unfortunately the folder will be displayed in the bottom windows as per previously, however if you double click on it you will not get much useful information as to it's location. There should be enough info for you to apply some logic and knowledge of your own systems to find it but if you have thousands of public folders you may well be in for a long search.</p>
<p>As a bonus, I thought I'd mention that wild cards can be used within the email address (*) to return multiple matches. So if you want to view all the email addresses within the results list, select <strong>View &#62; Choose Columns...</strong> and select <strong>Proxy Address</strong> - doing this in association with the query (proxyAddresses=smtp:*@yourdomain.com) will give you a list of all entities within the organisation that have an email address, together with all the email addresses they have.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Mostly authentication]]></title>
<link>http://idlogger.wordpress.com/?p=478</link>
<pubDate>Tue, 09 Sep 2008 12:08:50 +0000</pubDate>
<dc:creator>jbohren</dc:creator>
<guid>http://idlogger.pt-br.wordpress.com/2008/09/09/mostly-authentication/</guid>
<description><![CDATA[Ashraf Motiwala relays a statistic that %90 of all virtual directory deployments are used for authen]]></description>
<content:encoded><![CDATA[<p>Ashraf Motiwala <a href="http://identityman.blogspot.com/2008/09/vds-use-case.html">relays</a> a statistic that %90 of all virtual directory deployments are used for authentication only. If true (and I don't doubt it), this really isn't surprising. Most enterprise software doesn't support LDAP for anything but authentication, and a lot doesn't even do that.</p>
<p>As I have said repeatedly, this single biggest impediment to enterprise identity management is that enterprise software seldom supports the externalization of identity. And it's not really the vendors fault. The vendors are spending their development dollars on the features that their customers are asking for. Until customers start making externalized identity a selection criteria, the vendors are going to just do the minimum, which for many is authentication.</p>
<p>For instance in the product I currently work on, <a href="http://www.sunviewsoftware.com/">ChangeGear</a>, we support LDAP in three ways. We support authentication and user profiles via either Windows Integrated Authentication or generic LDAP. We also support AD for allowing the users to pick lists of impacted users and groups when creating or processing Change Management Requests (RFCs). Lastly we also support AD as one of the means of discovering assets to populate our CMDB.</p>
<p>There are a lot of other interesting things we could be doing with LDAP, but our customers have not expressed much interest in them.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Fix for "LDAP login failed" error when trying to install Groupwise 7 Webaccess or GWIA on SLES Linux]]></title>
<link>http://thebackroomtech.wordpress.com/?p=767</link>
<pubDate>Fri, 29 Aug 2008 19:46:28 +0000</pubDate>
<dc:creator>Julie</dc:creator>
<guid>http://thebackroomtech.com/2008/08/29/fix-for-ldap-login-failed-error-when-trying-to-install-groupwise-7-webaccess-or-gwia-on-sles-linux/</guid>
<description><![CDATA[To fix the LDAP login failed error when trying to install Groupwise 7 Webaccess or GWIA on SLES Linu]]></description>
<content:encoded><![CDATA[<p><!--StartFragment-->To fix the <em>LDAP login failed</em> error when trying to install Groupwise 7 Webaccess or GWIA on SLES Linux:</p>
<p>Go to LDAP Group object for the server (not LDAP server object).  On the General tab, uncheck <em>Require TLS for simple binds with Password</em> &#62; OK</p>
<p>Goto LDAP server object for the server, and on the General tab press <em>Refresh NLDAP Server now</em>. </p>
<div>Install GWIA or Webaccess, and when installation is complete re-enable Require TLS for simple binds with Password and Refresh NLDAP Server.</div>
<div> </div>
<div>The reason why is detailed in section 9.3.3 of the Groupwise 7 installation instructions</div>
<div><a href="http://www.novell.com/documentation/gw7/gw7_readmeus/gw7_readmeus.html">http://www.novell.com/documentation/gw7/gw7_readmeus/gw7_readmeus.html</a></div>
<div> </div>
<p>During installation, the WebAccess Installation program requires access to eDirectory by way of LDAP authentication. The LDAP Group object includes an option named Require TLS for Simple Binds with Password, which is enabled by default. With this option enabled, you must provide the LDAP server's Trusted Root Certificate, which must be exported from the LDAP server, in order for LDAP authentication to take place (typically on port 636) during installation of the WebAccess.</p>
<p>Unless you already have SSL set up, an easier alternative is to disable Require TLS for Simple Binds with Passwords in ConsoleOne, which allows LDAP authentication to take place using clear text (typically on port 389), during installation of WebAccess. After disabling the option, restart eDirectory, install WebAccess, then re-enable Require TLS for Simple Binds with Password and restart eDirectory again.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Plone and LDAP support]]></title>
<link>http://destefano.wordpress.com/2008/08/26/plone-and-ldap-support/</link>
<pubDate>Tue, 26 Aug 2008 18:42:36 +0000</pubDate>
<dc:creator>John DeStefano</dc:creator>
<guid>http://destefano.pt-br.wordpress.com/2008/08/26/plone-and-ldap-support/</guid>
<description><![CDATA[Working through installing PloneLDAP, plone.app.ldap, and their dependencies for Plone, and on three]]></description>
<content:encoded><![CDATA[<p>Working through installing PloneLDAP, plone.app.ldap, and their dependencies for Plone, and on three different platforms ... I think I've got some solutions.<br />
<!--more--></p>
<h1>The problem:</h1>
<p>I'm in the middle of trying to figure out how to install Plone's LDAP support -- not use it, but just install it -- and I've run into similar problems on three different platforms: Linux (RHEL4), OS X (10.5.4), and Windows XP (actually, both 32 and 64-bit versions of XP Professional).</p>
<p>Some of the problems I've had:</p>
<ul>
<li>On OS X, I'd installed OpenLDAP (openldap) and python-ldap (py-ldap) via MacPorts (port), as well as Berkeley DB (p5-berkeleydb) but when I ran <a href="http://deesto.pastebin.com/f4b8dc5f3" target="_blank">buildout</a>, I got <a href="http://deesto.pastebin.com/f229485f">a Berkeley DB version mismatch error</a>.  I've read that setting library environment variables (LD_LIBRARY_PATH and DYLD_LIBRARY_PATH) can <a href="http://www.openldap.org/faq/data/cache/43.html" target="_blank">help alleviate this</a>, but this didn't help in my case.</li>
<li>On Linux, I'd installed OpenLDAP and python-ldap via package manager (up2date), but when I ran buildout, I got <a href="http://deesto.pastebin.com/f71fa4dbf" target="_blank">all kinds of LDAP-related errors</a>.  I found this strange, as I could use ldapsearch from the OpenLDAP installation to query LDAP servers.</li>
<li>On Windows XP, I get the same errors as in Linux.</li>
</ul>
<p>My results for installing python-ldap via easy_install:</p>
<ul>
<li>OS X: success (but this installation didn't seem to find its way into my buildout attempts)</li>
<li>Linux: failure <a href="http://deesto.pastebin.com/f61d9237e" target="_blank">with errors</a></li>
<li>Windows: failure first with time-outs, and then <a href="http://deesto.pastebin.com/f689e9d58" target="_blank">errors similar to</a> those in Linux above.</li>
</ul>
<h1>The solution (Linux version):</h1>
<p>I began to work with the problem by downloading source distributions for Linux.  I downloaded <a href="ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.3.43.tgz" target="_blank">the latest 2.3.<em>x</em> of OpenLDAP</a> (2.3.43) to <em>/usr/local/</em>, configured, then ran tests, which failed:</p>
<pre>Could not locate slapd(8)</pre>
<p>Much searching led me to an OpenLDAP FAQ-O-Matic entry on prerequisites:<br />
<a href="http://www.openldap.org/faq/data/cache/196.html" target="_blank"> http://www.openldap.org/faq/data/cache/196.html</a></p>
<p>At first glance, I was a bit puzzled by the sheer volume of prereqs listed here.  At any rate: since my buildout traceback experiences indicated that Plone buildouts seem to call for Berkeley DB support, I assumed this option in the list was one that was needed:<br />
<em> SLAPD (with BDB or HDB database)</em></p>
<p>However, the "Sleepycat" download link given in that FAQ (and elsewhere) now redirects to <a href="http://www.oracle.com/database/berkeley-db/index.html" target="_blank">an Oracle page</a>, which seems to me something of a roadblock: typically, Oracle does not provide open source software; however, according to <a href="http://www.oracle.com/technology/software/products/berkeley-db/htdocs/licensing.html" target="_blank">the licensing information for the Berkeley DB software</a>, it seems the software is provided via a dual licensing model, and it <strong>may </strong>be distributed as open source if the typical conditions are met.  And then, I assumed the version Plone users would want would be the "Berkeley DB 4.7.25, without encryption" for their platform.  Of course, Oracle uses a tricky JS script to obfuscate the download link, so a simple wget may not be obvious for some users ... that is, without this direct link:<br />
<a href="http://download.oracle.com/berkeley-db/db-4.7.25.NC.tar.gz" target="_blank"> http://download.oracle.com/berkeley-db/db-4.7.25.NC.tar.gz</a><br />
The package's installation procedure, which would be required reading without instructions like those on this page, is an HTML file buried in a sub-directory.</p>
<p>To install the Berkeley DB software, extract the tar-ball and run:</p>
<pre>cd <em>[Berkeley-DB-directory]</em>/build_unix
../dist/configure
make
make install</pre>
<p>Once installed, the libraries on my system were stored in:</p>
<pre>/usr/local/BerkeleyDB.4.7/lib</pre>
<p>Some of the text that flew past during the installation indicated that other applications might require these libraries in the LD_LIBRARY_PATH environment variable.  So I set this with:</p>
<pre>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/BerkeleyDB.4.7/lib</pre>
<p>Then the OpenLDAP installation began:</p>
<pre>./configure
make depend
make
make test  <em>#  &#60;-- these tests took a long while to complete: about 45 minutes.</em>
make install</pre>
<p>Once that had finished, I downloaded <a href="http://voxel.dl.sourceforge.net/sourceforge/python-ldap/python-ldap-2.3.5.tar.gz" target="_blank">the latest 2.3.x version of python-ldap</a> (2.3.5) from source.  After unpacking the archive, I modified the package's setup.cfg directives for <em>library_dirs</em> and <em>include_dirs</em> to point to the new OpenSSL directories:</p>
<pre>library_dirs = /usr/local/openldap-2.3<strong>.43</strong>/include/lib
include_dirs = /usr/local/openldap-2.3<strong>.43</strong>/include /usr/include/sasl</pre>
<p>Luckily, I already had SASL installed, but I'm sure it could have been installed in much the same way as the other packages.  I then ran:</p>
<pre>python setup.py build
python setup.py install</pre>
<p>... that is, of course, after ensuring that 'python' pointed to my Python 2.4 installation.</p>
<p>And then, <em>finally</em>, I had a <a href="http://deesto.pastebin.com/f35534b7b" target="_blank">successful installation of python-ldap</a>., which subsequently led to <a href="http://deesto.pastebin.com/f12132d67" target="_blank">a successful buildout installation of PloneLDAP</a> and plone.app.ldap, using <a href="http://deesto.pastebin.com/f62be074c" target="_blank">my working (final?) buildout configuration</a>.</p>
<p>That was simple, right? :P  Thanks to <a href="http://martinaspeli.net/" target="_blank">Martin Aspeli</a> for convincing me to start from scratch and try installing the necessary packages from source.</p>
<h1>The solution (OS X version):</h1>
<p>As mentioned above, I had installed all of PloneLDAP's dependencies on OS X via 'port' packages.  I'm not sure how, but I now believe that some Python-related or LDAP-related package must have gotten screwed up, or the wrong version had gotten installed.</p>
<p>Fixing this meant starting my Python 2.4 installation over from scratch: uninstalling it, and all its dependencies, and then re-installing only Python itself and the specific, related ports I needed in order to get Plone and its LDAP support up and running.  For me, the eventual command I found for the uninstall was:</p>
<pre>sudo port uninstall py-numeric py-elementtree py-altgraph py-bdist_mpkg \
 py-macholib py-setuptools py-pil py-ldap python24 py-elementtree \
 py-setuptools py-numeric py-game</pre>
<p>And the re-install was simply:</p>
<pre>sudo port install python24 py-setuptools py-pil py-ldap</pre>
<p>I may need to re-install some of the other ports at some point, but I don't need them at the moment.</p>
<p>Once I did this, and once I ensured that my port's version of Python 2.4 was considered the system version, <a href="http://deesto.pastebin.com/f62be074c" target="_blank">my working (final?) buildout configuration</a> worked nicely.</p>
<p>Thanks to 'DigitalD' (Michael Dunlap) for the inspiration to look into exactly what ports were installed, tear down the related ports, and re-install them from scratch.</p>
<h1>The solution (Windows version):</h1>
<p>This remains a mystery.  It's simple enough in a *NIX environment to install packages from source, but Windows is an entirely different story: one needs either to rely upon third-party binary installers for important software components (like OpenLDAP), or install a UNIX pseudo-environment in order to compile one's own binaries from source.  And even then, troubleshooting problems is tricky.</p>
]]></content:encoded>
</item>

</channel>
</rss>
