Powershell:检查计算机是否已注销

时间:2012-07-19 12:18:57

标签: powershell

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

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

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

感谢您提供的任何帮助 - 你们真棒。

4 个答案:

答案 0 :(得分:0)

根据您的环境,这可能是一个雷区,如下所述:

Scripting Guy Article

总之,使用SysInternals Suite提供的PSLoggedOn工具,同时小心过滤掉可能返回的任何服务帐户。为了防止链接腐烂,请参阅上面的脚本专家文章中的使用示例:

$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' 
    } 
 }

答案 1 :(得分:0)

如上所述here,您可以使用下面的代码段来获取所有登录用户。请注意,这将包含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]
        }
    }

答案 2 :(得分: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

答案 3 :(得分: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