Вход в качестве пакетного задания windows 2016

В этой статье я постарался собрать основные организационные и технические правила использования учетных записей администраторов в организации, направленные на повышение безопасности в домене Windows. Использование данных рекомендаций значительно повысит защиту компьютеров домена Active Directory от атак, аналогичных летнему инциденту с шифровальщиком Petya, одной из техник распространения которого между компьютерами домена (помимо уязвимости в SMBv1) был удаленный доступ с помощью полученных из памяти учетных данных администраторов (с помощью утилиты аналогичной Mimikatz). Возможно некоторые из рекомендаций спорные или неприменимые для конкретных случаев, но к ним все-таки нужно стремиться.

Итак, в предыдущей статье мы рассмотрели основные методики защиты от извлечения паролей из памяти с помощью Mimikatz. Однако все эти технические меры могут быть бесполезными, если в домене Windows не применяются базовые правила обеспечения безопасности административных учетных записей.

Основное правило, которым следует пользоваться – максимальное ограничение административных привилегий, как для пользователей, так и администраторов. Нужно стремится к тому, что предоставлять пользователям и группам поддержки только те права, которые необходимы для выполнения повседневных задач.

Базовый список правил:

  • Учетные записи администраторов домена/организации должны использоваться только для управления доменом и контроллерами домена. Нельзя использовать эти учетные записи для доступа и управления рабочими станциями. Аналогичное требование должно предъявляться для учетных записей администраторов серверов
  • Для учетных записей администраторов домена желательно использовать двухфакторную аутентификацию
  • На своих рабочих станциях администраторы должны работать под учетными записями с правами обычного пользователя
  • Для защиты привилегированных учетных записей (администраторы домена, Exchange, серверов) нужно рассмотреть возможность использования группы защищенных пользователей (Protected Users)
  • Запрет использования обезличенных общих административных аккаунтов. Все аккаунты администраторов должны быть персонифицированы
  • Нельзя запускать сервисы под учетными записями администраторов (а тем более администратора домена), желательно использовать выделенные учетные записи или Managed Service Accounts .
  • Запрет работы пользователей под правами локального администратора

