четверг, 26 ноября 2009 г.

Обновление RDP лицензий Windows для rdesktop

Для работы RDP (если использовать в качестве клиента RDP rdesktop) достаточно запустить Лицензирование служб терминалов и клиенты получат временные лицензии (на 90 или 120 дней). Это период отсрочки на получение лицензий. Этот период можно продлить, получив новые временные клиентские лицензии.
Для этого необходимо в строке запуска rdesktop указать параметр нового имени хоста для которого мы хотим получить лицензию:
# rdesktop -n new_client_hostname server
Если бегло взглянуть на исходный код rdesktop 1.6, можно увидеть попытку сохранения лицензий в файл $HOME/.rdesktop/licence.new и переименовывания в файл $HOME/.rdesktop/licence.$HOSTNAME
void
save_licence(unsigned char *data, int length)
{
 char *home, *path, *tmppath;
 int fd;

 home = getenv("HOME");
 if (home == NULL)
  return;

 path = (char *) xmalloc(strlen(home) + strlen(g_hostname) + sizeof("/.rdesktop/licence."));

 sprintf(path, "%s/.rdesktop", home);
 if ((mkdir(path, 0700) == -1) && errno != EEXIST)
 {
  perror(path);
  return;
 }

 /* write licence to licence.hostname.new, then atomically rename to licence.hostname */

 sprintf(path, "%s/.rdesktop/licence.%s", home, g_hostname);
 tmppath = (char *) xmalloc(strlen(path) + sizeof(".new"));
 strcpy(tmppath, path);
 strcat(tmppath, ".new");

 fd = open(tmppath, O_WRONLY | O_CREAT | O_TRUNC, 0600);
 if (fd == -1)
 {
  perror(tmppath);
  return;
 }

 if (write(fd, data, length) != length)
 {
  perror(tmppath);
  unlink(tmppath);
 }
 else if (rename(tmppath, path) == -1)
 {
  perror(path);
  unlink(tmppath);
 }

 close(fd);
 xfree(tmppath);
 xfree(path);
}
И чтения от туда же:
int
load_licence(unsigned char **data)
{
 char *home, *path;
 struct stat st;
 int fd, length;

 home = getenv("HOME");
 if (home == NULL)
  return -1;

 path = (char *) xmalloc(strlen(home) + strlen(g_hostname) + sizeof("/.rdesktop/licence."));
 sprintf(path, "%s/.rdesktop/licence.%s", home, g_hostname);

 fd = open(path, O_RDONLY);
 if (fd == -1)
  return -1;

 if (fstat(fd, &st))
  return -1;

 *data = (uint8 *) xmalloc(st.st_size);
 length = read(fd, *data, st.st_size);
 close(fd);
 xfree(path);
 return length;
}
В установленной версии 1.5 тоже есть такие-же шаблоны.
# strings rdesktop | grep .rdesktop/lic
%s/.rdesktop/licence.%s
%s/.rdesktop/licence.%s
Но сохранённых лицензий на давно работающей системе нет (пользователи работают с rdesktop).
Участник конференции на freshmeat louigi600 предложил даже скрипт обёртку для rdesktop генерирующий новое имя хоста (перед этим он пробует использовать все имеющиеся).
Для устройств SunRay удалить старые лицензии можно так.
Для устройств Windows удалить старые лицензии можно так.

Комментариев нет:

Что мне интересно - общие элементы Google Reader