CloudFlare suffered a massive security issue affecting all of its customers, including Rosetta Code. All passwords not changed since February 19th 2017 have been expired, and session cookie longevity will be reduced until late March.--Michael Mol (talk) 05:15, 25 February 2017 (UTC)

Active Directory/Connect

From Rosetta Code
Task
Active Directory/Connect
You are encouraged to solve this task according to the task description, using any language you may know.

The task is to establish a connection to an Active Directory or Lightweight Directory Access Protocol server.

AutoIt[edit]

Works with: AutoIt
 #include <AD.au3>
_AD_Open()

AutoHotkey[edit]

Works with: AutoHotkey_L
Translation of: VBScript
objConn := CreateObject("ADODB.Connection")
objCmd := CreateObject("ADODB.Command")
objConn.Provider := "ADsDSOObject"
objConn.Open()

C[edit]

With OpenLDAP:

#include <ldap.h>
...
char *name, *password;
...
LDAP *ld = ldap_init("ldap.somewhere.com", 389);
ldap_simple_bind_s(ld, name, password);
... after done with it...
ldap_unbind(ld);

C#[edit]

 
// Requires adding a reference to System.DirectoryServices
var objDE = new System.DirectoryServices.DirectoryEntry("LDAP://DC=onecity,DC=corp,DC=fabrikam,DC=com");
 


ColdFusion[edit]

 
<cfldap
server = "#someip#"
action="query"
start="somestart#"
username = "#someusername#"
password = "#somepassowrd#"
name = "results"
scope="subtree"
attributes = "#attributeslist#"
>
 


Erlang[edit]

This needs a test case. Is there a LDAP server available?

 
-module(ldap_example).
-export( [main/1] ).
 
main( [Host, DN, Password] ) ->
{ok, Handle} = eldap:open( [Host] ),
ok = eldap:simple_bind( Handle, DN, Password ),
eldap:close( Handle ).
 

Java[edit]

Translation of: NetRexx
import java.io.IOException;
 
import org.apache.directory.ldap.client.api.LdapConnection;
import org.apache.directory.ldap.client.api.LdapNetworkConnection;
import org.apache.directory.shared.ldap.model.cursor.EntryCursor;
import org.apache.directory.shared.ldap.model.entry.Entry;
import org.apache.directory.shared.ldap.model.exception.LdapException;
import org.apache.directory.shared.ldap.model.message.SearchScope;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class RDirectoryLDAP {
 
static final Logger log_;
private static final String ldapHostName;
private static final int ldapPort;
private static LdapConnection connection;
 
static {
log_ = LoggerFactory.getLogger(RDirectoryLDAP.class);
connection = null;
ldapHostName = "localhost";
ldapPort = 10389;
}
 
public static void main(String[] args) {
try {
if (log_.isInfoEnabled()) { log_.info("LDAP Connection to " + ldapHostName + " on port " + ldapPort); }
connection = new LdapNetworkConnection(ldapHostName, ldapPort);
 
try {
if (log_.isTraceEnabled()) { log_.trace("LDAP bind"); }
connection.bind();
 
if (log_.isTraceEnabled()) { log_.trace("LDAP unbind"); }
connection.unBind();
}
catch (LdapException lex) {
log_.error("LDAP Error", lex);
}
catch (IOException ex) {
log_.error("I/O Error", ex);
}
}
finally {
if (log_.isTraceEnabled()) { log_.trace("LDAP close connection"); }
try {
if (connection != null) {
connection.close();
}
}
catch (IOException ex) {
log_.error("I/O Error on connection.close()", ex);
}
}
 
return;
}
}

Kotlin[edit]

 
import org.apache.directory.api.ldap.model.exception.LdapException
import org.apache.directory.ldap.client.api.LdapNetworkConnection
import java.io.IOException
import java.util.logging.Level
import java.util.logging.Logger
 
class LDAP(map: Map<String, String>) {
fun run() {
var connection: LdapNetworkConnection? = null
try {
if (info) log.info("LDAP Connection to $hostname on port $port")
connection = LdapNetworkConnection(hostname, port.toInt())
 
try {
if (info) log.info("LDAP bind")
connection.bind()
} catch (e: LdapException) {
log.severe(e.toString())
}
 
try {
if (info) log.info("LDAP unbind")
connection.unBind()
} catch (e: LdapException) {
log.severe(e.toString())
}
} finally {
try {
if (info) log.info("LDAP close connection")
connection!!.close()
} catch (e: IOException) {
log.severe(e.toString())
}
}
}
 
private val log = Logger.getLogger(LDAP::class.java.name)
private val info = log.isLoggable(Level.INFO)
private val hostname: String by map
private val port: String by map
}
 
fun main(args: Array<String>) = LDAP(mapOf("hostname" to "localhost", "port" to "10389")).run()
 

NetRexx[edit]

Uses the Apache LDAP API, connecting to a local ApacheDS LDAP directory server.

/* NetRexx */
options replace format comments java crossref symbols binary
 
import org.apache.directory.ldap.client.api.LdapConnection
import org.apache.directory.ldap.client.api.LdapNetworkConnection
import org.apache.directory.shared.ldap.model.exception.LdapException
import org.slf4j.Logger
import org.slf4j.LoggerFactory
 
class RDirectoryLDAP public
 
