找回密码
 立即注册

QQ登录

只需一步,快速开始

诗仙·1957
金牌服务用户   /  发表于:2023-4-27 10:07  /   查看:2024  /  回复:9
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); ' ...

9 个回复

倒序浏览
最佳答案
最佳答案
诗仙·1957
金牌服务用户   /  发表于:2023-4-27 10:07:46
来自 2#
本帖最后由 诗仙·1957 于 2023-4-27 15:11 编辑

已经解决了:
原来也可以单独加入域管理员身份执行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); '
    f'Rename-ADObject -Identity "{ass01}" -NewName "{ass02}" -Credential $credential'
)


修改后就可以执行了。


另外,执行命令的命令如果有多个参数,如python  c:\xx\xx.py   参数1  参数2  参数3
也可以在设置变量命令中使用char(32)来表示空格
例如="c:\xx\xx.py"&char(32)&"参数1"&char(32)&"参数2"



送上福利:活字格可以调用的python脚本之域控管理脚本





另外一个查询域组织名称列表,排除掉指定的名称,输出为json格式的命令。

pscommand = r"Get-ADOrganizationalUnit -Filter * -Properties * | Where-Object {$_.ObjectClass -eq 'organizationalUnit' -and $_.Name -notlike '*Accounts*' -and $_.Name -notlike '*Domain*' -and $_.Name -notlike '*Resources*' -and $_.Name -notlike '*Groups*' -and $_.Name -notlike '*Rosources*'} | Select-Object Name | ConvertTo-Json"


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 2金币 +71 收起 理由
Lay.Li + 5 赞一个!
Shawn.Liu + 66 赞一个!

查看全部评分

回复 使用道具 举报
Lay.Li悬赏达人认证 活字格认证
超级版主   /  发表于:2023-4-27 12:26:45
3#
大佬厉害啊
回复 使用道具 举报
amao47kiki2
初级会员   /  发表于:2023-10-10 16:41:26
4#
大佬,请问你是怎么封装为web呢?是用flask吗?请求的url是怎么来的?
回复 使用道具 举报
VVANVI悬赏达人认证
论坛元老   /  发表于:2023-10-10 17:12:56
5#
本帖最后由 VVANVI 于 2023-10-10 17:23 编辑
amao47kiki2 发表于 2023-10-10 16:41
大佬,请问你是怎么封装为web呢?是用flask吗?请求的url是怎么来的?

很明显, 他没有封装成 web 直接在服务器上用命令行执行

用flask 封装了 就不需要用 shell 执行了


他是调用服务端的 cmd.exe 执行py 文件
回复 使用道具 举报
amao47kiki2
初级会员   /  发表于:2023-10-10 17:51:51
6#
VVANVI 发表于 2023-10-10 17:12
很明显, 他没有封装成 web 直接在服务器上用命令行执行

用flask 封装了 就不需要用 shell 执行了

主要是我看他一楼写的是用http调用,只有一个不成功。我不太明白。

我也试过用执行程序命令来调用py,但是如果参数含有空格,好像就报错。。。
回复 使用道具 举报
Shawn.Liu活字格认证
超级版主   /  发表于:2023-10-10 18:44:41
7#
大佬,Python技术栈这边了解不是很深入,楼主大佬上论坛后解答下您的问题,参数含有空格可以尝试使用&将空格和字符串拼接起来
回复 使用道具 举报
诗仙·1957
金牌服务用户   /  发表于:2023-10-10 21:45:43
8#
amao47kiki2 发表于 2023-10-10 17:51
主要是我看他一楼写的是用http调用,只有一个不成功。我不太明白。

我也试过用执行程序命令来调用py, ...

用chat32来表示空格,报错多半是路径与参数你搞混了,
回复 使用道具 举报
amao47kiki2
初级会员   /  发表于:2023-10-11 16:16:11
9#
诗仙·1957 发表于 2023-10-10 21:45
用chat32来表示空格,报错多半是路径与参数你搞混了,

好,有空试试。现在在测试flask,感觉web调用比较灵活点
回复 使用道具 举报
Shawn.Liu活字格认证
超级版主   /  发表于:2023-10-11 17:25:09
10#

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部