Python 使用pyad显示属性,没有获取logonHours

Python using pyad to display attributes, not getting logonHours

我一直在尝试让 logonHours 显示,同时在 Python 3.7 中使用 pyad。当我去显示 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>

使用

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

处对值进行编码有一个很好的解释

LogonHours 是一个 COM 对象。

以下是我处理 logonHours 属性的方式。在我的循环中,我检查数据类型:

import pyad.pyadutils
import win32com.client
if isinstance(v, win32com.client.CDispatch):
    value = pyad.pyadutils.convert_datetime(v)

这给了我一个可以使用的日期时间对象。希望这对某人有所帮助。

使用@LisaJ 的回答中链接的the article,这里有一些您可以使用此属性的应用程序。希望这可以帮助某人。

#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", ""))