ad_search 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/ad_search.gemspec +27 -0
- data/lib/ad_search.rb +94 -0
- data/lib/ad_search/version.rb +3 -0
- metadata +74 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/ad_search.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "ad_search/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "ad_search"
|
7
|
+
s.version = AdSearch::VERSION
|
8
|
+
s.authors = ["Neil Hoff"]
|
9
|
+
s.email = ["neilhoff@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Search Active Directory}
|
12
|
+
s.description = %q{Allows you to connect to and search your Active Directory system for users that have
|
13
|
+
not been disabled.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "ad_search"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
# specify any dependencies here; for example:
|
23
|
+
# s.add_development_dependency "rspec"
|
24
|
+
# s.add_runtime_dependency "rest-client"
|
25
|
+
s.add_development_dependency "rspec"
|
26
|
+
s.add_runtime_dependency "net-ldap"
|
27
|
+
end
|
data/lib/ad_search.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
require "ad_search/version"
|
2
|
+
|
3
|
+
module AdSearch
|
4
|
+
# Search Active Directory and get a hash in return
|
5
|
+
|
6
|
+
def initialize(user, pw, domain, host, base)
|
7
|
+
@ad_connection = connect_to_ad(user, pw, domain, host, base)
|
8
|
+
end
|
9
|
+
|
10
|
+
# Connection to Active Directory
|
11
|
+
def connect_to_ad(username, password, domain, host, base)
|
12
|
+
ldap = Net::LDAP.new :host => host,
|
13
|
+
:port => 389,
|
14
|
+
:base => base,
|
15
|
+
:auth => {
|
16
|
+
:method => :simple,
|
17
|
+
:username => username + '@' + domain,
|
18
|
+
:password => password
|
19
|
+
}
|
20
|
+
if ldap.bind
|
21
|
+
return ldap
|
22
|
+
else
|
23
|
+
raise 'authentication failed'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def search_active_users_by_username(search_term, treebase)
|
28
|
+
users = Hash.new
|
29
|
+
|
30
|
+
#Create a filter based on the username
|
31
|
+
filter = Net::LDAP::Filter.eq("sAMAccountName", search_term)
|
32
|
+
#Create a 2nd filter that makes sure we are only searching on users
|
33
|
+
filter2 = Net::LDAP::Filter.eq("objectCategory", "organizationalPerson")
|
34
|
+
#Join the filters together
|
35
|
+
joined_filter = Net::LDAP::Filter.join(filter, filter2)
|
36
|
+
|
37
|
+
count = 0
|
38
|
+
@ad_connection.search(:base => treebase, :filter => joined_filter) do |entry|
|
39
|
+
if active_account?(entry)
|
40
|
+
username = entry.sAMAccountName.to_s[2..-3]
|
41
|
+
#Split the first name and last name and remove un-needed characters
|
42
|
+
name = entry.name.to_s
|
43
|
+
name_length = name.length
|
44
|
+
name = name[2..-3].split
|
45
|
+
begin
|
46
|
+
manager = entry.manager.to_s.split(',')
|
47
|
+
manager = manager[0][5..-1]
|
48
|
+
rescue
|
49
|
+
manager = 'Manager is not set'
|
50
|
+
end
|
51
|
+
begin
|
52
|
+
title = entry.title.to_s[2..-3]
|
53
|
+
rescue
|
54
|
+
title = 'Title is not set'
|
55
|
+
end
|
56
|
+
begin
|
57
|
+
office = entry.physicaldeliveryofficename.to_s[2..-3]
|
58
|
+
rescue
|
59
|
+
office = 'Office is not set'
|
60
|
+
end
|
61
|
+
begin
|
62
|
+
email = entry.mail.to_s[2..-3]
|
63
|
+
rescue
|
64
|
+
email = 'Email is not set'
|
65
|
+
end
|
66
|
+
|
67
|
+
users[username] = {"first_name" => name[0],
|
68
|
+
"last_name" => name[1],
|
69
|
+
"username" => username,
|
70
|
+
"title" => title,
|
71
|
+
"office" => office,
|
72
|
+
"email" => email
|
73
|
+
#"manager" => manager
|
74
|
+
}
|
75
|
+
count = count + 1
|
76
|
+
end
|
77
|
+
end
|
78
|
+
return users
|
79
|
+
end
|
80
|
+
|
81
|
+
#Microsoft Active Directory's way of keeping track of time: BIGEPOCH (01/01/1970) is 116444916000000000 "100 nanosecond intervals since 01/01/1601"
|
82
|
+
BIGEPOCH = 116444916000000000
|
83
|
+
def active_account?(ad_object)
|
84
|
+
#See if account is disabled or the account is expired
|
85
|
+
tmpuac = ad_object.userAccountControl[0].to_i
|
86
|
+
if tmpuac & 2 == 2
|
87
|
+
return false
|
88
|
+
elsif ad_object.accountExpires[0].to_i != 0 and Time.now > Time.at((ad_object.accountExpires[0].to_i - BIGEPOCH) / 10000000) #Microsoft time to epoch time
|
89
|
+
return false
|
90
|
+
else
|
91
|
+
return true
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
metadata
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ad_search
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Neil Hoff
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-04-02 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &22654416 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *22654416
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: net-ldap
|
27
|
+
requirement: &22653852 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *22653852
|
36
|
+
description: ! "Allows you to connect to and search your Active Directory system for
|
37
|
+
users that have\n not been disabled."
|
38
|
+
email:
|
39
|
+
- neilhoff@gmail.com
|
40
|
+
executables: []
|
41
|
+
extensions: []
|
42
|
+
extra_rdoc_files: []
|
43
|
+
files:
|
44
|
+
- .gitignore
|
45
|
+
- Gemfile
|
46
|
+
- Rakefile
|
47
|
+
- ad_search.gemspec
|
48
|
+
- lib/ad_search.rb
|
49
|
+
- lib/ad_search/version.rb
|
50
|
+
homepage: ''
|
51
|
+
licenses: []
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options: []
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
requirements: []
|
69
|
+
rubyforge_project: ad_search
|
70
|
+
rubygems_version: 1.8.16
|
71
|
+
signing_key:
|
72
|
+
specification_version: 3
|
73
|
+
summary: Search Active Directory
|
74
|
+
test_files: []
|