文字列を一文字ずつチェックして、いわゆる「ダメ文字」が含まれていないかどうか調べる。 文字列中の文字を1文字ずつバイト表現に変換し、変換した2バイト目以降をチェックして、0x5c(バックスラッシュ記号)なら「ソ系」ダメ文字、0x7c(パイプ記号)なら「ポ系」ダメ文字と判断する。

using System;
using System.Text;

class Sample {
  static void Main()
  {
    // Shift-JISに変換した場合にダメ文字が含まれるかチェックする
    var shiftjis = Encoding.GetEncoding(932);

    foreach (var str in new[] {
      // テストする文字列
      "ソフトウェア",
      "シンポジウム",
      "六十年",
      "竹取物語",
      "ダメ文字"
    }) {
      Console.Write("{0} → ", str);

      // 文字列中のダメ文字のインデックスを取得する
      var posNGChar = IndexOfShellSpecialChar(str, shiftjis);

      if (posNGChar == -1)
        Console.WriteLine("ダメ文字は含まれていません");
      else
        Console.WriteLine("'{0}'はダメ文字です", str[posNGChar]);
    }
  }

  private static int IndexOfShellSpecialChar(string text, Encoding encoding)
  {
    var chars = text.ToCharArray(); // 文字列をchar配列に変換
    var buffer = new byte[4]; // 任意の1文字のバイト表現を格納するバッファ
    var encoder = encoding.GetEncoder();

    encoder.Reset();

    // 1文字ずつチェックする
    for (var index = 0; index < chars.Length; index++) {
      // 1文字をエンコードしてバイト列を取得する
      var len = encoder.GetBytes(chars, index, 1, buffer, 0, false);

      // エンコードした文字の2バイト目以降をチェックする
      for (var i = 1; i < len; i++) {
        if (buffer[i] == 0x5c)
          // バックスラッシュ 0x5cの場合 (「ソ系」ダメ文字)
          return index;
        else if (buffer[i] == 0x7c)
          // パイプ 0x7cの場合 (「ポ系」ダメ文字)
          return index;
      }
    }

    return -1; // ダメ文字は含まれていない
  }
}
実行結果
ソフトウェア → 'ソ'はダメ文字です
シンポジウム → 'ポ'はダメ文字です
六十年 → '十'はダメ文字です
竹取物語 → '竹'はダメ文字です
ダメ文字 → ダメ文字は含まれていません