Python использует pyad для отображения атрибутов, не получая logonHours
Я пытался получить logonHours
отображать при использовании pyad
в Python 3.7. Когда я иду, чтобы отобразить logonHours, в качестве вывода он дает мне memory at 0x0000000003049708
и т.п.
Не уверен, как отобразить эти данные. Все остальные атрибуты отображаются правильно.
from pyad import *
q = pyad.adsearch.ADQuery()
q.execute_query(
attributes= ["distinguishedName", "givenName", "userWorkstations","homeDirectory", "homeDrive", "logonHours"],
where_clause = "objectClass = '*'",
base_dn = "OU=Graphic Design Students, DC=someplace, DC=com"
)
adoutput = []
for row in q.get_results():
adoutput.append(row["distinguishedName"])
adoutput.append(row["givenName"])
adoutput.append(row["userWorkstations"])
adoutput.append(row["homeDirectory"])
adoutput.append(row["homeDrive"])
adoutput.append(row["logonHours"])
adoutput = [x for x in adoutput if x != None]
print(adoutput)
мой вывод выглядит так:
<memory at 0x0000000003049708>
<memory at 0x00000000030497C8>
<memory at 0x0000000003049888>
<memory at 0x0000000003049948>
<memory at 0x0000000003049A08>
<memory at 0x0000000003049AC8>
1 ответ
Использование
row["logonHours"].tobytes()
чтобы получить значение байта - вы увидите ту же довольно загадочную вещь, которую ADSIEdit показывает для значения атрибута.
Хитрость в том, чтобы превратить это в нечто не загадочное. Хорошее объяснение того, как значение кодируется в https://social.technet.microsoft.com/Forums/exchange/en-US/545552d4-8daf-4dd8-8291-6f088f35c2a4/how-is-the-logon-hours-attribute-set-in-active-directory-windows-server-2008-r2-?forum=winserverDS по -в-активный-каталоги-Windows-сервер-2008-R2-? Форум = winserverDS
LogonHours - это COM-объект.
Вот как я обрабатываю атрибут logonHours. В своем цикле я проверяю тип данных:
import pyad.pyadutils
import win32com.client
if isinstance(v, win32com.client.CDispatch):
value = pyad.pyadutils.convert_datetime(v)
Это дает мне объект datetime, с которым я могу работать. Надеюсь, это кому-то поможет.
Используя статью, указанную в ответе @LisaJ, вот некоторые приложения, для которых вы можете использовать этот атрибут. Надеюсь, это кому-то поможет.
#Convert the array to a list of which hours each day the account is logged in
weekList = []
for shift_1, shift_2, shift_3 in zip(*[iter(row["logonHours"].tobytes())]*3):
weekList.append(format(shift_1, '08b') + format(shift_2, '08b') + format(shift_3, '08b'))
#Total the hours for each day
totalHours = {}
for i, (shift_1, shift_2, shift_3) in enumerate(zip(*[iter(row["logonHours"].tobytes())]*3)):
totalHours[i] = len((format(shift_1, '08b') + format(shift_2, '08b') + format(shift_3, '08b')).replace("0", ""))