リモートデスクトップの重複対策を考える


■リモートデスクトップの重複ログイン対策を考える
社内で結構使用頻度が高いので対策を考える事にしました。
リモートデスクトップ(以下RDP)は重複ログインできないので中々難しい問題。使用人数も少ないので報告が雑になってる部分があるんですよね。

本来であればTeams等の管理ツールに〇〇が~時まで使用しますとか書けば良いんでしょうけど人間は基本的に学ばない生き物なのです。
(というか私も面倒でよく言い忘れます)

■実行環境+前置き

去年あたりから合間合間にPythonの自主勉強をしていまして、
今回の成果物はその一環になります。クオリティは目をつぶりましょう。
・Python3.6(.exe作成にtkinter使用)
・VSC(デスクトップ版使用)
で作成したものを.exeにて配布。

・以下使用モジュール

#tkinerのインポート
import tkinter
#メッセージボックス表示に使用
from tkinter import messagebox
#ドロップダウンボックス用モジュール
import tkinter as tk
import tkinter.ttk as ttk
#ファイル名一覧を取得
import os
#指定ファイルの実行
import subprocess
#teams API
import pymsteams

前作ったのコピペしてるんで不要なモジュールもあるかもしれない。

■アプリ仕様・目的

画像2

使用者+実行環境を選択後、『接続&開始通知』を押すと選択したRDPが起動しメンバーの所にTeamsから通知が飛ぶようになっています。終了後は『終了通知』を押して使用が終わったことを知らせます。

画像2

note用に名前変えるの面倒だったので黒塗りで失礼します。

一応通知以外の目的としては使用者でRDPの実行環境を統一するってのと一々選ぶのが面倒だったのでリスト管理できるようにしたって感じですね。
後述しますがRDPのリストは社内のファイルサーバーに繋がっています。

■メンテナンス性を考える

