找回密码
 加入
搜索
查看: 121|回复: 8

[AU3基础] 请问,如何在AU3中引用powershell命令,并使其自动运行?

[复制链接]
发表于 2025-1-3 09:21:49 | 显示全部楼层 |阅读模式
各位前辈,大家好!

    本人需要在AU3中引用两条powershell命令,分别是:
    Set-SmbClientConfiguration -RequireSecuritySignature $false(要求管理员权限)
    Set-SmbClientConfiguration -EnableInsecureGuestLogons $true(要求管理员权限)
    而且,这两条命令在执行过程中,均会出现如下问题:
    “确认
    是否确实要执行此操作?
    正在执行操作“Modify”(针对目标“SMB Client Configuration”)。
    [Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 暂停(S)  [?] 帮助 (默认值为“Y”):”
    此处,应回答“[Y] 是(Y)”。

    并且希望整个AU3在后台自动运行,即是无人值守的运行。

    由于对power shell命令不熟悉,特地在这里请教各位前辈,如何编写上述AU3文件?多谢各位前辈!
发表于 2025-1-3 18:34:42 | 显示全部楼层
本帖最后由 lpxx 于 2025-1-4 13:32 编辑

在AutoIt(AU3)中执行PowerShell命令,并且处理确认提示,可以通过以下步骤实现。你需要使用AutoIt的Run函数来执行PowerShell脚本,并通过管道传递输入来自动确认提示。
以下是一个示例脚本,展示了如何在AutoIt中执行你提到的两条PowerShell命令,并自动确认操作:
; 定义PowerShell命令
Global $cmd1 = 'Set-SmbClientConfiguration -RequireSecuritySignature $false -Confirm:$false'
Global $cmd2 = 'Set-SmbClientConfiguration -EnableInsecureGuestLogons $true -Confirm:$false'

; 使用 -Confirm:$false 参数来避免确认提示
Global $powershell_script = "
`$scriptBlock = {
    " & $cmd1 & ";
    " & $cmd2 & "
};
& `$scriptBlock
"

; 将PowerShell脚本保存到一个临时文件
Global $tempFile = @TempDir & '\smb_config.ps1'
FileWrite($tempFile, $powershell_script)

; 使用Run函数执行PowerShell脚本,并传递管理员权限
Global $runCmd = 'powershell -ExecutionPolicy Bypass -File "' & $tempFile & '"'
Run(@ComSpec & ' /c ' & $runCmd, '', @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)

; 等待PowerShell脚本执行完成
Local $handle = _WinWaitActive("[CLASS:ConsoleWindowClass]")
If $handle Then
    Local $result = ""
    While True
        Local $line = _StdioRead($handle + $STDOUT_CHILD)
        If @error Then ExitLoop
        $result &= $line & @CRLF
    WEnd
    _StdioClose($handle + $STDOUT_CHILD)
    _StdioClose($handle + $STDERR_CHILD)
    WinClose($handle)
    ; 打印结果(可选)
    ConsoleWrite($result)
EndIf

; 删除临时文件
FileDelete($tempFile)
解释
PowerShell命令:
使用 -Confirm:$false 参数来避免PowerShell命令的确认提示。
将两条命令合并到一个脚本块中,以便一次性执行。

临时文件:
将PowerShell脚本保存到一个临时文件中,以便通过命令行执行。

执行PowerShell脚本:
使用 Run 函数执行PowerShell脚本,并通过 @ComSpec(通常是 cmd.exe)来启动,确保以管理员权限运行。
使用 @SW_HIDE 隐藏命令行窗口。
使用 $STDOUT_CHILD + $STDERR_CHILD 捕获标准输出和标准错误。

等待脚本执行完成:
使用 _WinWaitActive 等待PowerShell窗口变为活动窗口。
使用 _StdioRead 读取输出。
关闭标准输出和标准错误流,并关闭窗口。

清理:
删除临时文件。

注意事项
管理员权限:确保AutoIt脚本以管理员权限运行,否则PowerShell命令可能无法执行。
PowerShell执行策略:脚本中使用了 -ExecutionPolicy Bypass 参数来绕过执行策略限制。在生产环境中,请考虑使用更安全的执行策略。
希望这个示例能帮助你实现无人值守的PowerShell命令执行。如果有任何问题,请随时提问!

点评

这,AI回复的吧  发表于 7 天前
 楼主| 发表于 5 天前 | 显示全部楼层
lpxx 发表于 2025-1-3 18:34
在AutoIt(AU3)中执行PowerShell命令,并且处理确认提示,可以通过以下步骤实现。你需要使用AutoIt的Run函 ...

非常感谢lpxx大佬的回复!
有代码,还有解释;使我既知其然,又知其所以然;万分感谢!

对不起,由于生病,我回复晚了,再次感谢lpxx大佬!
 楼主| 发表于 5 天前 | 显示全部楼层
lpxx 发表于 2025-1-3 18:34
在AutoIt(AU3)中执行PowerShell命令,并且处理确认提示,可以通过以下步骤实现。你需要使用AutoIt的Run函 ...

再问lpxx大佬一下,我运行的时候报错:
Global $powershell_script = "
Error:Unterminated string

似乎是
Global $powershell_script = "
`$scriptBlock = {
    " & $cmd1 & ";
    " & $cmd2 & "
};
& `$scriptBlock
"
代码段出问题,当然也可能是我的autoit版本过老。
大佬能帮助解决一下吗,谢谢了!
发表于 3 天前 | 显示全部楼层
evilwz 发表于 2025-1-6 10:19
再问lpxx大佬一下,我运行的时候报错:
Global $powershell_script = "
Error:Unterminated string

powershell我也不熟,你那个错误估计是拆开后导致的,把它合并成一行,注意单引号和双引号的补全,然后看看相应生成的脚本是否正确,依次修改,大致如此。那个回复是用AI测试回复的。
 楼主| 发表于 3 天前 | 显示全部楼层
lpxx 发表于 2025-1-8 12:16
powershell我也不熟,你那个错误估计是拆开后导致的,把它合并成一行,注意单引号和双引号的补全,然后看 ...

好的,再次感谢lpxx大佬!
 楼主| 发表于 3 天前 | 显示全部楼层
lpxx 发表于 2025-1-8 12:16
powershell我也不熟,你那个错误估计是拆开后导致的,把它合并成一行,注意单引号和双引号的补全,然后看 ...

lpxx大佬主要解决了我的两个问题:
1、使用-Confirm:$false来自动应答,自动确认。
2、使用powershell -ExecutionPolicy Bypass -File传递管理员权限。

只要这两个问题解决了,其他的问题都是小问题。

顺便说一下,开始运行一直有错误,后来发现我没有使用64位运行,这个要注意。

再次感谢lpxx大佬!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2025-1-11 17:56 , Processed in 0.090944 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表