2017-07-02 24 views
0

プラグイン(pGinaソフトウェアを使用)を実装して、ユーザがNFCタグをスキャンしてコンピュータのユーザ名/パスワードを認証できるようにしました。C#で静的メソッドを呼び出す

タグIDを読み取るためにCSharp PC/SC Wrapper for .NETと呼ばれるプログラムを使用しました。タグがスキャンされるたびに、プログラムはIDをテキストファイルに書き込み、そのIDが文字列に設定されているIDと同じであることをチェックします。

if (userInfo.Username.Contains("hello") && userInfo.Password.Contains("pGina") 
    && text.Equals("UID = 0x04 82 EC BA 7A 48 80")) 

プラグインは、ID(PC/SC Wrapper)を読み取る.exeファイルを見つけるように設定されています。すべてうまく動作します。しかし、私は読者のプログラムが別のファイルに存在することはありません。私はプラグインファイルにすべてが欲しいです。

メソッドを作成し、タグID(runme())の読み取りを実行するラッパーからコードをコピーしましたが、.exeファイルを呼び出す行をメソッドIに置き換える方法がわかりません

ProcessStartInfo ps = new ProcessStartInfo(@"C:\Users\Student\Desktop\CSharpPCSC\CSharpPCSC\ExamplePCSCReader\bin\Release\ExamplePCSCReader.exe");

任意の提案を作成しましたか?私は以下はPluginImplというクラスを作成し、そのクラスに宣言した

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using pGina.Shared.Types; 
using log4net; 
using System.IO; 
using System.Diagnostics; 
using GS.PCSC; 
using GS.Apdu; 
using GS.SCard; 
using GS.Util.Hex; 
using System.Threading; 

namespace HelloPlugin 
{ 
    public class PluginImpl : pGina.Shared.Interfaces.IPluginAuthentication 
    { 
     private ILog m_logger; 

     private static readonly Guid m_uuid = new Guid("CED8D126-9121-4CD2-86DE-3D84E4A2625E"); 

     public PluginImpl() 
     { 
      m_logger = LogManager.GetLogger("pGina.Plugin.HelloPlugin"); 
     } 

     public string Name 
     { 
      get { return "Hello"; } 
     } 

     public string Description 
     { 
      get { return "Authenticates users with 'hello' in the username and 'pGina' in the password"; } 
     } 

     public Guid Uuid 
     { 
      get { return m_uuid; } 
     } 

     public string Version 
     { 
      get 
      { 
       return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
      } 
     } 

     public void Starting() 
     { 

     } 

     public void Stopping() { } 

     public BooleanResult AuthenticateUser(SessionProperties properties) 
     { 

      UserInformation userInfo = properties.GetTrackedSingle<UserInformation>(); 

      ProcessStartInfo ps = new ProcessStartInfo(@"C:\Users\Student\Desktop\CSharpPCSC\CSharpPCSC\ExamplePCSCReader\bin\Release\ExamplePCSCReader.exe"); 
      Process.Start(ps); 
      Thread.Sleep(2000); 
      string text = File.ReadAllText(@"C:\Users\Student\Desktop\text.txt", Encoding.UTF8); 
      text = text.Trim(); 

      if (userInfo.Username.Contains("hello") && userInfo.Password.Contains("pGina") && text.Equals("UID = 0x04 82 EC BA 7A 48 80")) 
      { 
       // Successful authentication 
       m_logger.InfoFormat("Successfully authenticated {0}", userInfo.Username); 
       return new BooleanResult() { Success = true }; 
      } 
      // Authentication failure 
      m_logger.ErrorFormat("Authentication failed for {0}", userInfo.Username); 
      return new BooleanResult() { Success = false, Message = "Incorrect username or password." }; 
     } 

     static void runme() 
     { 
      ConsoleTraceListener consoleTraceListener = new ConsoleTraceListener(); 
      Trace.Listeners.Add(consoleTraceListener); 

      PCSCReader reader = new PCSCReader(); 
      string cardid = ""; 

      try 
      { 
       reader.Connect(); 
       reader.ActivateCard(); 

       RespApdu respApdu = reader.Exchange("FF CA 00 00 00"); // Get NFC Card UID ... 
       if (respApdu.SW1SW2 == 0x9000) 
       { 
        Console.WriteLine("UID = 0x" + HexFormatting.ToHexString(respApdu.Data, true)); 
        cardid = "UID = 0x" + HexFormatting.ToHexString(respApdu.Data, true); 
        cardid = cardid.Trim(); 
       } 
      } 
      catch (WinSCardException ex) 
      { 
       Console.WriteLine(ex.WinSCardFunctionName + " Error 0x" + 
            ex.Status.ToString("X08") + ": " + ex.Message); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
      finally 
      { 
       string path = @"C:\Users\Student\Desktop\text.txt"; 
       string text2write = cardid; 

       System.IO.StreamWriter writer = new System.IO.StreamWriter(path); 
       writer.Write(text2write); 
       writer.Close(); 

       reader.Disconnect(); 
       Environment.Exit(0); 
       Console.WriteLine("Please press any key..."); 
       Console.ReadLine(); 
      } 
     } 
    } 
} 

答えて

1

IDを読み取るコードを含むメソッドを持つプラグインのための私のコードであるC#

に新たなんです方法runme。どこからでもそのメソッドを呼び出すには、PluginImpl.runme()と書く必要があります。

名前空間HelloPluginにクラスを追加したので、呼び出し元の*.csファイルが別の名前空間にある場合は、先頭にusing HelloPluginというディレクティブが必要です。

すべてです。

質問が間違っている可能性があります。ご質問に再度お答えいただき、私にコメントをお寄せください。あなたが代わりにメソッド呼び出しでライン

ProcessStartInfo ps = new ProcessStartInfo(
     @"C:\Users\Student\Desktop\CSharpPCSC\CSharpPCSC\" 
     +"ExamplePCSCReader\bin\Release\ExamplePCSCReader.exe"); 

を交換する場合は、クラスの中から、あなたの静的メソッドを呼び出しているので


は、あなたがこの

ProcessStartInfo ps = runme(); 

ような何かをしたいですプレフィックスPluginImpl.は必要ありません。

これで、runmeがProcessStartInfoを返さないという不満があります。あなたはrunmeを変更する必要があります。 ProcessStartInfoのサブクラスが行います。

static ProcessStartInfo runme() 
{ 
    // ... Some code 

    ProcessStartInfo toReturn = new ProcessStartInfo(//... 
    ); 

    // ... More code 

    return toReturn; 
} 
+0

一度PluginImpl.runme()を使用すると、ProcessStartInfo()を置き換えてメソッドを呼び出すことができます。 ProcessStartInfo ps =新しいProcessStartInfo(@ "C:¥Users¥Student¥Desktop¥CSharpPCSC¥CSharpPCSC¥ExamplePCSCReader¥bin¥Release¥ExamplePCSCReader.exe"); –

+0

@mj_h私の最近の編集があなたの質問を解決したことを願っています。それでも明らかでない場合は、私に知らせてください。 –

関連する問題