You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django中运行脚本遇Struct参数错误,Python中正常运行求助

解决Django中Struct()参数类型错误:AD SID转换时的问题

我之前处理AD SID转换时也碰到过一模一样的问题——纯Python脚本跑的好好的,放到Django里就报Struct() argument 1 must be string, not unicode。结合你的代码和报错信息,我来帮你捋捋原因和解决办法:

问题根源

在Python 2环境中(大概率你的Django项目用的是Python 2),struct.unpack()只接受**字节串(str类型)**作为参数,但在Django环境下,ldap库返回的objectSid切片可能被自动转换成了unicode类型——这和纯Python环境的字符串处理逻辑不一样,所以就触发了报错。你觉得切片后的值不是unicode,但实际在Django的上下文里,框架的字符串自动处理或者ldap连接的配置可能悄悄改变了数据类型。

解决方案

核心思路就是在Python 2环境下,把传给struct.unpack()的sid切片强制转换成字节串(str类型)。修改你的代码如下:

import sys
import struct
import ldap

# 你的原有连接和搜索逻辑
result = con.search_s(ldap_base, ldap.SCOPE_SUBTREE, criteria, attributes)
sid = result[0][1]["objectSid"][0]

if sys.version_info.major < 3:
    revision = ord(sid[0])
    number_of_sub_ids = ord(sid[1])
    # 关键:将切片强制转为str(字节串)
    iav_slice = str(sid[2:8])
    iav = struct.unpack('>Q', b'\x00\x00' + iav_slice)[0]
    # 处理子ID时同样做类型转换
    sub_ids = []
    for i in range(number_of_sub_ids):
        sub_slice = str(sid[8 + 4 * i:12 + 4 * i])
        sub_ids.append(struct.unpack('<I', sub_slice)[0])
else:
    revision = sid[0]
    number_of_sub_ids = sid[1]
    iav = struct.unpack('>Q', b'\x00\x00' + sid[2:8])[0]
    sub_ids = [struct.unpack('<I', sid[8 + 4 * i:12 + 4 * i])[0] for i in range(number_of_sub_ids)]

sid_str = 'S-{0}-{1}-{2}'.format(revision, iav, '-'.join([str(sub_id) for sub_id in sub_ids]))

额外排查点

如果修改后还是报错,可以检查这两个地方:

  • 查看ldap连接的配置,是否有开启自动字符串编码的选项,导致二进制的objectSid被转成了unicode;
  • 检查Django项目的settings.py里的字符串相关设置,比如DEFAULT_CHARSET是否影响了数据的类型转换。

内容的提问来源于stack exchange,提问作者Ezekiel145

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:05:26