我将在用户框上运行一个在远程服务器上工作的脚本。但是,用户将无法访问服务器,因此我将作为具有权限的其他用户运行脚本。
我遇到困难的位是我需要在用户(框用户(用户名和域上登录以传递到服务器上。有多种命令可以获取我需要的数据,但是当运行PowerShell ISE作为其他用户时,他们都返回用户数据而不是登录用户数据的数据。
我所说的一些命令:
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$env:USERNAME
$env:USERDOMAIN
$(whoami)
唯一可以按照我想要的方式工作的是:
query user
这返回:
的格式用户名SessionName ID状态空闲时间登录时间> user1 sessionname 4活动。2017年6月22日下午2:56
我的两个问题是:
- 有没有办法以这种方式获得域?运行此命令时,我看不到它。
- 有没有办法只能从查询用户中获取用户名?"主动"用户名的特异性呢?
查询活动用户:
query user | Select-String '^>(w+)' | ForEach-Object { $_.Matches[0].Groups[1].Value }
这取决于不包含空格的用户名。将/server
参数添加到query
命令中以查询远程计算机。
win32_loggedonuser拥有您在每个用户的'前提'属性中所需的所有信息。您需要使用String-parsing进行过滤它,但它具有您想要的内容。如果您需要任何其他与会话相关的信息,则可以使用"依赖"属性中的值来搜索Win32_logonsession,以查找logonType和starttime之类的东西。
$s = (gwmi win32_loggedonuser).antecedent.split('=')
$s[1].Replace('"', '').Replace(',Name', '') ## domain
$s[2].Replace('"','') ## username
编辑:以上显示在单个用户方案中解析输出。在多用户方案中,您需要循环浏览结果并为每个用户执行类似操作。我的目的是提供一个例子。
edit2:get-wmiobject上的-computername属性允许您与远程计算机一起运行此功能。
您可以通过WMI列举登录的桌面用户,并通过从query user
输出中提取的用户名来过滤该列表(请参阅Bill_stewart的答案(:
$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
命令列出了远程桌面会话/用户,因此,如果可以同时登录多个用户,则需要过滤命令的输出。
如果您需要通过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
}
}