我需要一种我希望在 Powershell 中执行此操作的非常简单的方法(我正在使用 Absolute Manage 远程运行 Powershell 脚本):
if ( computer is logged out )
{
<run script>
}
else
{
exit
}
我在搜索时发现的大部分内容都围绕着做一些与用户登录/注销相关的更复杂的事情。我基本上只需要知道计算机当前是否处于登录提示符处。
感谢您提供的所有帮助——你们太棒了。
我需要一种我希望在 Powershell 中执行此操作的非常简单的方法(我正在使用 Absolute Manage 远程运行 Powershell 脚本):
if ( computer is logged out )
{
<run script>
}
else
{
exit
}
我在搜索时发现的大部分内容都围绕着做一些与用户登录/注销相关的更复杂的事情。我基本上只需要知道计算机当前是否处于登录提示符处。
感谢您提供的所有帮助——你们太棒了。
尽可能使用 WMI:
$info = gwmi -class win32_computerSystem -computer sist002ws -ea silentlycontinue | Select-Object username
if ($info.username.Length -gt 0)
{$Message = $info.username}
else
{ $Message = "No user is logged in locally"}
$message
根据您的环境,这可能是此处讨论的雷区:
总之,使用 SysInternals Suite提供的 PSLoggedOn 工具,同时小心过滤掉任何可能返回的服务帐户。为了防止链接失效,这里是上面 Scripting Guy 文章中的使用示例:
$Computers = @(
, "PC001"
, "PC002"
, "PC003"
, "PC004"
)
Foreach ($Computer in $Computers)
{
[object[]]$sessions = Invoke-Expression ".\PsLoggedon.exe -x -l \\$Computer" |
Where-Object {$_ -match '^\s{2,}((?<domain>\w+)\\(?<user>\S+))|(?<user>\S+)'} |
Select-Object @{
Name='Computer'
Expression={$Computer}
},
@{
Name='Domain'
Expression={$matches.Domain}
},
@{
Name='User'
Expression={$Matches.User}
}
IF ($Sessions.count -ge 1)
{
Write-Host ("{0} Users Logged into {1}" –f $Sessions.count,
$Computer) -ForegroundColor 'Red'
}
Else
{
Write-Host ("{0} can be rebooted!" -f $Computer) `
-ForegroundColor 'Green'
}
}
如此处所述,您可以使用下面的代码片段来获取所有登录用户。请注意,这将包含 SYSTEM、LOCAL SERVICE 和 NETWORK SERVICE 等用户。
Get-WmiObject Win32_LoggedOnUser -ComputerName "myMachine" |
Select Antecedent -Unique |
% {
"{0}\{1}" -f $_.Antecedent.Split('"')[1], $_.Antecedent.Split('"')[3]
}
如果您只想查找某些域中的人,您可以像这样稍微修改它:
Get-WmiObject Win32_LoggedOnUser -ComputerName "myMachine" |
Select Antecedent -Unique |
% {
$domain = $_.Antecedent.Split('"')[1]
if($domain -eq "myDomain") {
"{0}\{1}" -f $domain, $_.Antecedent.Split('"')[3]
}
}
这将使您所有的 Interactive/RemoteInteractive(终端服务会话)登录用户。您可能希望向过滤器添加更多 LogonType。没有结果意味着没有人登录。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa394189(v=vs.85).aspx
Get-WmiObject Win32_LogonSession -ComputerName Server1 -Filter 'LogonType=2 OR LogonType=10' |
Foreach-Object { $_.GetRelated('Win32_UserAccount') } |
Select-Object Caption -Unique