Работа с параметрами пользователей Windows Terminal Server

Статья даёт ответы на следующие вопросы:

  • Как получить список локальных пользователей Windows Terminal Server 2003?
  • Как получить для пользователя терминального сервера параметр запускаемой при входе программы?
  • Как изменить для пользователя терминального сервера параметр запускаемой при входе программы?

Может использоваться для проверки текущих параметров запуска локальных пользователей терминального сервера, а также при некоторых доработках - для установки нужных параметров запуска. Пример области применения - администрирование терминальных пользователей решений 1С, не использующих стандартный тонкий клиент 1С.

Для решения задачи создадим в Visual Studio 2010 новый проект типа Windows Console Application на языке C#. Весь код будем размещать в процедуре Main().
Вначале требуется подключение необходимых библиотек из пакета ADModify.NET.
Добавим в Solution Explorer в разделе References библиотеки ActiveDs.dll и TSUSEREXLib.dll.
Далее пропишем команды импорта необходимы библиотек:

using System.DirectoryServices;
using System.Runtime.InteropServices;

Библиотеки нужны для работы с пользователями Windows Server (ActiveDirectory, а также локальными), а также для расширенной работы с пользователями терминального сервера.

Далее выполним чтение и вывод на экран всех локальных пользователей терминального сервера:

DirectoryEntry localDir = new DirectoryEntry("WinNT://" + Environment.MachineName + ",Computer");
foreach (DirectoryEntry nodeDir in localDir.Children)
{
       if (nodeDir.SchemaClassName == "User")
       {
              Console.WriteLine("USER={0}", nodeDir.Name);
       }
}

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

 string nameUser;
            Console.WriteLine("name? ");
            nameUser = Console.ReadLine();
            try
            {
                DirectoryEntry user_ = new DirectoryEntry("WinNT://" + Environment.MachineName + "/" + nameUser);

                ActiveDs.IADsUser localUser = (ActiveDs.IADsUser)user_.NativeObject;

                string s = ((TSUSEREXLib.IADsTSUserEx)localUser).TerminalServicesInitialProgram;
                Console.WriteLine(s);
            }
            catch (Exception e)
            {
                Console.WriteLine("{0} Exception caught.", e);
            }

Если нужно отредактировать параметр запуска можно использовать следующую конструкцию:

            try
            {
                DirectoryEntry userDE = localDir.Children.Find(nameUser, "user");
                ActiveDs.IADsUser iADsUser = (ActiveDs.IADsUser)userDE.NativeObject;
                TSUSEREXLib.IADsTSUserEx m_TsUser = (TSUSEREXLib.IADsTSUserEx)iADsUser;
                m_TsUser.TerminalServicesInitialProgram = "c:\\progra~1\\1cv8\\bin\\1cv8.exe"; 
                m_TsUser.TerminalServicesWorkDirectory = Environment.GetEnvironmentVariable("windir");
                userDE.CommitChanges();
            }
            catch (Exception e)
            {
                Console.WriteLine("{0} Exception caught.", e);
            }

Полный код на C# представлен ниже:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;
using System.Runtime.InteropServices;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            DirectoryEntry localDir = new DirectoryEntry("WinNT://" + Environment.MachineName + ",Computer");
            foreach (DirectoryEntry nodeDir in localDir.Children)
            {
                if (nodeDir.SchemaClassName == "User")
                {
                    Console.WriteLine("USER={0}", nodeDir.Name);
                }
            }
            string nameUser;
            Console.WriteLine("name? ");
            nameUser = Console.ReadLine();
            try
            {
                DirectoryEntry user_ = new DirectoryEntry("WinNT://" + Environment.MachineName + "/" + nameUser);

                ActiveDs.IADsUser localUser = (ActiveDs.IADsUser)user_.NativeObject;

                string s = ((TSUSEREXLib.IADsTSUserEx)localUser).TerminalServicesInitialProgram;
                Console.WriteLine(s);
            }
            catch (Exception e)
            {
                Console.WriteLine("{0} Exception caught.", e);
            }
            try
            {
                DirectoryEntry userDE = localDir.Children.Find(nameUser, "user");
                ActiveDs.IADsUser iADsUser = (ActiveDs.IADsUser)userDE.NativeObject;
                TSUSEREXLib.IADsTSUserEx m_TsUser = (TSUSEREXLib.IADsTSUserEx)iADsUser;
                m_TsUser.TerminalServicesInitialProgram = "c:\\progra~1\\1cv8\\bin\\1cv8.exe"; 
                m_TsUser.TerminalServicesWorkDirectory = Environment.GetEnvironmentVariable("windir");
                userDE.CommitChanges();
            }
            catch (Exception e)
            {
                Console.WriteLine("{0} Exception caught.", e);
            }
            Console.WriteLine("Write successful");
            Console.ReadKey();
        }
    }
}

Тэги: