3

我需要一种我希望在 Powershell 中执行此操作的非常简单的方法(我正在使用 Absolute Manage 远程运行 Powershell 脚本):

if ( computer is logged out )
 {
    <run script>
 }
 else
 {
    exit
 }

我在搜索时发现的大部分内容都围绕着做一些与用户登录/注销相关的更复杂的事情。我基本上只需要知道计算机当前是否处于登录提示符处。

感谢您提供的所有帮助——你们太棒了。

4

4 回答 4

0

尽可能使用 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
于 2012-07-19T12:48:38.660 回答
0

根据您的环境,这可能是此处讨论的雷区:

脚本专家文章

总之,使用 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' 
    } 
 }
于 2012-07-19T12:28:21.723 回答
0

如此处所述,您可以使用下面的代码片段来获取所有登录用户。请注意,这将包含 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]
        }
    }
于 2012-07-19T12:41:26.913 回答
0

这将使您所有的 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
于 2012-07-19T12:56:20.090 回答