Естественно, нужно политиками обеспечить достаточную длину и сложность пароля как для пользователей, так и для администраторов и условия блокировки. Я говорю о политиках раздела Computer Configuration -> Windows Settings -> Security Settings -> Account Policies (см статью https://winitpro.ru/index.php/2018/10/26/politika-parolej-uchetnyx-zapisej-v-active-directory/):

  • Password Policy
  • Account Lockout Policy

Политика паролей в домене Windows

Можно сделать более жёсткие требования к длине и хранимой истории паролей для администраторов с помощью Fine-Grained Password Policies.
Касательно встроенной учетной записи на компьютерах пользователей. Нельзя использовать одинаковые пароли локального администратора на всех ПК. Желательно вообще отключить (или хотя бы переименовать) локальную учетку administrator. Для регулярной смены пароля этой учетной записи на уникальный на каждом компьютере в сети можно использовать LAPS.

Доступ по сети с помощью локальных учетных записей и удаленных вход по RDP нужно запретить групповыми политиками . Данные политики находятся в разделе Computer Configuration -> Windows Settings -> Security Settings -> Local Policies -> User Rights Assignment.

  • Deny access to this computer from the network – Отказать в доступе к этому компьютеру из сети
  • Deny log on through Remote Desktop Services – Запретить вход в систему через службы удаленных рабочих столов
  • Deny log on as a batch job – Отказать во входе в качестве пакетного задания
  • Deny log on as a service — Отказать во входе в качестве службы

запрет доступа по сети под локальным администратором

После окончания административного сеанса (установка ПО, настройка системы и т.д. ) компьютер пользователя лучше перезагрузить. А на RDS серверах принудительно завершать приостановленные RDP сессии с помощью политик в разделе Computer Configuration->Policies->Administrative Templates->Windows Components->Remote Desktop Services->Remote Desktop Session Host->Session Time Limits.

В домене с Windows Server 2016 для временного предоставления административных прав можно использовать новую фичу Temporary Group Membership

В этой я описал первоочередные правила, которые помогут вам повысить уровень защиты административных аккаунтов в вашем домене Windows. Конечно, это статья не претендует на полноценных гайд по защите и ограничению прав учетных записей администратора, но вполне может стать вашей отправной точкой по построению безопасной инфраструктуры. Для дальнейшего изучения темы рекомендую начать с изучения документации Microsoft: Best Practices for Securing Active Directory.

Время на прочтение20 мин

Количество просмотров7.3K

Вот уже несколько лет занимаюсь в университете поддержкой 10 рабочих станций под управлением ОС Microsoft Windows 8.1. В основном поддержка заключается в установке нужного для учебного процесса ПО и обеспечении общей работоспособности.

На каждой станции есть 2 пользователя: Администратор и Студент. Администратору доступно полное управление, у Студента нет возможности установки ПО. Чтобы не утруждать себя чисткой пользователя Студент, эта учетка просто удаляется целиком и создается заново. Это влечет за собой некоторые телодвижения, которые нужно выполнять на каждой станции.

В этом году решил автоматизировать большую часть телодвижений c помощью PowerShell без ActiveDirectory и собрал в этот пост некоторые рецепты, которые отыскал в сети.

Подготовка

Сразу же столкнулся с тем, что на станциях установлен PS 4 и некоторые примеры из всезнающего Интернета не работали. Поэтому, прежде, чем запускать получившиеся скрипты, нужно выполнить пару действий:

  1. Установить Windows Management Framework 5.1
  2. Установить последнюю верисию PowerShell

Автоматизируемые действия

  1. Удаление/создание учетной записи пользователя
  2. Автовход заданного пользователя
  3. Запуск скрипта при первом входе пользователя

Удаление/создание учетной записи пользователя

Начал с создания. В этом случае требуется выполнить 2 действия: создать пользователя (New-LocalUser) и добавить его в группу (Add-LocalGroupMember). Для удобства объединил эти команды в функцию:

Function New-User {
    <#
    .SYNOPSIS
        Создание нового пользователя
    .DESCRIPTION
        Данная функция создает нового пользователя и добавляет его в группу Пользователи
    .EXAMPLE
        #New-User "Student" "Student"
    .PARAMETER Name
        Имя нового пользователя (обязательный параметр)
    .PARAMETER Password
        Пароль (обязательный параметр)
    #>

    [CmdletBinding()]
    param (
        [PARAMETER(Mandatory=$True)][String]$Name,
        [PARAMETER(Mandatory=$True)][String]$Password
        )

    $Pwd = convertto-securestring $Password -asplaintext -force
    $GroupSID = "S-1-5-32-545"
    New-LocalUser -User $Name -AccountNeverExpires:$true -FullName $Name -Password $Pwd -PasswordNeverExpires:$true
    Add-LocalGroupMember -SID $GroupSID -Member $Name

    Write-Host "-- Создан пользователь $Name с паролем $Password" -foregroundcolor Green
}

В группу добавляю по SID, потому что в одной из статей встретил, что SID группы Пользователи везде одинаковый — S-1-5-32-545.

Удаление организовал по следующему принципу: удалить все учетные записи, которые были созданы Администратором. Для этого с помощью WMI объекта класса Win32_UserProfile определяю всех пользователей, которые в данный момент не активны и не являются специальными.

Function Remove-Users {
    <#
    .SYNOPSIS
        Удаление пользователей
    .DESCRIPTION
        Данная функция удаляет пользователей, которые сейчас не активны и не являются специальными
        Удаляются в том числе рабочий каталог и реестр пользователей
    .EXAMPLE
        #Remove-Users
    #>
    [CmdletBinding()]

    $UsersProfiles = Get-WMIObject -class Win32_UserProfile -ComputerName $env:COMPUTERNAME | Where {!($_.Loaded) -and !($_.Special)}
    foreach($Usr in $UsersProfiles) {
       	$UsrName = $Usr.LocalPath.Split("\")[2]
       	Write-Host "-- Удаление пользователя $UsrName ..." -foregroundcolor Green
       	Remove-LocalUser -Name $UsrName
	Remove-WmiObject -Path $Usr.__PATH
        Write-Host "-- Пользователь $UsrName удален" -foregroundcolor Green
    }
}

Автовход (автологин) заданного пользователя

Здесь все ограничилось изменением реестра HKEY_LOCAL_MACHINE. Эти действия также объединил в не большую функцию:

Function Set-AutoLogon {
    <#
    .SYNOPSIS
        Включение автовхода для пользователя
    .DESCRIPTION
        Данная функция включает автовход для указанного пользователя
    .EXAMPLE
        #Set-AutoLogon  "Student" "Student"
    .PARAMETER Name
        Имя пользователя (обязательный параметр)
    .PARAMETER Password
        Пароль (обязательный параметр)
    #>

    [CmdletBinding()]
    param (
        [PARAMETER(Mandatory=$True)][String]$Name,
        [PARAMETER(Mandatory=$True)][String]$Password
        )

    $PathToWinlogon = "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Winlogon"
    New-ItemProperty -Path $PathToWinlogon -Name AutoAdminLogon  -Value 1 -PropertyType "String"
    New-ItemProperty -Path $PathToWinlogon -Name DefaultUserName -Value $Name -PropertyType "String"
    New-ItemProperty -Path $PathToWinlogon -Name DefaultPassword -Value $Password -PropertyType "String"
}

Запуск скрипта при первом входе пользователя

Оказалось, что не все можно настроить до первого входа нового пользователя (что было для меня несколько удивительно). Поэтому возникла потребность запустить скрипт, который выполняет некоторые действия после первого входа:

  1. Настройка прокси
  2. Запрет создания файлов на рабочем столе
  3. Настройка панели управления пользователя

Я попробовал несколько способов, но рабочим для меня оказался следующий: установить таск. Но таск средствами PS мне не удалось завести. Поэтому пошел длинной тропинкой:

schtasks /create /tn LogonUserSettings /tr "pwsh C:\Scripts\Settings.ps1" /sc onlogon /ru $env:USERDOMAIN\$UserName /rp $Password /f

Но этого оказалось не достаточно — Windows запросила разрешить вход в качестве пакетного задания (SeBatchLogonRight). Поиски ответа на вопрос как это сделать привели к такому результату:

LsaWrapper

$Source = @'
using System;
using System.Collections.Generic;
using System.Text;

namespace MyLsaWrapper
{
    using System.Runtime.InteropServices;
    using System.Security;
    using System.Management;
    using System.Runtime.CompilerServices;
    using System.ComponentModel;

    using LSA_HANDLE = IntPtr;

    [StructLayout(LayoutKind.Sequential)]
    struct LSA_OBJECT_ATTRIBUTES
    {
        internal int Length;
        internal IntPtr RootDirectory;
        internal IntPtr ObjectName;
        internal int Attributes;
        internal IntPtr SecurityDescriptor;
        internal IntPtr SecurityQualityOfService;
    }
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    struct LSA_UNICODE_STRING
    {
        internal ushort Length;
        internal ushort MaximumLength;
        [MarshalAs(UnmanagedType.LPWStr)]
        internal string Buffer;
    }
    sealed class Win32Sec
    {
        [DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true),
        SuppressUnmanagedCodeSecurityAttribute]
        internal static extern uint LsaOpenPolicy(
        LSA_UNICODE_STRING[] SystemName,
        ref LSA_OBJECT_ATTRIBUTES ObjectAttributes,
        int AccessMask,
        out IntPtr PolicyHandle
        );

        [DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true),
        SuppressUnmanagedCodeSecurityAttribute]
        internal static extern uint LsaAddAccountRights(
        LSA_HANDLE PolicyHandle,
        IntPtr pSID,
        LSA_UNICODE_STRING[] UserRights,
        int CountOfRights
        );

        [DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true),
        SuppressUnmanagedCodeSecurityAttribute]
        internal static extern int LsaLookupNames2(
        LSA_HANDLE PolicyHandle,
        uint Flags,
        uint Count,
        LSA_UNICODE_STRING[] Names,
        ref IntPtr ReferencedDomains,
        ref IntPtr Sids
        );

        [DllImport("advapi32")]
        internal static extern int LsaNtStatusToWinError(int NTSTATUS);

        [DllImport("advapi32")]
        internal static extern int LsaClose(IntPtr PolicyHandle);

        [DllImport("advapi32")]
        internal static extern int LsaFreeMemory(IntPtr Buffer);

    }
    /// <summary>
    /// This class is used to grant "Log on as a service", "Log on as a batchjob", "Log on localy" etc.
    /// to a user.
    /// </summary>
    public sealed class LsaWrapper : IDisposable
    {
        [StructLayout(LayoutKind.Sequential)]
        struct LSA_TRUST_INFORMATION
        {
            internal LSA_UNICODE_STRING Name;
            internal IntPtr Sid;
        }
        [StructLayout(LayoutKind.Sequential)]
        struct LSA_TRANSLATED_SID2
        {
            internal SidNameUse Use;
            internal IntPtr Sid;
            internal int DomainIndex;
            uint Flags;
        }

        [StructLayout(LayoutKind.Sequential)]
        struct LSA_REFERENCED_DOMAIN_LIST
        {
            internal uint Entries;
            internal LSA_TRUST_INFORMATION Domains;
        }

        enum SidNameUse : int
        {
            User = 1,
            Group = 2,
            Domain = 3,
            Alias = 4,
            KnownGroup = 5,
            DeletedAccount = 6,
            Invalid = 7,
            Unknown = 8,
            Computer = 9
        }

        enum Access : int
        {
            POLICY_READ = 0x20006,
            POLICY_ALL_ACCESS = 0x00F0FFF,
            POLICY_EXECUTE = 0X20801,
            POLICY_WRITE = 0X207F8
        }
        const uint STATUS_ACCESS_DENIED = 0xc0000022;
        const uint STATUS_INSUFFICIENT_RESOURCES = 0xc000009a;
        const uint STATUS_NO_MEMORY = 0xc0000017;

        IntPtr lsaHandle;

        public LsaWrapper()
            : this(null)
        { }
        // // local system if systemName is null
        public LsaWrapper(string systemName)
        {
            LSA_OBJECT_ATTRIBUTES lsaAttr;
            lsaAttr.RootDirectory = IntPtr.Zero;
            lsaAttr.ObjectName = IntPtr.Zero;
            lsaAttr.Attributes = 0;
            lsaAttr.SecurityDescriptor = IntPtr.Zero;
            lsaAttr.SecurityQualityOfService = IntPtr.Zero;
            lsaAttr.Length = Marshal.SizeOf(typeof(LSA_OBJECT_ATTRIBUTES));
            lsaHandle = IntPtr.Zero;
            LSA_UNICODE_STRING[] system = null;
            if (systemName != null)
            {
                system = new LSA_UNICODE_STRING[1];
                system[0] = InitLsaString(systemName);
            }

            uint ret = Win32Sec.LsaOpenPolicy(system, ref lsaAttr,
            (int)Access.POLICY_ALL_ACCESS, out lsaHandle);
            if (ret == 0)
                return;
            if (ret == STATUS_ACCESS_DENIED)
            {
                throw new UnauthorizedAccessException();
            }
            if ((ret == STATUS_INSUFFICIENT_RESOURCES) || (ret == STATUS_NO_MEMORY))
            {
                throw new OutOfMemoryException();
            }
            throw new Win32Exception(Win32Sec.LsaNtStatusToWinError((int)ret));
        }

        public void AddPrivileges(string account, string privilege)
        {
            IntPtr pSid = GetSIDInformation(account);
            LSA_UNICODE_STRING[] privileges = new LSA_UNICODE_STRING[1];
            privileges[0] = InitLsaString(privilege);
            uint ret = Win32Sec.LsaAddAccountRights(lsaHandle, pSid, privileges, 1);
            if (ret == 0)
                return;
            if (ret == STATUS_ACCESS_DENIED)
            {
                throw new UnauthorizedAccessException();
            }
            if ((ret == STATUS_INSUFFICIENT_RESOURCES) || (ret == STATUS_NO_MEMORY))
            {
                throw new OutOfMemoryException();
            }
            throw new Win32Exception(Win32Sec.LsaNtStatusToWinError((int)ret));
        }

        public void Dispose()
        {
            if (lsaHandle != IntPtr.Zero)
            {
                Win32Sec.LsaClose(lsaHandle);
                lsaHandle = IntPtr.Zero;
            }
            GC.SuppressFinalize(this);
        }
        ~LsaWrapper()
        {
            Dispose();
        }
        // helper functions

        IntPtr GetSIDInformation(string account)
        {
            LSA_UNICODE_STRING[] names = new LSA_UNICODE_STRING[1];
            LSA_TRANSLATED_SID2 lts;
            IntPtr tsids = IntPtr.Zero;
            IntPtr tdom = IntPtr.Zero;
            names[0] = InitLsaString(account);
            lts.Sid = IntPtr.Zero;
            //Console.WriteLine("String account: {0}", names[0].Length);
            int ret = Win32Sec.LsaLookupNames2(lsaHandle, 0, 1, names, ref tdom, ref tsids);
            if (ret != 0)
                throw new Win32Exception(Win32Sec.LsaNtStatusToWinError(ret));
            lts = (LSA_TRANSLATED_SID2)Marshal.PtrToStructure(tsids,
            typeof(LSA_TRANSLATED_SID2));
            Win32Sec.LsaFreeMemory(tsids);
            Win32Sec.LsaFreeMemory(tdom);
            return lts.Sid;
        }

        static LSA_UNICODE_STRING InitLsaString(string s)
        {
            // Unicode strings max. 32KB
            if (s.Length > 0x7ffe)
                throw new ArgumentException("String too long");
            LSA_UNICODE_STRING lus = new LSA_UNICODE_STRING();
            lus.Buffer = s;
            lus.Length = (ushort)(s.Length * sizeof(char));
            lus.MaximumLength = (ushort)(lus.Length + sizeof(char));
            return lus;
        }
    }
    public class LsaWrapperCaller
    {
        public static void AddPrivileges(string account, string privilege)
        {
            using (LsaWrapper lsaWrapper = new LsaWrapper())
            {
                lsaWrapper.AddPrivileges(account, privilege);
            }
        }
    }
}
'@

