369 | 369 |
|
370 | 370 |
return results
|
371 | 371 |
|
|
372 |
def find_gpolocation(self, queried_username=str(), queried_groupname=str(),
|
|
373 |
queried_localgroup=str(), queried_domain=str()):
|
|
374 |
results = list()
|
|
375 |
net_requester = NetRequester(self._domain_controller, self._domain, self._user,
|
|
376 |
self._password, self._lmhash, self._nthash)
|
|
377 |
if queried_username:
|
|
378 |
try:
|
|
379 |
user = net_requester.get_netuser(queried_username=queried_username,
|
|
380 |
queried_domain=queried_domain)[0]
|
|
381 |
except IndexError:
|
|
382 |
raise ValueError('Username \'{}\' was not found'.format(queried_username))
|
|
383 |
else:
|
|
384 |
target_sid = [user.objectsid]
|
|
385 |
object_sam_account_name = user.samaccountname
|
|
386 |
object_distinguished_name = user.distinguishedname
|
|
387 |
elif queried_groupname:
|
|
388 |
try:
|
|
389 |
group = net_requester.get_netgroup(queried_groupname=queried_groupname,
|
|
390 |
queried_domain=queried_domain,
|
|
391 |
full_data=True)[0]
|
|
392 |
except IndexError:
|
|
393 |
raise ValueError('Group name \'{}\' was not found'.format(queried_groupname))
|
|
394 |
else:
|
|
395 |
target_sid = [group.objectsid]
|
|
396 |
object_sam_account_name = group.samaccountname
|
|
397 |
object_distinguished_name = group.distinguishedname
|
|
398 |
else:
|
|
399 |
raise ValueError('You must specify either a username or a group name')
|
|
400 |
|
|
401 |
if 'admin' in queried_localgroup.lower():
|
|
402 |
local_sid = 'S-1-5-32-544'
|
|
403 |
elif 'rdp' in queried_localgroup.lower():
|
|
404 |
local_sid = 'S-1-5-32-555'
|
|
405 |
elif queried_localgroup.upper().startswith('S-1-5'):
|
|
406 |
local_sid = queried_localgroup
|
|
407 |
else:
|
|
408 |
raise ValueError('The queried local group must be in \'Administrators\', ' \
|
|
409 |
'\'RDP\', or a \'S-1-5\' type SID')
|
|
410 |
|
|
411 |
object_groups = net_requester.get_netgroup(queried_username=object_sam_account_name,
|
|
412 |
queried_domain=queried_domain)
|
|
413 |
for object_group in object_groups:
|
|
414 |
object_group_sid = net_requester.get_adobject(queried_sam_account_name=object_group.samaccountname,
|
|
415 |
queried_domain=queried_domain)[0].objectsid
|
|
416 |
target_sid.append(object_group_sid)
|
|
417 |
|
|
418 |
gpo_groups = list()
|
|
419 |
for gpo_group in self.get_netgpogroup():
|
|
420 |
try:
|
|
421 |
for member in gpo_group.members:
|
|
422 |
if not member.upper().startswith('S-1-5'):
|
|
423 |
try:
|
|
424 |
member = net_requester.get_adobject(queried_sam_account_name=member,
|
|
425 |
queried_domain=queried_domain)[0].objectsid
|
|
426 |
except IndexError, AttributeError:
|
|
427 |
continue
|
|
428 |
if (member.upper() in target_sid) or (member.lower() in target_sid):
|
|
429 |
if (local_sid.upper() in gpo_group.memberof) or \
|
|
430 |
(local_sid.lower() in gpo_group.memberof):
|
|
431 |
gpo_groups.append(gpo_group)
|
|
432 |
break
|
|
433 |
except AttributeError:
|
|
434 |
continue
|
|
435 |
|
|
436 |
for gpo_group in gpo_groups:
|
|
437 |
gpo_guid = gpo_group.gponame
|
|
438 |
ous = net_requester.get_netou(queried_domain=queried_domain,
|
|
439 |
queried_guid=gpo_guid, full_data=True)
|
|
440 |
for ou in ous:
|
|
441 |
# TODO: support filters for GPO
|
|
442 |
ou_computers = [x.dnshostname for x in \
|
|
443 |
net_requester.get_netcomputer(queried_domain=queried_domain,
|
|
444 |
ads_path=ou.distinguishedname)]
|
|
445 |
gpo_location = GPOLocation(list())
|
|
446 |
setattr(gpo_location, 'objectname', object_distinguished_name)
|
|
447 |
setattr(gpo_location, 'gponame', gpo_group.gpodisplayname)
|
|
448 |
setattr(gpo_location, 'gpoguid', gpo_guid)
|
|
449 |
setattr(gpo_location, 'containername', ou.distinguishedname)
|
|
450 |
setattr(gpo_location, 'computers', ou_computers)
|
|
451 |
|
|
452 |
results.append(gpo_location)
|
|
453 |
|
|
454 |
return results
|
|
455 |
|