Сценарий входа в систему заставляет powershell.exe запускаться и закрываться в цикле

Я создал сценарий входа в систему, который продвигает любого пользователя, работавшего на машине за последние X дней, в группу администраторов. Я успешно протестировал этот скрипт, и у меня не было проблем с выполнением ни в одном из моих тестов. Я создал объект групповой политики, который связывает этот сценарий с определенным подразделением в моей организации, и я обнаружил, что частота сбоев составляет около 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

person Mr Roman    schedule 14.06.2016    source источник
comment
Пожалуйста, опубликуйте сам скрипт, возможно, он делает что-то, что может дать сбой при определенных условиях.   -  person Mathias R. Jessen    schedule 14.06.2016
comment
Хорошо, я обновил исходный пост.   -  person Mr Roman    schedule 15.06.2016


Ответы (1)


Я понял это сам - единственной спорной частью был материал .net в начале, поэтому я попытался прокомментировать эту часть:

    # 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
}

и это сработало ... Я предполагаю, что это были проблемы с .NET на машинах, которые не могли выполнить это должным образом, спасибо, что посмотрели на это.

person Mr Roman    schedule 24.06.2016