【问题标题】:PowerShell query for active users before executing action在执行操作之前对活动用户进行 PowerShell 查询
【发布时间】:2015-05-07 11:27:44
【问题描述】:

简介:

首先,我对一般的脚本编写非常陌生,所以我认为应该如何解决这个问题的逻辑可能存在缺陷。我正在使用 Windows Server 2012 R2,所以我认为 PowerShell 可能是解决此问题的最佳方法。

我想做什么:

将计划任务设置为每晚运行一次并调用执行以下操作的脚本:

  1. 检查以确保有零个活动用户登录到正在执行脚本的本地服务器
    • 处于断开连接状态的用户不会被视为已登录。
  2. 如果活动用户为零:
    • 注销任何处于断开连接状态的实际用户(不是系统进程)
    • 删除 C:\MyFolder\*
  3. 否则,什么也不做

我的想法是我不想删除 C:\MyFolder,但我想删除其中的内容。如果处于断开连接状态的用户是拥有内容的用户,我可能无法删除 C:\MyFolder 中的内容,因此为了解决这个问题,我将它们注销(无论如何,他们不应该离开断开连接的会话)。

逻辑:

翻阅一番后,我发现qwinsta /server:localhost 似乎在为用户查询本地主机并提供​​这种类型的输出:

PS C:\Users\EF112131> qwinsta /server:localhost
SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
services                                    0  Disc
console                                     1  Conn
                  AB123456                  2  Disc
rdp-tcp#0         cd789101                  3  Active
rdp-tcp#1         EF112131                  4  Active
rdp-tcp                                 65536  Listen

这为我提供了我关心的已登录用户(AB123456cd789101EF112131),并检查他们会话的各自状态(DiscActive)。我的想法是,从这里我可以拉入USERNAMESTATE 进行某种检查。如果检查返回任何设置为ActiveSTATE,则脚本将不执行任何操作并结束。如果没有Active 状态,脚本将断开任何处于Disc 状态的USERNAME,然后通过执行del /S C:\MyFolder\* 之类的操作清除C:\MyFolder 的内容

我在这里遇到的问题是我不知道如何从上述输出中提取这些值?我想这类似于awk 在 Linux 领域的情况,但我还没有弄明白。

【问题讨论】:

  • 我会考虑查看我的答案here,它将 qwinsta 输出转换为 PowerShell 对象。使查询数据更容易。

标签: powershell


【解决方案1】:

Windows Server 2012 R2 + Powershell 4.0 = 不再解析文本!

看看这里网址:https://technet.microsoft.com/en-us/library/jj215451(v=wps.630).aspx

并使用以下命令查询

  1. 查询用户:Get-RDUserSession
  2. 注销与 Invoke-RDUserLogoff 断开连接的用户 ID

问候, 格伦

【讨论】:

    猜你喜欢
    • 2012-01-01
    • 2018-06-20
    • 1970-01-01
    • 2011-09-19
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    相关资源
    最近更新 更多