我工作的公司遇到了问题。在我们的打印服务器中,有几台打印机被成本中心分开。有多个打印机链接到同一 IP 地址,其中 Active Directory 中的特定安全组自动映射到用户。
我的问题是这样的:公司里很多用户,比如医生,总是在公司的不同部门,比如:车站、手术室、医务室。他们有很大的困难;每次他们移动到新位置时,他们都无法转到 PC 选项并将特定打印机设置为 PC 上的默认打印机。
我想要的是创建一个持续运行的 Python 代码,当用户登录域中的 PC 时,代码会识别他们的登录信息,检查他们登录的 PC 的主机名以及他们的安全组成员身份。例如:属于安全组“IMP_TIC_COLOR”的用户“igocarmona”登录到 PC“TIC0068”时会将打印机 X 设置为默认值。
这是代码草案,但我在构建它时遇到了困难。有没有人经历过这个并可以帮助我?
我已经尝试这样做了:
import os
import time
import pyad.adquery
import win32print
import socket
AD_SERVER_IP = "192.168.0.193"
PRINT_SERVER_IP = "192.168.0.230"
def check_user_login():
query = pyad.adquery.ADQuery()
query.execute_query(
type=AD_SERVER_IP,
attributes=["memberOf"],
where_clause="objectClass = 'user' AND sAMAccountName = '" + os.getlogin() + "'"
)
result = query.get_single_result()
if result:
groups = result['memberOf']
return groups
return []
def get_host_name():
return socket.gethostname()
def set_default_printer(printer_name):
printer_info = win32print.EnumPrinters(win32print.PRINTER_ENUM_CONNECTIONS, None, 1)
for printer in printer_info:
if printer_name in printer[2]:
win32print.SetDefaultPrinter(printer[2])
print("Default printer set to:", printer[2])
break
def main():
while True:
groups = check_user_login()
hostname = get_host_name()
if groups:
for group in groups:
print(group)
if "IMP_TIC_COLOR" in group and hostname.startswith("TIC"):
set_default_printer("IMP_TIC_COLOR")
time.sleep(30) # Verifica a cada 30 segundos
if __name__ == "__main__":
main()
您可以在组策略对象 (GPO) 的首选项部分中使用项目级定位。
“在单个组策略对象 (GPO) 中,您可以包含多个首选项,每个首选项都针对选定的用户或计算机进行自定义,并且每个首选项都针对 仅将设置应用于相关用户或计算机”
因此,您可以应用用户首选项,根据他们登录的计算机名称设置默认打印机。
“仅当计算机名称与目标项目中指定的计算机名称匹配时,计算机名称目标项目才允许将首选项应用于计算机或用户。”
请注意,使用项目级别定位和计算机名称选择并不意味着计算机策略,但这仍然应该是应用于用户的单个 GPO,包括多个首选项设置,以根据登录的计算机名称将不同的打印机设置为域用户的默认打印机。