properties constant
log_ = LoggerFactory.getLogger(RDirectoryLDAP.class)
 
properties private static
connection = LdapConnection null
 
method main(args = String[]) public static
ldapHostName = String "localhost"
ldapPort = int 10389
 
if log_.isInfoEnabled() then log_.info("LDAP Connection to" ldapHostName "on port" ldapPort)
connection = LdapNetworkConnection(ldapHostName, ldapPort)
 
do
if log_.isTraceEnabled() then log_.trace("LDAP bind")
connection.bind()
 
if log_.isTraceEnabled() then log_.trace("LDAP unbind")
connection.unBind()
catch lex = LdapException
log_.error("LDAP Error", Throwable lex)
catch iox = IOException
log_.error("I/O Error", Throwable iox)
finally
do
if connection \= null then connection.close()
catch iox = IOException
log_.error("I/O Error on connection.close()", Throwable iox)
end
end
 
return
 

Sample log4j.xml configuration file:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss}] %-5p [%c] - %m%n" />
</layout>
</appender>
 
<!-- with these we'll not get innundated when switching to DEBUG -->
<logger name="org.apache.directory.shared.ldap.name">
<level value="warn" />
</logger>
<logger name="org.apache.directory.shared.codec">
<level value="warn" />
</logger>
<logger name="org.apache.directory.shared.asn1">
<level value="warn" />
</logger>
 
<root>
<level value="info" />
<appender-ref ref="stdout" />
</root>
</log4j:configuration>
 

Output:

[08:40:05] INFO  [RDirectoryLDAP] - LDAP Connection to localhost on port 10389

Perl[edit]

LDAP Modules

 
use Net::LDAP;
 
my $ldap = Net::LDAP->new('ldap://ldap.example.com') or die $@;
my $mesg = $ldap->bind( $bind_dn, password => $bind_pass );
 

PHP[edit]

PHP LDAP Reference

<?php
$ldap = ldap_connect($hostname, $port);
$success = ldap_bind($ldap, $username, $password);

PicoLisp[edit]

(unless (=0 (setq Ldap (native "libldap.so" "ldap_open" 'N "example.com" 389)))
(quit "Can't open LDAP") )
 
(native "libldap.so" "ldap_simple_bind_s" 'I Ldap "user" "password")

Python[edit]

Works with: Python version 2.6
Library: python-ldap

python-ldap Documentation

import ldap
 
l = ldap.initialize("ldap://ldap.example.com")
try:
l.protocol_version = ldap.VERSION3
l.set_option(ldap.OPT_REFERRALS, 0)
 
bind = l.simple_bind_s("[email protected]", "password")
finally:
l.unbind()
 

Racket[edit]

This version uses the ldap package, and was tested against OpenLDAP (with real values):

#lang racket
(require net/ldap)
(ldap-authenticate "ldap.somewhere.com" 389 "uid=username,ou=people,dc=somewhere,dc=com" password)
Translation of: C

This is a direct translation of the C code -- I have no idea how to try it out since I don't have a working ldap server... So take it as a stub that waits for someone who can try it to do so. (And it's a low level thing anyway, there's an ldap package for Racket which I can't try for a similar reason.)

#lang racket
 
(require ffi/unsafe ffi/unsafe/define)
 
(define-ffi-definer defldap (ffi-lib "libldap"))
(defldap ldap_init (_fun _string _int -> _pointer))
(defldap ldap_unbind (_fun _pointer -> _void))
(defldap ldap_simple_bind_s (_fun _pointer _string _string -> _int))
(defldap ldap_err2string (_fun _int -> _string))
 
(define name ...)
(define password ...)
(define ld (ldap_init "ldap.somewhere.com" 389))
(ldap_simple_bind_s ld name password)
 
(ldap_unbind ld)

Ring[edit]

 
see system("dir") + nl
 

Ruby[edit]

Similar to Tcl, assume the AD server talks LDAP.

There are many Ruby LDAP packages ([1]) -- this solution uses Net::LDAP ("Pure Ruby LDAP Tools" on RubyForge, gem name "ruby-net-ldap")

Library: RubyGems
require 'rubygems'
require 'net/ldap'
ldap = Net::LDAP.new(:host => 'ldap.example.com', :base => 'o=companyname')
ldap.authenticate('bind_dn', 'bind_pass')

Run BASIC[edit]

print shell$("dir") ' shell out to the os and print it

smart BASIC[edit]

-- Scott A. Rossell, 12-31-16

smart BASIC uses three separate commands to list the current directory, folder and files respectively.

PRINT "Current directory: ";CURRENT_DIR$()
PRINT
PRINT "Folders:"
PRINT
DIR "/" LIST DIRS a$,c
FOR n = 0 TO c-1
PRINT ,a$(n)
NEXT n
PRINT
PRINT "Files:"
PRINT
DIR "/" LIST FILES a$,c
FOR n = 0 TO c-1
PRINT ,a$(n)
NEXT n

Tcl[edit]

This does not use SSPI/Kerberos yet, so your AD would need to allow simple ldap access.

package require ldap
set conn [ldap::connect $host $port]
ldap::bind $conn $user $password

VBScript[edit]

Creating the normal connection to AD

Set objConn = CreateObject("ADODB.Connection")
Set objCmd = CreateObject("ADODB.Command")
objConn.Provider = "ADsDSOObject"
objConn.Open