我将在用户盒上运行脚本,该脚本在远程服务器上执行某些操作。但是,用户将无法访问服务器,因此我将以具有权限的其他用户身份运行脚本。
我遇到困难的一点是我需要抓住已登录用户(用户名)的用户名和域名才能传递给服务器。有各种命令可以获取我需要的数据,但是当以不同的用户身份运行PowerShell ISE时,它们都返回用户数据而不是登录用户数据。
我所说的一些命令:
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$env:USERNAME
$env:USERDOMAIN
$(whoami)
唯一似乎以我想要的方式工作的是:
query user
返回格式:
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME >user1 sessionName 4 Active . 6/22/2017 2:56 PM
我的两个问题是:
答案 0 :(得分:2)
查询活动用户:
query user | Select-String '^>(\w+)' | ForEach-Object { $_.Matches[0].Groups[1].Value }
这取决于不包含空格的用户名。将/server
参数添加到query
命令以查询远程计算机。
答案 1 :(得分:1)
win32_loggedonuser拥有您在前面提供的所有信息'每个用户的财产。您需要使用字符串解析来过滤它,但它具有您正在寻找的内容。如果您想要任何其他与会话相关的信息,您可以使用“依赖”中的值。用于搜索Win32_logonsession的属性,例如logontype和starttime。
$s = (gwmi win32_loggedonuser).antecedent.split('=')
$s[1].Replace('"', '').Replace(',Name', '') ## domain
$s[2].Replace('"','') ## username
编辑:以上显示在单个用户场景中解析输出。在多用户场景中,您需要遍历结果并为每个用户执行类似操作。我的意图是提供一个例子。
edit2:Get-WmiObject上的-computername属性允许您针对远程计算机运行它 - 当然具有适当的权限。
答案 2 :(得分:1)
您可以通过WMI枚举登录的桌面用户,并按照您从query user
输出中提取的用户名过滤该列表(请参阅Bill_Stewart's answer):
$user = (& query user) -replace '^>(\S+).*', '$1'
$qry = 'SELECT * FROM Win32_Process WHERE Name="explorer.exe"'
Get-WmiObject -Query $qry | ForEach-Object {
$_.GetOwner()
} | Sort-Object -Unique User, Domain | Where-Object {
$_.User -eq $user
} | ForEach-Object {
'{0}\{1}' -f $_.Domain, $_.User
}
query user
命令列出远程桌面会话/用户,因此如果可以同时登录多个用户,则需要过滤命令的输出。
答案 3 :(得分:0)
如果您需要通过SESSIONNAME进行grep:
$userInfo = (cmd /c "query user") | Out-String -Stream
For ($i = 0; $i -le $userInfo.Count; $i++)
{
If ($($userInfo[$i]) -like "*console*")
{
$consoleUser = (($($userInfo[$i]) -Split ">")[1] -Split " ")[0]
Break
}
}