Статья даёт ответы на следующие вопросы:
- Как получить список локальных пользователей 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(); } } }