Add-Type -TypeDefinition $Source
[MyLsaWrapper.LsaWrapperCaller]::AddPrivileges($Identity, "SeBatchLogonRight")

Разрешение входа в качестве пакетного задания позволило двигаться дальше — к написанию скрипта, который выполняется из-под пользователя.

Настройка прокси

С настройкой прокси оказалось все просто. Рабочее решение быстро нашлось:

Function Set-Proxy {
    <#
    .SYNOPSIS
        Установка параметров прокси
    .DESCRIPTION
        Данная функция задает параметры прокси для пользователя
    .EXAMPLE
        #Set-Proxy a.cproxy.ru 8080
    .PARAMETER Server
        Адрес или доменное имя сервера (обязательный параметр)
    .PARAMETER Port
        Порт (обязательный параметр)
    #>

    [CmdletBinding()]
    param (
        [PARAMETER(Mandatory=$True)][String]$Server,
        [PARAMETER(Mandatory=$True)][Int]$Port
        )

    If ((Test-NetConnection -ComputerName $Server -Port $Port).TcpTestSucceeded) {
        Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyServer -Value "$($Server):$($Port)"
        Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyEnable -Value 1
    } Else {
        Write-Error -Message "-- Invalid proxy server address or port:  $($Server):$($Port)"
    }
}

Запрет создания файлов на рабочем столе

С запретом создания файлов на рабочем столе пришлось повозиться дольше, чем с сетью. Выставить права на папку оказалось не там просто как в *nix системах. Но и тут нашлись ответы, которые я успешно адаптировал под себя:

Function Set-AccessRule {
    <#
    .SYNOPSIS
        Установка прав на папку
    .DESCRIPTION
        Данная функция устанавливает заданные права на директорию
    .EXAMPLE
        #Set-AccessRule -Folder $env:USERPROFILE\Desktop\  -UserName $env:USERNAME -Rules CreateFiles,AppendData -AccessControlType Deny
    .PARAMETER Folder
        Директория, над которой производится действие (обязательный параметр)
    .PARAMETER UserName
        Имя учетной записи пользователя, для кого задаются права доступа (обязательный параметр)
    .PARAMETER Rules
        Права доступа через запятую (обязательный параметр)
    .PARAMETER AccessControlType
        Обязательный параметр, который может принимать одно из двух значений: Allow или Deny
    #>
    [CmdletBinding()]
    param (
        [PARAMETER(Mandatory=$True)][Path]$Folder,
        [PARAMETER(Mandatory=$True)][String]$UserName,
        [PARAMETER(Mandatory=$True)][String]$Rules,
        [PARAMETER(Mandatory=$True)][String]$AccessControlType
        )

    #считываем текущий список ACL рабочего стола
    $acl = Get-Acl $Folder
    #Создаем переменную с нужными правами
    $fileSystemRights = [System.Security.AccessControl.FileSystemRights]"$Rules"
    #Cоздаем переменную с указанием пользователя, прав доступа и типа разрешения
    $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($UserName, $fileSystemRights, $AccessControlType)
    #Передаем переменную в класс FileSystemAccessRule для создания объекта
    $acl.SetAccessRule($AccessRule)
    #Применяем разрешения к папке
    $acl | Set-Acl $Folder
}

Set-AccessRule -Folder $env:USERPROFILE\Desktop\  -UserName $env:USERNAME -Rules CreateFiles,AppendData,Delete -AccessControlType Deny

Описание FileSystemRights на официальном сайте.

Настройка панели управления пользователя

Это делать было не обязательно, но я подумал, что было бы круто предоставить студентам настроенную панель, с часто используемыми программами. Ответ нашелся тут.

PinnedApplication

function Set-PinnedApplication
{
    <#
    .SYNOPSIS
        Управление ярлыками на панели управления
    .DESCRIPTION
        Данная функция добавляет или удаляет ярлыки на панели управления пользователя
    .EXAMPLE
        #Set-PinnedApplication -Action UnpinfromTaskbar -FilePath "$env:ProgramFiles\Internet Explorer\iexplore.exe"
    .EXAMPLE
        #Set-PinnedApplication -Action PintoTaskbar -FilePath "${env:ProgramFiles(x86)}\Mozilla Firefox\firefox.exe"
    .PARAMETER Action
        Обязательный параметр, который может принимать одно из двух значений: UnpinfromTaskbar или PintoTaskbar
    .PARAMETER FilePath
        Имя учетной записи пользователя, для кого задаются права доступа (обязательный параметр)
    #>
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$True)][String]$Action, 
        [Parameter(Mandatory=$True)][String]$FilePath
   	)
    if(-not (test-path $FilePath)) { 
   	throw "FilePath does not exist."  
    }
    function InvokeVerb {
   	param([string]$FilePath,$verb)
	$verb = $verb.Replace("&","")
	$path = split-path $FilePath
	$shell = new-object -com "Shell.Application" 
	$folder = $shell.Namespace($path)   
	$item = $folder.Parsename((split-path $FilePath -leaf))
	$itemVerb = $item.Verbs() | ? {$_.Name.Replace("&","") -eq $verb}
	if($itemVerb -eq $null){
		throw "Verb $verb not found."			
	} else {
		$itemVerb.DoIt()
	}
   }
    function GetVerb {
	param([int]$verbId)
	try {
		$t = [type]"CosmosKey.Util.MuiHelper"
	} catch {
	    $def = [Text.StringBuilder]""
	    [void]$def.AppendLine('[DllImport("user32.dll")]')
	    [void]$def.AppendLine('public static extern int LoadString(IntPtr h,uint id, System.Text.StringBuilder sb,int maxBuffer);')
	    [void]$def.AppendLine('[DllImport("kernel32.dll")]')
	    [void]$def.AppendLine('public static extern IntPtr LoadLibrary(string s);')
	    Add-Type -MemberDefinition $def.ToString() -name MuiHelper -namespace CosmosKey.Util			
	}
	if($global:CosmosKey_Utils_MuiHelper_Shell32 -eq $null){		
	    $global:CosmosKey_Utils_MuiHelper_Shell32 = [CosmosKey.Util.MuiHelper]::LoadLibrary("shell32.dll")
	}
	$maxVerbLength=255
	$verbBuilder = New-Object Text.StringBuilder "",$maxVerbLength
	[void][CosmosKey.Util.MuiHelper]::LoadString($CosmosKey_Utils_MuiHelper_Shell32,$verbId,$verbBuilder,$maxVerbLength)
	return $verbBuilder.ToString()
    }
    $verbs = @{ 
	"PintoTaskbar"=5386
	"UnpinfromTaskbar"=5387
    }
    if($verbs.$Action -eq $null){
   	Throw "Action $action not supported`nSupported actions are:`n`tPintoTaskbar`n`tUnpinfromTaskbar"
    }
    InvokeVerb -FilePath $FilePath -Verb $(GetVerb -VerbId $verbs.$action)
}

Заключение

Скрипты работают, время обслуживания каждой станции сократилось, цель достигнута. Для меня, как пользователя Linux, настройка Windows оказалось не самым простым приключением, но познавательным. Скрипт настройки буду развивать. В планах добавить проверку на наличие установленного ПО и установка, запуск антивируса.

Итоговые скрипты, которые в работе

Запуск от имени Администратора

Function New-User {
    <#
    .SYNOPSIS
        Создание нового пользователя
    .DESCRIPTION
        Данная функция создает нового пользователя и добавляет его в группу Пользователи
    .EXAMPLE
        #New-User "Student" "Student"
    .PARAMETER Name
        Имя нового пользователя (обязательный параметр)
    .PARAMETER Password
        Пароль (обязательный параметр)
    #>

    [CmdletBinding()]
    param (
        [PARAMETER(Mandatory=$True)][String]$Name,
        [PARAMETER(Mandatory=$True)][String]$Password
        )

    $Pwd = convertto-securestring $Password -asplaintext -force
    $GroupSID = "S-1-5-32-545"
    New-LocalUser -User $Name -AccountNeverExpires:$true -FullName $Name -Password $Pwd -PasswordNeverExpires:$true
    Add-LocalGroupMember -SID $GroupSID -Member $Name

    Write-Host "-- Создан пользователь $Name с паролем $Password" -foregroundcolor Green
}

