無料版のMicrosoft Teamsのリモート操作でサーバーをメンテナンス

前回、紹介させて頂きました、「無料版のMicrosoft TeamsでゲストユーザとWeb会議をする方法」の応用例です。

在宅勤務や、出張自粛が励行される中でも、お客さんのサーバをメンテする必要がでることもあると思います。
また、サーバのメンテにおいては、サーバー室に出入りせずに、リモートデスクトップで行うケースも多いと思います。
今回は、Microsoft Teamsと、リモートデスクトップを活用して、リモートでサーバメンテを実施する方法についてです。

接続のイメージは以下のとおりです。


メンテ対象サーバーへの接続の流れは以下の通りです。





ポイントは、⑧の部分でウィンドウを小さくしておく点です。
これにより、被サポート側は、自分のPCで別作業を行いながら、サポートを受けることができます。
また、現段階では、接続上限時間は8時間となっていますので、長時間のメンテナンスでも活用できそうです。

コロナ騒動前は、セキュリティのしっかりしたリモートサポートツールを導入しようとすれば、
年間数十万円のライセンス料も珍しくなかったのですが、今回の方法だと無料です。

コロナ騒動での外出禁止のなかでの「事業継続」、「移動時間の節約」と重宝しております。


厳選Windowsショートカット集

 

日本語入力(Microsoft IME)のショートカット

変換操作ショートカットキー代替キー
ひらがなに変換「Ctrl + U」F6
全角カタカナに変換「Ctrl + I」F7
半角に変換「Ctrl + O」F8
全角英数に変換「Ctrl + P」F9
半角英数に変換「Ctrl + T」F10

C#でファイルの拡張プロパティを取得/編集する方法

 

  • NuGetでWindowsAPICodePack-Shellをインストール。
  • 以下のコードで取得/編集ができる。
    using Microsoft.WindowsAPICodePack.Shell;
    using Microsoft.WindowsAPICodePack.Shell.PropertySystem;

    public void FilePropertiesTest() {
        var file = ShellFile.FromFilePath(@"C:\Temp\test.jpg");
        //拡張プロパティ取得
        Console.WriteLine(file.Properties.System.Title.Value);
        Console.WriteLine(file.Properties.System.Author.Value);
        Console.WriteLine(file.Properties.System.Comment.Value);

        //拡張プロパティセット
        ShellPropertyWriter propertyWriter =  file.Properties.GetPropertyWriter();
        propertyWriter.WriteProperty(SystemProperties.System.Title, new string[] { "タイトル" });
        propertyWriter.WriteProperty(SystemProperties.System.Author, new string[] { "著者" });
        propertyWriter.WriteProperty(SystemProperties.System.Comment, new string[] { "コメント" });
        propertyWriter.Close();
    }

Outlookで送信前に宛先確認ダイアログを表示する方法

 

Outlookで送信前に宛先確認ダイアログを表示する方法

  • Alt + F11を押して、VBAエディタを表示。
  • 以下のスクリプトをThisOutlookSessionに記述してください。
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    '件名未記入の確認
    If Item.Subject = "" Then
        If MsgBox("このメッセージには件名がありません。" & vbCrLf & _
            "[OK] をクリックすると送信します。", vbOKCancel + vbExclamation + vbMsgBoxSetForeground) = vbCancel Then
            Cancel = True
            Item.GetInspector.Activate
            Exit Sub
        End If
    End If
    '送信確認ダイアログ
    If MsgBox("宛先、添付ファイル、文面を再度確認してください。" & vbCrLf & _
        "送信しますか?", vbOKCancel + vbQuestion + vbMsgBoxSetForeground) = vbCancel Then
        Cancel = True
        Item.GetInspector.Activate
        Exit Sub
    End If
End Sub

C#でEveryoneフルコントロール権限を付与

 

Everyoneフルコントロール権限を付与

public class ExchangeUtil : PublicWebApiUtil {
    /// Everyoneフルコントロール権限を付与
    /// 処理対象パス
    public static void AddFullControleRule(string filePath) {
        //EveryOneFullControle
        var rule = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, 
            InheritanceFlags.None, PropagationFlags.None, AccessControlType.Allow);

        //ファイルセキュリティオブジェクトを取得
        FileSecurity security = File.GetAccessControl(filePath);
        //権限付与
        security.AddAccessRule(rule);
        //変更したファイルセキュリティをファイルに設定
        File.SetAccessControl(filePath, security);
    }
}

C#でファイルがロックされているかどうか判定

 

ファイルがロックされているかどうか判定

public class ExchangeUtil : PublicWebApiUtil {
    /// ファイルが開かれてロックされているかどうか
    /// true:ロックされている/false:されていない
    public static bool IsFileLocked(string path) {
        FileStream stream = null;
        if (!File.Exists(path)) {
            return false;
        }
        try {
            stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
        } catch {
            return true;
        }
        finally {
            if (stream != null) {
                stream.Close();
            }
        }
     
        return false;
    }
}

C#でISO8601形式の継続時間文字列をTimeSpanに変換

 

ISO8601形式の継続時間文字列をTimeSpanに変換

public class ExchangeUtil : PublicWebApiUtil {
    /// 
    /// ISO8601形式の文字列をTimeSpanに変換します。
    /// 
    /// ISO8601形式の文字列
    /// 
    public static TimeSpan Iso8601ToTimeSpan(string iso8601) {
        if (iso8601 == null || iso8601 == "") {
            //0秒で返す。
            return new TimeSpan(0, 0, 0);
        }
        TimeSpan? ret = null;
        int index = iso8601.IndexOf("D");
        if (index > 0) {
            //日付部("P1D")が存在する場合
            string strDays = iso8601.Substring(0, index);
            TimeSpan days = new TimeSpan(int.Parse(strDays.Replace("P", "")), 0, 0, 0);
            ret = days;

            //時間部が存在する場合
            index = iso8601.IndexOf("DT");
            if (index > 0) {
                TimeSpan other = XmlConvert.ToTimeSpan("PT" + iso8601.Substring(index + 2));
                ret = days.Add(other);
            }
        } else {
            ret =  XmlConvert.ToTimeSpan(iso8601.Replace("P", "PT"));
        }
        return new TimeSpan(ret.Value.Days, ret.Value.Hours, ret.Value.Minutes, 0);
    }
}

厳選 Visual Studioの便利なショートカット

  エラー箇所にジャンプ 「Ctrl + Shift + F12」 ブレークポイント 設定/解除 「F9」 有効化/無効化 「Ctrl + F9」 ViEmu特有 「:ls」:バッファナンバーのリストを表示。 「:b2」:バッファ2のファイルを開く。 「:n」:次のバッファのファ...