在Python中如何为Active Directory中的用户对象设置到期日期?

2 投票
1 回答
2414 浏览
提问于 2025-04-15 19:07

设置:我手头有用户对象,通过 win32com.client.Dispatch('ADsNameSpaces') 获取,在一个标准的Windows环境下,使用的是ActiveState Python 2.6版本。显然,Get()Put()/SetInfo() 方法是读取和写入对象属性的合适方式。我的做法是简单地将 Active Directory Cookbook 中的例子改编成Python代码。我可以设置用户对象的其他属性(比如 password, sn, givenName 等),并激活账户、将其添加到组中,但设置过期日期似乎有点问题。

在VBScript中(我知道,这就是书里的内容),你可以这样做:

objUser.AccountExpirationDate = '12/31/2010'
objUser.SetInfo

我也知道有一个单独的 accountExpires 属性。我可以执行 times = objUser.Get('accountExpires'),并得到一个包含 .HighPart.LowPart 的对象,因为我知道这些信息是内部存储的,所以我觉得我在正确的方向上。

此外,我还写了函数,可以将人类可读的日期转换为Unix纪元时间,然后再转换为64位的微软时间格式(从1601年1月1日起的100纳秒间隔;以32位的HighPart和32位的LowPart存储),如果需要的话。


失败的尝试:

1)

objUser.AcccountExpirationDate = '03/20/2010'
>>AttributeError: Property '<unknown>.AcccountExpirationDate' can not be set.

2)

objUser.Put('AccountExpirationDate', '03/20/2010')
>>  File "<COMObject <unknown>>", line 2, in SetInfo
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, u'Active Directory', u'The specified directory service attribute or value does not exist.\r\n', None, 0, -2147016694), None)

3)

times = objUser.Get('accountExpires')
print 'highpart: ' + str(times.HighPart)
# "highpart" variable computed elsewhere
times.Put('HighPart', highpart)
>>AttributeError: <unknown>.Put

对派生的 "times" 对象及其内部部分(HighPart, LowPart)的检查尝试失败:

1) 使用 dir() 来检查对象并没有帮助,显示的内容看起来都很正常。

2) 关于“Python自省指南”的文章(http://www.ibm.com/developerworks/library/l-pyint.html)虽然有趣,但没有提供更多的见解。

3) 我从 inspect 模块得到了很多令人困惑但看起来很普通的输出;没有任何内容说“嗨,把一个32位整数放进来!”

接下来我该怎么做?

1 个回答

2

我之前从来没有使用过 ADsNameSpaces 这个 COM 对象。不过看了这个例子 这里,我觉得你可以试试下面这样的写法:

objUser.AccountExpirationDate(date)

撰写回答