Powershell - 查找调用脚本的用户
问题描述:
我有一个脚本(我们称之为myPSScript.ps1),它接受两个参数并执行预定义的步骤。脚本位于人员登录并执行脚本的Windows Server框中。支持两个用户在给定的时间登录。Powershell - 查找调用脚本的用户
我想找出谁调用了脚本。
(Get-WmiObject -Class Win32_Process | Where-Object {$_.ProcessName -eq 'explorer.exe'}).GetOwner() | Format-Table Domain, User
这适用于当前用户登录并尝试运行脚本。但是如果我在计划任务中有一个批处理文件并运行相同的脚本呢?
在这种情况下,同样的命令返回一个null异常,因为没有人登录到机器中。
有没有办法找出哪个/哪个进程调用了powershell脚本。我隐约记得Start-Transcript记录哪些用户的命令运行等,所以这应该是可能的?
谢谢! Sanjeev
答
有趣的问题。我写了一个脚本,用三种不同的方式来获得用户,像这样:
([Environment]::UserDomainName + "\" + [Environment]::UserName) | out-file test.txt
"$env:userdomain\$env:username" | out-file -append test.txt
[Security.Principal.WindowsIdentity]::GetCurrent().Name | out-file -append test.txt
notepad test.txt
保存为test.ps1并把它称为使用runas
为:
runas /user:domain\user "powershell e:\test.ps1"
而且我得到了域\用户的所有三次输出。使用runas
来区分我以(我!!)身份登录的用户和运行它的域\用户。所以它确实给了正在运行脚本的用户。
完美。这也适用于使用来自不同机器和不同用户的Invoke-Command触发脚本 - 这正是我正在寻找的。现在我可以审计谁做什么,什么时候:) – Sanjeev
还有一个问题。假设一个人使用域用户登录到Windows服务器。在这种情况下,脚本给了我们域用户,但是当它被多个人使用时,这并没有帮助。终端服务管理器显示客户端名称,该名称是该用户从中连接的客户端的名称。有没有办法获得这些信息? – Sanjeev
使用PSTerminalServices模块是获取该信息的选项之一。 – Sanjeev