Function Remove-Users {
    <#
    .SYNOPSIS
        Удаление пользователей
    .DESCRIPTION
        Данная функция удаляет пользователей, которые сейчас не активны и не являются специальными
        Удаляются в том числе рабочий каталог и реестр пользователей
    .EXAMPLE
        #Remove-Users
    #>
    [CmdletBinding()]

    $UsersProfiles = Get-WMIObject -class Win32_UserProfile -ComputerName $env:COMPUTERNAME | Where {!($_.Loaded) -and !($_.Special)}
	foreach($Usr in $UsersProfiles) {
        $UsrName = $Usr.LocalPath.Split("\")[2]
        Write-Host "-- Удаление пользователя $UsrName ..." -foregroundcolor Green
        Remove-LocalUser -Name $UsrName
		Remove-WmiObject -Path $Usr.__PATH
        Write-Host "-- Пользователь $UsrName удален" -foregroundcolor Green
	}
}

Function Set-AutoLogon {
    <#
    .SYNOPSIS
        Включение автовхода для пользователя
    .DESCRIPTION
        Данная функция включает автовход для указанного пользователя
    .EXAMPLE
        #Set-AutoLogon  "Student" "Student"
    .PARAMETER Name
        Имя пользователя (обязательный параметр)
    .PARAMETER Password
        Пароль (обязательный параметр)
    #>

    [CmdletBinding()]
    param (
        [PARAMETER(Mandatory=$True)][String]$Name,
        [PARAMETER(Mandatory=$True)][String]$Password
        )

    $PathToWinlogon = "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Winlogon"
    New-ItemProperty -Path $PathToWinlogon -Name AutoAdminLogon  -Value 1 -PropertyType "String"
    New-ItemProperty -Path $PathToWinlogon -Name DefaultUserName -Value $Name -PropertyType "String"
    New-ItemProperty -Path $PathToWinlogon -Name DefaultPassword -Value $Password -PropertyType "String"
}

$Source = @'
using System;
using System.Collections.Generic;
using System.Text;

namespace MyLsaWrapper
{
    using System.Runtime.InteropServices;
    using System.Security;
    using System.Management;
    using System.Runtime.CompilerServices;
    using System.ComponentModel;

    using LSA_HANDLE = IntPtr;

    [StructLayout(LayoutKind.Sequential)]
    struct LSA_OBJECT_ATTRIBUTES
    {
        internal int Length;
        internal IntPtr RootDirectory;
        internal IntPtr ObjectName;
        internal int Attributes;
        internal IntPtr SecurityDescriptor;
        internal IntPtr SecurityQualityOfService;
    }
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    struct LSA_UNICODE_STRING
    {
        internal ushort Length;
        internal ushort MaximumLength;
        [MarshalAs(UnmanagedType.LPWStr)]
        internal string Buffer;
    }
    sealed class Win32Sec
    {
        [DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true),
        SuppressUnmanagedCodeSecurityAttribute]
        internal static extern uint LsaOpenPolicy(
        LSA_UNICODE_STRING[] SystemName,
        ref LSA_OBJECT_ATTRIBUTES ObjectAttributes,
        int AccessMask,
        out IntPtr PolicyHandle
        );

        [DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true),
        SuppressUnmanagedCodeSecurityAttribute]
        internal static extern uint LsaAddAccountRights(
        LSA_HANDLE PolicyHandle,
        IntPtr pSID,
        LSA_UNICODE_STRING[] UserRights,
        int CountOfRights
        );

        [DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true),
        SuppressUnmanagedCodeSecurityAttribute]
        internal static extern int LsaLookupNames2(
        LSA_HANDLE PolicyHandle,
        uint Flags,
        uint Count,
        LSA_UNICODE_STRING[] Names,
        ref IntPtr ReferencedDomains,
        ref IntPtr Sids
        );

        [DllImport("advapi32")]
        internal static extern int LsaNtStatusToWinError(int NTSTATUS);

        [DllImport("advapi32")]
        internal static extern int LsaClose(IntPtr PolicyHandle);

        [DllImport("advapi32")]
        internal static extern int LsaFreeMemory(IntPtr Buffer);

    }
    /// <summary>
    /// This class is used to grant "Log on as a service", "Log on as a batchjob", "Log on localy" etc.
    /// to a user.
    /// </summary>
    public sealed class LsaWrapper : IDisposable
    {
        [StructLayout(LayoutKind.Sequential)]
        struct LSA_TRUST_INFORMATION
        {
            internal LSA_UNICODE_STRING Name;
            internal IntPtr Sid;
        }
        [StructLayout(LayoutKind.Sequential)]
        struct LSA_TRANSLATED_SID2
        {
            internal SidNameUse Use;
            internal IntPtr Sid;
            internal int DomainIndex;
            uint Flags;
        }

        [StructLayout(LayoutKind.Sequential)]
        struct LSA_REFERENCED_DOMAIN_LIST
        {
            internal uint Entries;
            internal LSA_TRUST_INFORMATION Domains;
        }

        enum SidNameUse : int
        {
            User = 1,
            Group = 2,
            Domain = 3,
            Alias = 4,
            KnownGroup = 5,
            DeletedAccount = 6,
            Invalid = 7,
            Unknown = 8,
            Computer = 9
        }

        enum Access : int
        {
            POLICY_READ = 0x20006,
            POLICY_ALL_ACCESS = 0x00F0FFF,
            POLICY_EXECUTE = 0X20801,
            POLICY_WRITE = 0X207F8
        }
        const uint STATUS_ACCESS_DENIED = 0xc0000022;
        const uint STATUS_INSUFFICIENT_RESOURCES = 0xc000009a;
        const uint STATUS_NO_MEMORY = 0xc0000017;

        IntPtr lsaHandle;

        public LsaWrapper()
            : this(null)
        { }
        // // local system if systemName is null
        public LsaWrapper(string systemName)
        {
            LSA_OBJECT_ATTRIBUTES lsaAttr;
            lsaAttr.RootDirectory = IntPtr.Zero;
            lsaAttr.ObjectName = IntPtr.Zero;
            lsaAttr.Attributes = 0;
            lsaAttr.SecurityDescriptor = IntPtr.Zero;
            lsaAttr.SecurityQualityOfService = IntPtr.Zero;
            lsaAttr.Length = Marshal.SizeOf(typeof(LSA_OBJECT_ATTRIBUTES));
            lsaHandle = IntPtr.Zero;
            LSA_UNICODE_STRING[] system = null;
            if (systemName != null)
            {
                system = new LSA_UNICODE_STRING[1];
                system[0] = InitLsaString(systemName);
            }

            uint ret = Win32Sec.LsaOpenPolicy(system, ref lsaAttr,
            (int)Access.POLICY_ALL_ACCESS, out lsaHandle);
            if (ret == 0)
                return;
            if (ret == STATUS_ACCESS_DENIED)
            {
                throw new UnauthorizedAccessException();
            }
            if ((ret == STATUS_INSUFFICIENT_RESOURCES) || (ret == STATUS_NO_MEMORY))
            {
                throw new OutOfMemoryException();
            }
            throw new Win32Exception(Win32Sec.LsaNtStatusToWinError((int)ret));
        }

        public void AddPrivileges(string account, string privilege)
        {
            IntPtr pSid = GetSIDInformation(account);
            LSA_UNICODE_STRING[] privileges = new LSA_UNICODE_STRING[1];
            privileges[0] = InitLsaString(privilege);
            uint ret = Win32Sec.LsaAddAccountRights(lsaHandle, pSid, privileges, 1);
            if (ret == 0)
                return;
            if (ret == STATUS_ACCESS_DENIED)
            {
                throw new UnauthorizedAccessException();
            }
            if ((ret == STATUS_INSUFFICIENT_RESOURCES) || (ret == STATUS_NO_MEMORY))
            {
                throw new OutOfMemoryException();
            }
            throw new Win32Exception(Win32Sec.LsaNtStatusToWinError((int)ret));
        }

        public void Dispose()
        {
            if (lsaHandle != IntPtr.Zero)
            {
                Win32Sec.LsaClose(lsaHandle);
                lsaHandle = IntPtr.Zero;
            }
            GC.SuppressFinalize(this);
        }
        ~LsaWrapper()
        {
            Dispose();
        }
        // helper functions

        IntPtr GetSIDInformation(string account)
        {
            LSA_UNICODE_STRING[] names = new LSA_UNICODE_STRING[1];
            LSA_TRANSLATED_SID2 lts;
            IntPtr tsids = IntPtr.Zero;
            IntPtr tdom = IntPtr.Zero;
            names[0] = InitLsaString(account);
            lts.Sid = IntPtr.Zero;
            //Console.WriteLine("String account: {0}", names[0].Length);
            int ret = Win32Sec.LsaLookupNames2(lsaHandle, 0, 1, names, ref tdom, ref tsids);
            if (ret != 0)
                throw new Win32Exception(Win32Sec.LsaNtStatusToWinError(ret));
            lts = (LSA_TRANSLATED_SID2)Marshal.PtrToStructure(tsids,
            typeof(LSA_TRANSLATED_SID2));
            Win32Sec.LsaFreeMemory(tsids);
            Win32Sec.LsaFreeMemory(tdom);
            return lts.Sid;
        }

        static LSA_UNICODE_STRING InitLsaString(string s)
        {
            // Unicode strings max. 32KB
            if (s.Length > 0x7ffe)
                throw new ArgumentException("String too long");
            LSA_UNICODE_STRING lus = new LSA_UNICODE_STRING();
            lus.Buffer = s;
            lus.Length = (ushort)(s.Length * sizeof(char));
            lus.MaximumLength = (ushort)(lus.Length + sizeof(char));
            return lus;
        }
    }
    public class LsaWrapperCaller
    {
        public static void AddPrivileges(string account, string privilege)
        {
            using (LsaWrapper lsaWrapper = new LsaWrapper())
            {
                lsaWrapper.AddPrivileges(account, privilege);
            }
        }
    }
}
'@

