PHP执行多行PowerShell获取当前用户邮箱时报错:未定义变量searcher
问题:PHP调用PowerShell获取用户邮箱时提示“未定义变量searcher”
在PowerShell中执行以下多行命令可正常获取当前用户的邮箱地址:
$searcher = [ADSISearcher] "(sAMAccountName=$env:USERNAME)" $searcher.PropertiesToLoad.AddRange(@("mail")) $searcher.FindOne().Properties["mail"][0] # 输出示例:test@gmail.com
但在PHP中通过shell_exec执行类似多行命令时:
$cmd=<<<CMD $searcher = [ADSISearcher] "(sAMAccountName=$env:USERNAME)" \ $searcher.PropertiesToLoad.AddRange(@("mail")) \ $searcher.FindOne().Properties["mail"][0] CMD; print_r(shell_exec($cmd));
会出现“未定义变量searcher”的错误。
错误原因
- PHP变量解析问题:PHP的heredoc语法中,
$searcher和$env会被当作PHP变量解析,但这些变量在PHP环境中并未定义,导致传递给PowerShell的命令里原变量名被替换为空,PowerShell自然找不到$searcher变量。 - 换行处理错误:用反斜杠
\换行是CMD的语法,PowerShell不识别这种换行方式,导致命令无法正确按顺序执行。
解决方法
方法一:转义PHP heredoc中的$符号,并用分号分隔PowerShell命令
$cmd = <<<CMD \$searcher = [ADSISearcher] "(sAMAccountName=\$env:USERNAME)"; \$searcher.PropertiesToLoad.AddRange(@("mail")); \$searcher.FindOne().Properties["mail"][0] CMD; // 明确调用powershell执行命令 print_r(shell_exec("powershell -Command \"$cmd\""));
- 用
\$转义heredoc中的变量,避免PHP解析,确保PowerShell能拿到完整的变量名。 - 用分号
;分隔PowerShell命令,保证命令按顺序执行。 - 必须指定
powershell -Command,确保系统调用PowerShell而非默认的CMD。
方法二:用单引号包裹PowerShell命令
$cmd = '$searcher = [ADSISearcher] "(sAMAccountName=$env:USERNAME)"; $searcher.PropertiesToLoad.AddRange(@("mail")); $searcher.FindOne().Properties["mail"][0]'; print_r(shell_exec("powershell -Command $cmd"));
- PHP单引号内的
$不会被解析,直接传递给PowerShell。 - 同样用分号分隔多个PowerShell命令,保证执行顺序。
注意事项
- 确保运行PHP的进程有访问Active Directory的权限,否则可能无法获取到邮箱信息。
- 如果是PowerShell Core(pwsh),需要把命令中的
powershell替换为pwsh。
内容的提问来源于stack exchange,提问作者user17664547
相关产品推荐
相关产品推荐

