読者です 読者をやめる 読者になる 読者になる

Skypeを起動してログインするプログラムを作ってみた (ただし、ユーザー名とパスワードが必要)

C#

Skypeでは、自動的にログインするように設定しているにもかかわらず、
起動した時にはログオフされていることがある模様。


再度手動でログインすれば良いのだけれど、
実際の利用者にはパスワードを知らせたくないとか色々とあるようなので、
プログラムを作ってみたときのメモ。
(ただ、パスワードをベタ打ちしているなど、セキュリティ的には問題あり)

■機能

ソースコードに以下を埋めることで、利用者端末などを制限

  • 端末名
  • 端末のユーザー名
  • Skypeのユーザー名とパスワード

■制限

  • 「Environment.SpecialFolder.ProgramFilesX86」「Environment.Is64BitOperatingSystem」を使っているため、.NET4でしか動きません
  • Skypeを任意の場所にインストールした場合、「_programPath」「_skypePath」を修正する必要あり

■プログラムコード

gistは、こちら

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SkypeLogin
{
    public partial class Form1 : Form
    {
        //  「Environment.SpecialFolder.ProgramFilesX86」
        //  「Environment.Is64BitOperatingSystem」を使っているため、.NET4 が必要です


        private string _enabledMachine = <使用する端末名>;
        private string _enabledUser = <使用する端末のユーザー名>;

        private string _user = <Skypeユーザー名>;
        private string _password = <Skypeパスワード>;

        private string _programPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
        private string _skypePath = @"\Skype\Phone\Skype.exe";


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            if (!(Environment.MachineName == _enabledMachine &&
                  Environment.UserName == _enabledUser))
            {
                CloseForm("この端末・ユーザーでは動作しません。");
                return;
            }


            //  64bit OSの場合、デフォルトパスは(x86)になるため、上書きしておく
            if (Environment.Is64BitOperatingSystem)
            {
                _programPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);
            }


            //  Skypeファイルの有無を確認
            if (!(System.IO.File.Exists(_programPath + _skypePath)))
            {
                CloseForm("Skypeがインストールされていないようです。");
                return;
            }


            System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcessesByName("Skype");
            bool hasRun = ps.Any();

            //  WindowsフォームがなくてもSkypeは起動できるので、フォーム自体は閉じておく
            if (hasRun)
            {
                CloseForm("Skypeを一度終了させてから、再度Skypeへログインします。");
            }
            else
            {
                CloseForm("Skypeを起動しています。");
            }




            //  Skypeの停止
            if (hasRun)
            {
                //  Skypeを落とす:ログインできてなくても起動しているため
                string shutdownArgs = "/shutdown";
                System.Diagnostics.Process.Start(_programPath + _skypePath, shutdownArgs);


                for (int i = 0; i < 100; i++)
                {
                    if (i == 99)
                    {
                        CloseForm("Skypeを終了させられませんでした。");
                        return;
                    }


                    if (!(System.Diagnostics.Process.GetProcessesByName("Skype").Any()))
                    {
                        break;
                    }

                    System.Threading.Thread.Sleep(1000);
                }
            }


            //  Skypeの起動
            string args = "/username:" + _user + " /password:" + _password;
            System.Diagnostics.Process.Start(_programPath + _skypePath, args);

        }

        private void CloseForm(string message)
        {
            MessageBox.Show(message);
            this.Close();
        }
    }
}

■参考

SkypeAPIもあるそうですが、今回は見送りました。
Skypeのプロセスがあるかどうかの確認は、以下より。
Program Filesフォルダの取得については、以下より。