Add-Type -TypeDefinition $Source | Out-Null


# -------------------------
# Пересоздание пользователя
# -------------------------
$UserName    = "Student"
$Password    = "Student"

Remove-Users | Out-Null
New-User $UserName $Password | Out-Null
Set-AutoLogon $UserName $Password | Out-Null
[MyLsaWrapper.LsaWrapperCaller]::AddPrivileges($UserName, "SeBatchLogonRight") | Out-Null
write-host "-- разрешен вход в качестве пакетного задания для пользователя $UserName" -foregroundcolor Green
schtasks /create /tn LogonUserSettings /tr "pwsh C:\Scripts\SetupUser.ps1" /sc onlogon /ru $env:USERDOMAIN\$UserName /rp $Password /f

Запускаемый из-под пользователя Student

Function Set-Proxy {
    <#
    .SYNOPSIS
        Установка параметров прокси
    .DESCRIPTION
        Данная функция задает параметры прокси для пользователя
    .EXAMPLE
        #Set-Proxy a.cproxy.ru 8080
    .PARAMETER Server
        Адрес или доменное имя сервера (обязательный параметр)
    .PARAMETER Port
        Порт (обязательный параметр)
    #>

    [CmdletBinding()]
    param (
        [PARAMETER(Mandatory=$True)][String]$Server,
        [PARAMETER(Mandatory=$True)][Int]$Port
        )

	If ((Test-NetConnection -ComputerName $Server -Port $Port).TcpTestSucceeded) {
		Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyServer -Value "$($Server):$($Port)"
		Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyEnable -Value 1
	} Else {
		Write-Error -Message "-- Invalid proxy server address or port:  $($Server):$($Port)"
	}
}

Function Set-AccessRule {
    <#
    .SYNOPSIS
        Установка правк на папку
    .DESCRIPTION
        Данная функция устанавливает заданные права на дирректорию
    .EXAMPLE
        #Set-AccessRule -Folder $env:USERPROFILE\Desktop\  -UserName $env:USERNAME -Rules CreateFiles,AppendData -AccessControlType Deny
    .PARAMETER Folder
        Дирректория, над которой производится действие (обязательный параметр)
    .PARAMETER UserName
        Имя учетной записи пользователя, для кого задаются права доступа (обязательный параметр)
    .PARAMETER Rules
        Права доступа через запятую(обязательный параметр)
    .PARAMETER AccessControlType
        Обязательный параметр, который может принмать одно из двух значений: Allow или Deny
    #>
    [CmdletBinding()]
    param (
        [PARAMETER(Mandatory=$True)][String]$Folder,
        [PARAMETER(Mandatory=$True)][String]$UserName,
        [PARAMETER(Mandatory=$True)][String]$Rules,
        [PARAMETER(Mandatory=$True)][String]$AccessControlType
        )

    #считываем текущий список ACL рабочего стола
    $acl = Get-Acl $Folder
    #Создаем переменню с нужными правами
    $fileSystemRights = [System.Security.AccessControl.FileSystemRights]"$Rules"
    #Cоздаем переменную с указанием пользователя, прав доступа и типа разрешения
    $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($UserName, $fileSystemRights, $AccessControlType)
    #Передаем переменную в класс FileSystemAccessRule для создания объекта
    $acl.SetAccessRule($AccessRule)
    #Применяем разрешения к папке
    $acl | Set-Acl $Folder
}

function Set-PinnedApplication
{
    <#
    .SYNOPSIS
        Управление ярлыками на панели управления
    .DESCRIPTION
        Данная функция добавляет или удаляет ярлыки на панели управления пользователя
    .EXAMPLE
        #Set-PinnedApplication -Action UnpinfromTaskbar -FilePath "$env:ProgramFiles\Internet Explorer\iexplore.exe"
    .EXAMPLE
        #Set-PinnedApplication -Action PintoTaskbar -FilePath "${env:ProgramFiles(x86)}\Mozilla Firefox\firefox.exe"
    .PARAMETER Action
        Обязательный параметр, который может принимать одно из двух значений: UnpinfromTaskbar или PintoTaskbar
    .PARAMETER FilePath
        Имя учетной записи пользователя, для кого задаются права доступа (обязательный параметр)
    #>
    [CmdletBinding()]
    param(
            [Parameter(Mandatory=$True)][String]$Action, 
            [Parameter(Mandatory=$True)][String]$FilePath
    )
    if(-not (test-path $FilePath)) { 
        throw "FilePath does not exist."  
    }
    function InvokeVerb {
        param([string]$FilePath,$verb)
        $verb = $verb.Replace("&","")
        $path = split-path $FilePath
        $shell = new-object -com "Shell.Application" 
        $folder = $shell.Namespace($path)   
        $item = $folder.Parsename((split-path $FilePath -leaf))
        $itemVerb = $item.Verbs() | ? {$_.Name.Replace("&","") -eq $verb}
        if($itemVerb -eq $null){
            throw "Verb $verb not found."           
        } else {
            $itemVerb.DoIt()
        }
    }
    function GetVerb {
        param([int]$verbId)
        try {
            $t = [type]"CosmosKey.Util.MuiHelper"
        } catch {
            $def = [Text.StringBuilder]""
            [void]$def.AppendLine('[DllImport("user32.dll")]')
            [void]$def.AppendLine('public static extern int LoadString(IntPtr h,uint id, System.Text.StringBuilder sb,int maxBuffer);')
            [void]$def.AppendLine('[DllImport("kernel32.dll")]')
            [void]$def.AppendLine('public static extern IntPtr LoadLibrary(string s);')
            Add-Type -MemberDefinition $def.ToString() -name MuiHelper -namespace CosmosKey.Util            
        }
        if($global:CosmosKey_Utils_MuiHelper_Shell32 -eq $null){        
            $global:CosmosKey_Utils_MuiHelper_Shell32 = [CosmosKey.Util.MuiHelper]::LoadLibrary("shell32.dll")
        }
        $maxVerbLength=255
        $verbBuilder = New-Object Text.StringBuilder "",$maxVerbLength
        [void][CosmosKey.Util.MuiHelper]::LoadString($CosmosKey_Utils_MuiHelper_Shell32,$verbId,$verbBuilder,$maxVerbLength)
        return $verbBuilder.ToString()
    }
    $verbs = @{ 
        "PintoTaskbar"=5386
        "UnpinfromTaskbar"=5387
    }
    if($verbs.$Action -eq $null){
        Throw "Action $action not supported`nSupported actions are:`n`tPintoTaskbar`n`tUnpinfromTaskbar"
    }
    InvokeVerb -FilePath $FilePath -Verb $(GetVerb -VerbId $verbs.$action)
}

