Не создается задача в планировщике для текущего пользователя в Windows-домене

217
27 июня 2017, 21:04

Задача: сделать автозагрузку программы с админскими правами (установлена в Program Files). Программа использует Long Polling для установления длительного соединения с сервером, и по этому соединению получает команды (открыть окно в браузере при наступлении события).

Есть код, который должен создавать задания в планировщике заданий для каждого пользователя (или группы пользователей).

файл: \WindowsFormsApp1\WindowsFormsApp1\Installer1.cs

using (var computerEntry = new DirectoryEntry(path))
{
    var userNames = from DirectoryEntry childEntry in computerEntry.Children
                    where childEntry.SchemaClassName == "User"
                    select childEntry.Name;
    int i = 0;
    foreach (var name in userNames)
    {
        using (TaskService ts = new TaskService())
        {
            try
            {
                string taskname = "MyProgramRun" + i.ToString();
                TaskDefinition td = ts.NewTask();
                td.RegistrationInfo.Description = "RUN MyProgram Every Logon";
                td.Triggers.Add(new LogonTrigger { Delay = TimeSpan.FromSeconds(30) });
                td.Actions.Add(new ExecAction(Context.Parameters["path"], null, null));
                td.Principal.RunLevel = TaskRunLevel.Highest;
                ts.RootFolder.RegisterTaskDefinition(taskname, td, TaskCreation.CreateOrUpdate, name, null, TaskLogonType.None);
            }
            catch { }
        }
        i++;
    }
}

Данный код на обычном домашнем компе создает четыре задания в планировщике (по одному для каждого юзера); и во время загрузки системы срабатывает одно из правил, в зависимости от того под кем грузимся.

Однако на компьютере внутри организации, где компьютеры работают не в группе (например WORRKGROUP), а в локальном домене, задания для текущего юзера (который устанавливает программу) - не создается!

Вот задания, которые создает данный код, запускаемый на компьютере в локальном домене, из-под пользователя локального домена:

MyProgramRun0 - DefaultAccout (PC-NAME)  
MyProgramRun1 - localusr (PC-NAME)  
MyProgramRun2 - Администратор (PC-NAME)  
MyProgramRun3 - Гость (PC-NAME) 

Но задачи для нашего текущего юзера, под которым работает пользователь; под которым он устанавливает программу; и под которым эта программа должна грузиться - не создается.

При этом, юзер в группе Администраторы.

Как написать код, который будет создавать задания для пользователей домена, а не только для локальных пользователей?

Пользователь домена выглядит как: COMPANYNAME\user.name

Если положить исполняемый файл в реестр:
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

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

Варианта видится два:

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

2). Заставить программу создавать задачи в планировщике в том числе для пользователей домена

Кусок кода где создается соединение:
\WindowsFormsApp1\WindowsFormsApp1\LongPoll.cs

public void Poling() {
    string url = IPs.Default.IPServer + IPs.Default.IPpoll;//Адресс сервера,  куда отправляем запросы
    string Respurl;
    while (poll) {
        try {
            if (UserName != null && Password != null) {
                string postString = String.Format("LoginForm[manager]={0}&LoginForm[password]={1}", Uri.EscapeDataString(UserName), Uri.EscapeDataString(Password));
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);//создаем запрос к нашему серверу
                request.Method = "POST";
                StreamWriter requestWrite = new StreamWriter(request.GetRequestStream());//создаем поток для записи запроса
                request.ContentType = "application/x-www-form-urlencoded";
                requestWrite.Write(postString);
                requestWrite.Close();
                HttpWebResponse resp = (HttpWebResponse)request.GetResponse();//отправляем запрос, получаем ответ
                Stream dataStream = resp.GetResponseStream(); //поток для записи ответа
                XmlDocument XdocTime = new XmlDocument();
                XdocTime.Load(dataStream);//загружаем хмл док
                XmlNode xNode = XdocTime.DocumentElement;
                Respurl = xNode.FirstChild.InnerText;
                Process.Start(IPs.Default.IPServer + Respurl);
            } else { }
        } catch { }
    }
}
READ ALSO
EntityFramework + Firebird как подключить - C#

EntityFramework + Firebird как подключить - C#

Добрый день! Уже целый день пытаюсь подружить Firebird с EntytiFramework и не получаетсяДелал всё по инструкции https://habrahabr

202
Битые ссылки на сайте [требует правки]

Битые ссылки на сайте [требует правки]

Есть сайт на котором присутствуют битые ссылки(которые ведут на 404), как с помощью C# найти эти ссылки и удалить адрес куда они ведут? То есть...

213
Не определена функция в firefox расширении

Не определена функция в firefox расширении

Разрабатываю расширение для firefox, возникла необходимость добавлять обработчик события при нажатии на определенный элемент на сайте

218
Ошибка «undefined is not an object (evaluating 'i.getBoundingClientRect')»

Ошибка «undefined is not an object (evaluating 'i.getBoundingClientRect')»

Есть вот такой код, который возвращает ошибку

200