1金币
本帖最后由 诗仙·1957 于 2023-4-27 10:35 编辑
python代码是:
import sys
import subprocess
import json
import os
# 判断传入的参数数量个数是否等于 4,如果不等于 4,则说明传入的参数不符合要求,需要输出提示信息并退出脚本。
if len(sys.argv) != 4:
print('你输入的参数个数不对')
sys.exit(1)
# 查询是否有日志输出文件,如果有则删除
dir_path = "C:\\python\\ad\\"
file_name = "output.txt"
if os.path.exists(os.path.join(dir_path, file_name)):
os.remove(os.path.join(dir_path, file_name))
# 设置变量,从第2个开始计算,即传入的第一个参数
username = sys.argv[1]
ass01 = sys.argv[2]
ass02 = sys.argv[3]
pscommand = f'Rename-ADObject -Identity "CN={username},OU={ass01},OU=Accounts,DC=cqdegang,DC=com" -NewName "{ass02}"'
# 执行命令
process = subprocess.Popen(['powershell', pscommand], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 读取命令输出
output, error = process.communicate()
# 如果没有任何输出日志则表示成功
success_flag = True
# 判断命令是否成功执行
if error:
error_lines = [line.decode('GB2312', errors='ignore') for line in error.splitlines() if line.strip()]
print('\n'.join(error_lines))
success_flag = False
if success_flag:
if output:
output_lines = [line.decode('GB2312', errors='ignore') for line in output.splitlines() if line.strip()]
# 将输出写入日志文件
with open('C:\\python\\ad\\output.txt', 'w', encoding='utf-8') as f:
f.write('\n'.join(output_lines))
print('\n'.join(output_lines))
else:
with open('C:\\python\\ad\\output.txt', 'w', encoding='utf-8') as f:
f.write('OK, 命令执行成功!')
print('OK, 命令执行成功!')
else:
# 将错误信息写入日志文件
with open('C:\\python\\ad\\output.txt', 'w', encoding='utf-8') as f:
f.write('\n'.join(error_lines))
print('FAIL, 命令执行失败!')
就这个一个脚本执行失败,其他的
都是成功的,
在排查过程,发现这个脚本判断日志文件output.txt是否存在,如果存在就删除,这个是执行成功的。后面的修改组织里的用户名是失败的。
如果单独在powershell里面 运行python c:\xxx\重命名组织用户名.py 参数 参数 参数 是成功的。脚本也能正常输出日志文件。
唯独通过活字格调用这个脚本 ,也没有把命令执行成功,再次去查询用户的名字没有变化。
日志提示:
Rename-ADObject : 拒绝访问
这域账户管理员权限,没道理啊
如果用活字格调用其他脚本,都是正常的,能够输出日志,好奇怪。
|
最佳答案
查看完整内容
已经解决了:
原来也可以单独加入域管理员身份执行powershell
例如:
# 设置域管理员信息
username = 'xxxxx'
password = 'xxxxx'
domain = 'xxxxxx'
# 构造 PowerShell 命令字符串
pscommand = (
f'$securePassword = ConvertTo-SecureString "{password}" -AsPlainText -Force; '
f'$credential = New-Object System.Management.Automation.PSCredential("{domain}\\{username}",$securePassword); '
...
|