Set-Proxy cproxy.udsu.ru 8080
Set-AccessRule -Folder $env:USERPROFILE\Desktop\  -UserName $env:USERNAME -Rules "CreateFiles,AppendData,Delete" -AccessControlType Deny

Set-PinnedApplication -Action UnpinfromTaskbar -FilePath "$env:ProgramFiles\Internet Explorer\iexplore.exe"
Set-PinnedApplication -Action PintoTaskbar -FilePath "${env:ProgramFiles(x86)}\Mozilla Firefox\firefox.exe"
Set-PinnedApplication -Action PintoTaskbar -FilePath "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Office 2013\Excel 2013.lnk"
Set-PinnedApplication -Action PintoTaskbar -FilePath "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Office 2013\Word 2013.lnk"
Set-PinnedApplication -Action PintoTaskbar -FilePath "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Office 2013\PowerPoint 2013.lnk"
Set-PinnedApplication -Action PintoTaskbar -FilePath "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\АСКОН\КОМПАС-3D V16\КОМПАС-3D V16.lnk"

# Удаление задачи, после ее выполнения
Unregister-ScheduledTask -TaskName UdSUSettingStudent -Confirm:$false

В процессе установки Сервера 1С требуется указать пользователя, от имени которого будет запускаться служба «Агент сервера 1С:Предприятие». По умолчанию это USR1CV8.

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

В этом случае нужно нажать кнопку «Пропустить». Установка Сервера 1С будет продолжена.

В групповых политиках (gpedit.msc) нужно открыть ветку:

«Конфигурация компьютера — Конфигурация Windows — Параметры безопасности — Локальные политики — Назначение прав пользователя»

и добавить учетку USR1CV8 в политики «Вход в качестве пакетного задания» и «Вход в качестве службы». В англоязычной версии Windows будет «Log on as a batch job» и «Log on as a service».

После этого вручную запустить службу «Агент сервера 1С:Предприятие».

При этом нужно иметь в виду, что Агент сервера должен быть запущен от имени пользователя, который обладает правами администратора.

Для получения доступа в AD с тонкого клиента (клиент-серверный режим) к ресурсам рабочих компьютеров пользователей 1С:Предприятие. Нужно дополнительно создать доменную учетную запись для Active Directory. Например USR1CV8@NAME_YOUR_DOMAIN.LOCAL

Выполнить следующие действия для учётной записи:

  • настроить вход в качестве службы на компьютере, где установлен сервер 1С и на других серверах. Жмем Win + R и вводим команду: gpedit.msc в диалоговом окне Выполнить, далее Enter. Политика Локальный компьютер\Конфигурация компьютера\Конфигурация Windows\Параметры безопасности\Локальные политики\Назначение прав пользователя\Вход в качестве службы и Вход в качестве пакетного задания. Добавить пользователя USR1CV8@NAME_YOUR_DOMAIN.LOCAL;
  • запретить локальный вход для этой учётной записи на всех серверах и на компьютерах (см.скриншот 1). Жмем Win + R и вводим команду: gpedit.msc в диалоговом окне Выполнить, далее Enter. Политика Локальный компьютер\Конфигурация компьютера\Конфигурация Windows\Параметры безопасности\Локальные политики\Назначение прав пользователя\Отказать в доступе к этому компьютеру из сети удалить из списка USR1CV8;
  • сравнить права доступа у уч.записи USR1CV8 на сервере 1С и предоставить учётной записи NAME_YOUR_DOMAIN\SRV1CV8 аналогичные права.
  • в Диспетчере служб (жмем Win + R и вводим команду: services.msc в диалоговом окне Выполнить, далее Enter) настроить запуск агента сервера 1С от имени учётной записи NAME_YOUR_DOMAIN\SRV1CV8. Перезапустить службу.

  • желательно предоставить доступ к папке журнала регистраций 1С srvinfo (см.скриншот 2).

На компьютере, где находится общий ресурс, предоставить доступ к нужной сетевой папке учётной записи NAME_YOUR_DOMAIN\SRV1CV8. Рекомендуется создать отдельную группу для данной учётной записи и предоставить доступ этой группе. Это позволит упростить управление доступом в случае установки дополнительного сервера 1С — достаточно будет добавить учётную запись нового сервера в соответствующую группу.


Рейтинг 4.59/569:

7 / 7 / 6

Регистрация: 02.04.2012

Сообщений: 321

Server 2016

Как включить разрешение на запуск системных служб ?

23.03.2017, 16:50. Показов 120000. Ответов 5


Добрый день!

При запуски мастера установки клиент-серверной 1С, можно выбрать пользователя: DefaultAccount либо создать нового пользователя, к примеру я создал пользователя: USR1CV8.

Во время установки клиент-серверной 1С, вылетает ошибка: Ошибка при запуске службы …убедитесь, что у вас имеются разрешения на запуск системных служб.

Подскажите пожалуйста как в windows server 2016 предоставить пользователю USR1CV8 права на запуск служебных служб.

В системе авторизован под пользователем User — тип учётной записи — администратор.
Среди учётных записей есть пользователь с именем Администратор, но как зайти в систему через него, я не знаю.

Напечатайте пожалуйста две инструкции:
1. Как в microsoft windows server авторизоваться под пользователем — Администратор?
2. Как разрешить запуск системных служб пользователям User и USR1CV8?

С уважением

Миниатюры

 

 



0



IT_Exp

Эксперт

34794 / 4073 / 2104

Регистрация: 17.06.2006

Сообщений: 32,602

Блог

23.03.2017, 16:50

5

490 / 89 / 18

Регистрация: 01.12.2009

Сообщений: 370

Записей в блоге: 1

24.03.2017, 10:53

MrRuslanBB,
1. Сменить пользователя, как и в обычных виндах — выход из системы, другой пользователь, ввести учетные данные. Если вы не знаете пароля администратора, обратитесь к тому, кто устанавливал систему, т.к. установка пароля администратора запрашивается на этапе установки WinServer.
1.а. Возможен сценарий, когда сервер — контроллер домена. В этом случае на нем отключены локальные учетные записи и зайти можно только используя доменные учетки.

