登录脚本导致powershell.exe在循环中启动和关闭

时间:2016-06-14 00:38:14

标签: powershell group-policy gpo

我创建了一个登录脚本,用于将过去X天内在计算机上的所有用户提升为Administrators组。我已成功测试了此脚本,并且在我的任何测试中都没有执行问题。我创建了一个GPO,将此脚本链接到我的组织中的特定OU,我发现正确执行的失败率为25%。

“失败”是一个麻烦的部分,因为1)它只发生在相对少量的用户身上,并且因为这2)我不明白概念上发生了什么。具体来说,用户登录后,然后PowerShell.exe立即启动和关闭,但随后继续无限期地执行此操作,直到您强制退出PowerShell - 该窗口将焦点放在桌面上并阻止用户工作。

当我使用计算机管理远程查看计算机上的管理员组成员身份时,我可以看到该脚本成功运行(它将用户提升为管理员)但我不确定是什么原因导致它重新生成,并且仅针对某些人用户。

我可以发布脚本,如果它有帮助(它的简短),但由于它大部分时间“工作”,我倾向于假设PowerShell的某些组件在这些机器上失败或失败。我希望这种行为是众所周知的,或者以前曾被社区中的某些人所体验过。 我要补充的最后一点是,在2个案例中,只需让用户重新启动即可。

脚本代码:

# Launches elevated PS session if possible.
If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{   
  $arguments = "& '" + $myinvocation.mycommand.definition + "'"
  Start-Process powershell -Verb runAs -ArgumentList $arguments
  Break
}

$Threshold = (Get-Date).AddDays(-30)

# Non-builtin regular user SIDs are always prefixed S-1-5-21-
$DomainUserFilter = "SID LIKE 'S-1-5-21-%'"

# Suppress Errors
$ErrorActionPreference = "SilentlyContinue"

# Retrieve user profiles
$DomainProfiles = Get-WmiObject -Class Win32_UserProfile -Filter $DomainUserFilter

foreach($UserProfile in $DomainProfiles)
{
  # Check if profile was ever used, skip if not
  if(-not $UserProfile.LastUseTime)
  {
    continue
  }

  # Convert the datetime string to a proper datetime object
  $LastUsed = $UserProfile.ConvertToDateTime($UserProfile.LastUseTime)

  # Compare against threshold
  if($LastUsed -gt $Threshold)
  {
    # Resolve user profile SID to account name
    $Account = (New-Object System.Security.Principal.SecurityIdentifier $UserProfile.SID).Translate([System.Security.Principal.NTAccount])
    if($?)
    {
      # Add to Administrators group
      net localgroup administrators $Account.Value /add
    }
  }
}
net localgroup administrators “domain users” /delete
exit

1 个答案:

答案 0 :(得分:0)

我自己想出来了 - 唯一有争议的部分是开头的.net内容所以我试着评论那部分:

myModule.directive('ageCheck', function() {
    return {
        require: "ngModel",
        link: function(scope,element,attributes,ngModel) {
            ngModel.$validators.ageCheck=function(modelValue) {
                return scope.age>18;
            }
        }
    }
});

<form name="action">
<div class="form-group">
<label>age</label>
<input type="number" name="ageField" class="form-control" ng-model="age" age-check>
<p class="text-danger" ng-show="action.ageField.$error.ageCheck">You cannot register you're under 18!</p>
</div>

并且工作正常......我认为在未正确执行此操作的计算机上存在.NET问题,感谢您查看此内容。