以下記事の続編であり、完成形のソースコードを公開。
特定サーバーにアクセスするためのIDと一致するものだけを許容するプログラムをつくるには(1)
特定サーバーにアクセスするためのIDを取得するための実行部。
ドメイン参加の場合とワークグループ参加の両方を想定している。
using CredentialManagement;
public static string GetIdOfDomain(string domainName, string ServerName)
{
string id = "";
ManagementObject computer_system = new ManagementObject(string.Format("Win32_ComputerSystem.Name='{0}'", Environment.MachineName));
object objPartOfDomain = computer_system["PartOfDomain"];
bool isDmn = (bool)objPartOfDomain;
if (isDmn) // 指定したドメインに参加している
{
object objDomain = computer_system["Domain"];
string dName = objDomain.ToString();
if (dName.ToLower().IndexOf(domainName.ToLower()) != -1) // ドメイン名を含んでいる
id = System.Environment.UserName; // ユーザーネームをIDとして返す
}
computer_system.Dispose();
if (string.IsNullOrEmpty(id))
{
// ワークグループまたは別のドメインに参加しているので、資格情報のサーバー情報から確認する
Credential cm = new Credential();
cm.Target = ServerName;
cm.Type = CredentialType.DomainPassword;
if (cm.Exists()) // 指定したサーバー名の資格情報がある(パスワードを保存している)
{
cm.Load();
id = cm.Username;
int pos = id.LastIndexOf("\\"); // \の右側を取得
if (pos != -1)
id = id.Substring(pos + 1);
}
cm.Dispose();
}
return id;
}
上の実行部を呼び出している箇所
string id = GetIdOfDomain("参加しているドメイン名", "資格情報で管理しているサーバー名");
if (string.IsNullOrEmpty(id)) // idを認識できなかった
{
// エラーだよ
}
ドメイン参加時のIDを取得するには以下の方法でもイケそうだったが、特定マシンでうまくいかなかったので採用せず。
ドメイン名を指定して判定するのがメンドウそうというのもあり。
id = System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName;
「特定サーバーにアクセスするためのIDと一致するものだけを許容する」というのは、ようするに簡易認証。
ドメイン認証やWindows資格認証を実際にやるのではなくて、ログインIDの規則性に着目したもの。
ログインIDに一致したものだけを許容するということであり、例えばログインIDに一致した画像イメージだけで捺印できることとして、自分の画像イメージでしか捺印できないようにする。
だって、いかになんちゃって捺印であったとしても、人の捺印がボンボンできてしまうようなシステムは敬遠されるからね。