2. Я таки думаю, что сообщение о запрете на запуск системных служб относится к пользователю, под которым вы авторизовались на сервере, т.е. пользователю User. Чтобы разрешить ему что-то подобное, вам все равно понадобятся права администратора.



2



7 / 7 / 6

Регистрация: 02.04.2012

Сообщений: 321

25.03.2017, 15:19

 [ТС]

Помогла инструкция напечатанная ниже, спасибо Dethmontt

Необходимо пропустить ошибку, далее, зайти в управление компьютером, открыть список служб, найти там Агента сервера 1С:Предприятие — зайти в свойства службы и указать под кем запускаться — Запустить и радоваться =)))



0



0 / 0 / 0

Регистрация: 17.09.2014

Сообщений: 6

14.10.2021, 01:18

MrRuslanBB, для того, чтобы был доступ к службе от имени, создаваемого установщиком, пользователя USR1CV8, можно добавить его в группу администраторов, поскольку он после создания будет находится в группе пользователей. И поэтому даже, если дать ему полный доступ к данному сервису, скажем, через консольную команду sc, то запустить службу система вам все равно не даст (поскольку будет отсутствовать доступ на запуск дочерних служб). Либо же придется выдавать данному пользователю соответствующие права для каждой дочерней службы.



0



Супер-модератор

8813 / 4716 / 571

Регистрация: 13.03.2013

Сообщений: 16,759

Записей в блоге: 16

14.10.2021, 06:24

Сообщение от MrRuslanBB

Необходимо пропустить ошибку

Неверный подход, в Вашем случае учетная запись «USR1CV8» либо не была создана, либо у нее отсутстовали права на запуск служб.
В первом случае необходимо либо создать учетку, либо выставить запуск службы от имени системной учетной записи (NT AUTHORITY\SYSTEM).
Во втором случае необходимо открыть «gpedit.msc=>Конфигурация компьютера=>Конфигурация Windows=>Параметры безопасности=>Назначение прав пользователя» и добавить учетку «USR1CV8» в пункты «»Вход в качестве пакетного задания» и «Вход в качестве службы».



0



0 / 0 / 0

Регистрация: 17.09.2014

Сообщений: 6

14.10.2021, 15:01

Maks, учетка создается и остается в системе даже, если отменить установку, разве только её не удалить вручную. Просто у неё нет соответствующих прав для работы со службой и дочерних, от которой она зависит. Это косяк тех, кто пилил инсталятор. Она включена в группу «Пользователи», а они не обладают данными привилегиями. Можно, конечно, и под системной учеткой запускать, работать будет. Но все же целесообразнее для такой цели выделить отдельного пользователя.



0



BasicMan

Эксперт

29316 / 5623 / 2384

Регистрация: 17.02.2009

Сообщений: 30,364

Блог

14.10.2021, 15:01

Помогаю со студенческими работами здесь

При попытке включить службы через просмотр локальных служб пишет отказано в доступе
Помогите пожалуйста у меня с ноутбуком такя проблема: с последнего включения выключились службы аваст и в автозагрузке тоже выключен, при…

Запуск служб на CentOS6
Сайт располагался на 2 серверах, на первом — nginx + php-fpm, на втором — mysql. После переноса на второй сервер (CentOS6) всей информации…

Медленный запуск приложений и служб в ХР SP-3
Всех приветствую.
Проявилась на компьютере Intel 910GL,P-IV, ОЗУ-2Г Windows XP-SP3,
такая ситуация:
1-Начал медленно грузиться. …

Запуск/остановка служб удаленно
сабж, возможно? и что использовать необходимо, заранее благодарен

Перезапуск, запуск и остановка служб
Всем привет.
Хочу реализовать перезапуск нескольких служб, использую для этого следующий код:

var startInfo = process.StartInfo; …

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

6

Новые блоги и статьи

Все статьи  

Все блоги / 

Распределенное обучение с TensorFlow и Python

AI_Generated 05.05.2025

В машинном обучении размер имеет значение. С ростом сложности моделей и объема данных одиночный процессор или даже мощная видеокарта уже не справляются с задачей обучения за разумное время. Когда. . .

CRUD API на C# и GraphQL

stackOverflow 05.05.2025

В бэкенд-разработке постоянно возникают новые технологии, призванные решить актуальные проблемы и упростить жизнь программистам. Одной из таких технологий стал GraphQL — язык запросов для API,. . .

Распознавание голоса и речи на C#

UnmanagedCoder 05.05.2025

Интеграция голосового управления в приложения на C# стала намного доступнее благодаря развитию специализированных библиотек и API. При этом многие разработчики до сих пор считают голосовое управление. . .

Реализация своих итераторов в C++

NullReferenced 05.05.2025

Итераторы в C++ — это абстракция, которая связывает весь экосистему Стандартной Библиотеки Шаблонов (STL) в единое целое, позволяя алгоритмам работать с разнородными структурами данных без знания их. . .

Разработка собственного фреймворка для тестирования в C#

UnmanagedCoder 04.05.2025

C# довольно богат готовыми решениями – NUnit, xUnit, MSTest уже давно стали своеобразными динозаврами индустрии. Однако, как и любой динозавр, они не всегда могут протиснуться в узкие коридоры. . .

Распределенная трассировка в Java с помощью OpenTelemetry

Javaican 04.05.2025

Микросервисная архитектура стала краеугольным камнем современной разработки, но вместе с ней пришла и головная боль, знакомая многим — отслеживание прохождения запросов через лабиринт взаимосвязанных. . .

Шаблоны обнаружения сервисов в Kubernetes

Mr. Docker 04.05.2025

Современные Kubernetes-инфраструктуры сталкиваются с серьёзными вызовами. Развертывание в нескольких регионах и облаках одновременно, необходимость обеспечения низкой задержки для глобально. . .

Создаем SPA на C# и Blazor

stackOverflow 04.05.2025

Мир веб-разработки за последние десять лет претерпел коллосальные изменения. Переход от традиционных многостраничных сайтов к одностраничным приложениям (Single Page Applications, SPA) — это. . .

Реализация шаблонов проектирования GoF на C++

NullReferenced 04.05.2025

«Банда четырёх» (Gang of Four или GoF) — Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес — в 1994 году сформировали канон шаблонов, который выдержал проверку временем. И хотя C++ претерпел. . .

C# и сети: Сокеты, gRPC и SignalR

UnmanagedCoder 04.05.2025

Сетевые технологии не стоят на месте, а вместе с ними эволюционируют и инструменты разработки. В . NET появилось множество решений — от низкоуровневых сокетов, позволяющих управлять каждым байтом. . .

Наверх

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Как создать точку восстановления windows server 2008 r2
  • Как сделать видео фоном рабочего стола windows 10
  • Отключение защитника windows 10 gpedit
  • Kb2913751 windows 7 x64
  • Авито ноутбук windows xp