Hi,
How can I read Active Directory ?
Active Directory
- Otto
- Posts: 6403
- Joined: Fri Oct 07, 2005 7:07 pm
- Has thanked: 24 times
- Been thanked: 2 times
- Contact:
Re: Active Directory
Hello Natter,
Maybe you can't run Powershell scripts with shellexec?
Then save the values to disk and read with memoread().
Best regards,
Otto
Maybe you can't run Powershell scripts with shellexec?
Then save the values to disk and read with memoread().
Best regards,
Otto
********************************************************************
mod harbour - Vamos a la conquista de la Web
modharbour.org
https://www.facebook.com/groups/modharbour.club
********************************************************************
mod harbour - Vamos a la conquista de la Web
modharbour.org
https://www.facebook.com/groups/modharbour.club
********************************************************************
Re: Active Directory
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
- Rick Lipkin
- Posts: 2668
- Joined: Fri Oct 07, 2005 1:50 pm
- Location: Columbia, South Carolina USA
Re: Active Directory
Natter
Active Directory looks very much like any Sql Database ... here is how I access Active DIrectory
I use this code as an Employee look up to attach their AD name to a Computer or laptop .. Hope this helps
Rick Lipkin
Active Directory looks very much like any Sql Database ... here is how I access Active DIrectory
Code: Select all | Expand
//----------------------
Func _UserGet( cMode,cAdFind,oAdFind,cUserId,oUserId,cFullName,oFullName,cLname,oLname,cFname,oFname,cPhone,oPhone,cFrom,cDomain,;
oButt1,oButt2,oButt3,oButt4,oButt5,oButt6)
Local oDLG,oLBX,lOk3
Local oRsAd,oCn,cConnect,cSql,oErr
Local oProp,oRs
Local aData,aHead,nI,aReg
Local oBtn1,oBtn2
Local Saying,cValue
If cMode = "V"
Return(.t.)
Endif
If cMode = "R" .and. cUserId = "All"
If cFrom = "BUTTON"
Else
Return(.t.)
Endif
Endif
If empty( cFrom )
cFrom := "FIELD"
Endif
If Empty( cDomain )
Saying := "Sorry .. the Domain Name has not been defined"
Msginfo( Saying )
Return(.f.)
Endif
If cFrom = "FIELD"
cAdFind := alltrim( oAdFInd:GetText() )
Endif
If empty(cAdFind) .or. cAdFind = " "
cAdFInd:= "Bogus"
Endif
// make sure there are no illegal charactors
If _NameCHk( cAdFind,.t.)
Else
cAdFInd := Space(35)
oAdFind:ReFresh()
oAdFInd:SetFocus()
Return(.f.)
Endif
cDomain := "LDAP://"+alltrim(cDomain) // cDomain is the name of your Domain e.g. SC.DHEC.Gov
cConnect := "Active Directory Provider"
oCn := CREATEOBJECT( "ADODB.Connection" )
oCn:Provider := 'ADsDSOObject'
TRY
oCn:Open( cConnect )
CATCH oErr
Saying := "Could not open a Global Connection to Domain "+cDomain
MsgInfo( Saying )
RETURN(.F.)
END TRY
*msginfo( "Connection Established" )
oRs := TOleAuto():new("ADODB.Command")
oRs:ActiveConnection := oCn
cSQL := "SELECT "
cSql += " telephoneNumber,"
cSql += " displayName," // fullname
cSql += " sAMAccountname," // userid
cSql += " sn," // last name sn
cSql += " givenname" // first name
cSql += ""
cSql += " FROM '"+cDomain+"'"
cSql += " WHERE objectCategory = 'person' AND"
cSql += " objectClass = 'user' "
DO Case
Case cAdFind = "Bogus"
// do nothing .. full table scan
OtherWise
cSql += " and displayname = '*"+alltrim(cAdFind)+"*' "
End DO
cSql += " ORDER BY displayName"
oRs:CommandText := cSql //cString + cWhere
oProp := oRs:Properties( 'SearchScope' )
oProp:value := ADS_SCOPE_SUBTREE
oProp := oRs:Properties( 'Page size' )
oProp:value := 2000
Try
oRsAd := oRs:Execute()
Catch oErr
Msginfo( "LDAP Query Execution Error")
oCN:CLose()
Return(.f.)
End Try
aData := {}
aHead := {}
// generate xBrowse headings
nFields := oRsAd:Fields:Count()
For nI := 0 TO nFields - 1
Aadd( aHead, oRsAd:Fields(nI):name )
Next
nLen := oRsAd:RecordCount()
IF nLen > 0
oRsAd:MoveFirst()
Do WHILE .not. oRsAd:Eof()
aReg := {}
For nI := 1 TO Len(aHead)
Aadd( aReg, oRsAd:Fields( aHead[nI] ):value )
NEXT
If empty( aReg[1]) .or. aReg[1] = " "
Else
Aadd( aData, aReg )
ENdif
oRsAd:MoveNext()
Enddo
Else
Msginfo( "No LDAP Data found" )
oRsAd:CLose()
oCN:CLose()
Return(.f.)
Endif
LightGreyGrad()
If cMode = "R"
Else
oButt1:Disable()
oButt2:Disable()
oButt3:Disable()
oButt4:Disable()
oButt5:Disable()
oButt6:Disable()
Endif
lOk3 := .f.
DEFINE DIALOG oDlg RESOURCE "USERSLCT" ;
TITLE "User LDAP Look Up Table" ;
REDEFINE xBROWSE oLBX ;
ARRAY aData ;
HEADERS "FirstName", ;
"LastName", ;
"UserId", ;
"FullName", ;
"Phone" ;
COLSIZES 97,97,97,150 ;
ID 111 of oDlg ;
AUTOSORT AUTOCOLS LINES CELL
oLbx:lHScroll := .f. // turn off horiz scroll bar
oLbx:lRecordSelector := .f.
oLbx:nMarqueeStyle := MARQSTYLE_HIGHLROW
oLbx:bLDblClick := { |nRow,nCol | (lOk3 := .t.,oDlg:End()) }
_BrowColor(oLbx)
REDEFINE BTNBMP oBtn1 ID 113 of oDlg ;
RESOURCE "OK", "DOK", "DOK" ;
PROMPT "&Ok" LEFT 2007;
ACTION (lok3 := .t., oDlg:End() )
REDEFINE BTNBMP oBtn2 ID 112 OF oDlg ;
RESOURCE "CANCEL", "DCANCEL", "DCANCEL" ;
PROMPT "&Cancel" LEFT 2007;
ACTION ( lOk3 := .f.,oDlg:End())
ACTIVATE DIALOG oDlg;
ON INIT ( oDlg:Move(100,400)) ; //, oLbx:SetFocus() );
VALID(!GETKEYSTATE( 27 ))
If lOk3 = .t.
cFname := If(empty(oLbx:aCols[ 1 ]:Value),space(15),;
substr(oLbx:aCols[ 1 ]:Value+space(15),1,15))
cLname := If(empty(oLbx:aCols[ 2 ]:Value),space(15),;
substr(oLbx:aCols[ 2 ]:Value+space(15),1,15))
cUserId := If(empty(oLbx:aCols[ 3 ]:Value),space(25),;
substr(oLbx:aCols[ 3 ]:Value+space(25),1,25))
cFullName := If(empty(oLbx:aCols[ 4 ]:Value),space(35),;
substr(oLbx:aCols[ 4 ]:Value+space(35),1,35))
cPhone := If(empty(oLbx:aCols[ 5 ]:Value),space(20),;
substr(oLbx:aCols[ 5 ]:Value+space(20),1,20))
cAdFind := space(35)
If .not. empty(oUserId)
oUserId:ReFresh()
Endif
If .not. empty(oFullName)
oFullName:ReFresh()
Endif
If .not. empty(oLname)
oLname:ReFresh()
Endif
If .not. empty(oFname)
oFname:ReFresh()
Endif
If .not. empty( oPhone )
oPhone:ReFresh()
Endif
oAdFind:ReFresh()
ELse
cAdFind := space(35)
oAdFind:ReFresh()
Endif
If cMode = "R"
Else
oButt1:Enable()
oButt2:Enable()
oButt3:Enable()
oButt4:Enable()
oButt5:Enable()
oButt6:Enable()
ENdif
LightGreenGrad()
oRsAd:CLose()
oCN:CLose()
RETURN( Lok3 )
Code: Select all | Expand
UserSLct.RC
// Generated by ResEdit 1.6.6
// Copyright (C) 2006-2015
// http://www.resedit.net
#include <windows.h>
#include <commctrl.h>
//#include <richedit.h>
//#include "resource.h"
//
// Dialog resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
USERSLCT DIALOG 218, 4294967278, 324, 228
STYLE DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_POPUP
FONT 8, "Arial"
{
CONTROL "&Ok", 113, "TBtnBmp", 0x50010020, 232, 195, 41, 25, 0x00000000
CONTROL "", 111, "TXBrowse", 0x50A10000, 4, 1, 315, 180, 0x00000000
CONTROL "&Cancel", 112, "TBtnBmp", 0x50010020, 276, 195, 41, 25, 0x00000000
Code: Select all | Expand
Func LightGreyGrad()
SetDlgGradient( { { .50, nRGB( 216, 216, 216 ), nRGB( 255, 255, 255 ) } } )
Return(nil)
//--------------
Func LightGreenGrad()
SetDlgGradient( { { .50, nRGB(210,235,216), nRGB( 255, 255, 255 ) } } )
Return(nil)
I use this code as an Employee look up to attach their AD name to a Computer or laptop .. Hope this helps
Rick Lipkin
Last edited by Rick Lipkin on Fri Oct 15, 2021 6:45 pm, edited 1 time in total.