基本的にPythonのメンテ出来るのが自分だけなのでせめてRDP実行環境のメンテナンスくらいは他の人も出来るようにする必要がありました。
(何のこっちゃいって人は「.rdpファイル 作成」とかで調べてください。

各々作った.rdpを下記コード内に記載されたフォルダ内に入れておけばそれが共有されてドロップダウンリストから選べるようになっています。
名称の変更とか使わなくなったものとか一々こちらで管理するの面倒なんでメンテナンスは後の人に任せていきます。

#配列リスト作成定義
remote = []  #リモートデスクトップ一覧 
#ファイル読むときは最初にrを付けないとダメ?
files = os.listdir(r'\\サーバー02\使用課\remotedesktop')
for file in files:
   remote.append(files) #.append()指示で配列に追加 

#ドロップダウンリスト2  
txt_2 = ttk.Combobox(tki, state="readonly",width=40)
txt_2["value"] = list(files)
txt_2.place(x=89, y=110)

Tkinter使ってるからなのかよく分からないんですけどファイルへのアクセスするときにr'ファイル名'って付けないと何か上手く行かないんですよね。
「python ファイル内の名称取得」とかで調べてあれこれやってたんですがその方法だと全然上手く行かなくて結構時間を取られる事に。

ここでやっているのは単なる名称の取得です。
該当のフォルダにアクセスして中にあるファイルの名前だけ取得してます。
remote =[] という空の入れ物に名称を順々に入れています。
ファイルは社内の使用者が触れる場所に置いておきます。

逆に使用者はベタ打ちしました。(異動なんて滅多にないので多少はね)

#配列リスト作成定義
Lists1 = []  #田中
Lists2 = []  #佐藤
Lists3 = []  #吉田
Lists4 = []  #山本
#情報を配列に追加
name = { '田中' : (Lists1),
        '佐藤' : (Lists2),
        '吉田' : (Lists3),
        '山本' : (Lists4),}
#担当者ドロップダウンリスト
txt_1 = ttk.Combobox(tki, state="readonly",width=16)
txt_1["value"] = list(name.keys())
txt_1.place(x=89, y=80)

実際結構無駄な事してるんですけど色々面倒だったので前作ったやつをそのままコピペしました。戒めのために残しておく。

■接続実行のコード

#実行
def mrk_click():
   #選択項目のフィールド名取得&文字フィールド変換
    remoten1 = txt_1.get() #実行者
    remoten2 = remoten1.replace(' ', '') #スペーストリム 
    remotej1 = txt_2.get() #実行.rdpファイル
    remotej2 = remotej1.replace(' ', '') #スペーストリム
    if remoten2 == '' or remotej2 == '' : #項目抜けがどっちかにあればエラーにする。
     messagebox.showerror('エラー!', '項目抜けがあります!確認してください!')
    else:
     #選択項目の文字抜き出し
     link = r'\\サーバー02\使用課\remotedesktop\ '+remotej2 #必ずファイル前にrを入れる事!
     link2 = link.replace(' ', '')  # \接続はスペース開けないと文字結合が出来ないので最後にトリミングする
     subprocess.Popen(["start","",link2],shell=True) #選択対象の実行

​やってる事はかなりシンプルで、接続ボタンを押したら名称・接続環境の名前を取得してそれを実行するって感じです。

ちなみにドロップダウンリストで表示される項目は文字フィールドじゃないので加工するために一度文字フィールドに変換する必要があります。
remotej1 = txt_2.get() #実行.rdpファイル
の部分ですね。txt_2はRDPドロップダウンリストの項目名です。

とりあえずアプリ内で取得した情報や入力した情報を加工したい場合はまず数字/文字フィールドに変換してあげる必要があります。
でないと実行先ファイル名の取得が出来ないんですよね。
この(項目名)は文字じゃないので使えません!とエラーになります。

#スペーストリム部分では余計な空白部分を削除しています。
名称のフィールド数値を多くとっているのでやっておかないと
≪ 山田    が(実行環境名)  での接続を開始しました ≫
のようになるんですよね。
他に何か良いやり方あるのか分からないので現状これで対処しています。
で以下がかなり力技の部分。もうちょっと奇麗に記述できないものか・・・
link = r'\\サーバー02\使用課\remotedesktop\ '+remotej2 
link2 = link.replace(' ', '') 
subprocess.Popen(["start","",link2],shell=True) #選択対象の実行
実行前に選択した.rdpファイルの名称をくっ付けて空白部分を消して対象を起動するって感じですね。実行先の名称を変数にしておけばメンテナンスの必要が無くなるのでこの辺の処理は必須かなと思います。

後はPythonの仕様なのか分からないんですけどファイルの『\』の後に+で文字接続が出来ないんですよね・・・。エラーになる。
(何故かその後に半角スペース入れると行ける模様)
そのため『rdp\  '』部分の半角スペースは意図的にやっています。
以下はTeamsの通知部分。

#Teamsへのbot通知
  myTeamsMessage = pymsteams.connectorcard("該当のurl")
  myTeamsMessage.title("≪ 使用通知  " + remoten2 + "さんが" + remotej2 + "の接続を開始しました! ≫")
  myTeamsMessage.text(remotej2 +"は使用中です!")
  myTeamsMessage.send()

これやるだけで終わりです。

『pymsteams Python』とかで調べると一発で出て来るので、やり方見てそこのソースコードコピペすれば普通に出来ます。あまりに簡単すぎてビックリした。Teamsで簡単に設定した後にモジュール追加して4行書くだけでbotになるのはたまげた。

最初はlineでbot作ろうと思っていたので・・・。
あっちは手間半端なくて果てしなく面倒なんですよね・・・。

とまあ色々使い勝手が悪い部分もありますが2~3時間クオリティなのでもうちょっと練れる部分もあると思います。

謎の個人ブログに助けられる機会が多かったので自分も勉強の成果物がてらログを残すことにしました。

普段の業務の合間にやってるので更新低めですがモチベ維持のためにももう少し色々やっていきたい。



いいなと思ったら応援しよう!