文字列を一文字ずつチェックして、いわゆる「ダメ文字」が含まれていないかどうか調べる。 文字列中の文字を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; // ダメ文字は含まれていない
  }
}
Imports System
Imports System.Text

Class Sample
  Shared Sub Main()
    ' Shift-JISに変換した場合にダメ文字が含まれるかチェックする
    Dim shiftjis As Encoding = Encoding.GetEncoding(932)

    For Each str As String In New String() { _
      "ソフトウェア", _
      "シンポジウム", _
      "六十年", _
      "竹取物語", _
      "ダメ文字" _
    }
      Console.Write("{0} → ", str)

      ' 文字列中のダメ文字のインデックスを取得する
      Dim posNGChar As Integer = IndexOfShellSpecialChar(str, shiftjis)

      If posNGChar = -1 Then
        Console.WriteLine("ダメ文字は含まれていません")
      Else
        Console.WriteLine("'{0}'はダメ文字です", str(posNGChar))
      End If
    Next
  End Sub

  Private Shared Function IndexOfShellSpecialChar(ByVal text As String, ByVal encoding As Encoding) As Integer
    Dim chars As Char() = text.ToCharArray() ' 文字列をchar配列に変換
    Dim buffer(3) As Byte ' 任意の1文字のバイト表現を格納するバッファ
    Dim encoder As Encoder = encoding.GetEncoder()

    encoder.Reset()

    ' 1文字ずつチェックする
    For index As Integer = 0 To chars.Length - 1
      ' 1文字をエンコードしてバイト列を取得する
      Dim len As Integer = encoder.GetBytes(chars, index, 1, buffer, 0, False)

      ' エンコードした文字の2バイト目以降をチェックする
      For i As Integer = 1 To len - 1
        If buffer(i) = &h5C Then
          ' バックスラッシュ &h5Cの場合 (「ソ系」ダメ文字)
          Return index
        Else If buffer(i) = &h7C Then
          ' パイプ 0x7cの場合 (「ポ系」ダメ文字)
          Return index
        End If
      Next
    Next

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