くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

2017年02月

C#でLDAP認証

タイトル通り。MSDNにサンプル載ってるから、まーそのままなんですが。。。

//参照にも追加しないとダメ
using System.DirectoryServices;

public bool authLdap(string domain, string username, string pwd)
{
	string lserver = @"LDAP://server.domain.hoge.co.jp";//port:389
	string domainAndUsername = domain + @"\" + username;
	try
	{
	    DirectoryEntry entry = new DirectoryEntry(lserver, domainAndUsername, pwd);
	    //認証しくじるとここで例外が出る。
	    object obj = entry.NativeObject;
	    
	    DirectorySearcher search = new DirectorySearcher(entry);
	    search.Filter = "(SAMAccountName=" + username + ")";
	    SearchResult result = search.FindOne();
	    if (null == result)
	    {
	        return false;
	    }
	}
	catch (Exception ex)
	{
	    Console.WriteLine(ex.Message);
	    return false;
	}
	return true;
}

属性取りたいときはSearchResultのとこで↓の感じ。

DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(SAMAccountName=" + username + ")";
search.PropertiesToLoad.Add("sAMAccountName");//ID
search.PropertiesToLoad.Add("sn");//氏名
search.PropertiesToLoad.Add("displayName");//表示名
search.PropertiesToLoad.Add("givenName");//名前
search.PropertiesToLoad.Add("initials");//イニシャル
search.PropertiesToLoad.Add("description");//説明
search.PropertiesToLoad.Add("mail");//メール
search.PropertiesToLoad.Add("company");//会社名
search.PropertiesToLoad.Add("department");//所属
search.PropertiesToLoad.Add("memberOf");//所属の色々

SearchResult result = search.FindOne();
if (null == result)
{
    return false;
}
//例えばメールアドレスが欲しいとき
if(prm.Properties["mail"].Count > 0)
{
    result = prm.Properties["mail"][0].ToString();
}

で、なんか自分、すごい勘違いしてると思うんだけど、他の言語だと接続用(読み取り用)のアカウントと認証したいユーザって別で書いてると思うのです。なぜだか.netだと、認証したいアカウントだけでやっちゃう。多分他の言語でも接続用と認証したいアカウント同じにすれば同じことなんだろうけど、なんか釈然としない。

.netはこういうもんなのかしら。。。出来れば接続用は分けたいのですが。。。

Redmineのログの設定

Redmineのログにはかれる量を減らしたくなったので、ログのレベルをINFOにする。

と思ってみてたら、出てくる情報が古い古い。そのまま書くと落ちる。

最近のバージョン(とりあえず3.3)では↓の感じで書く。

apps\redmine\htdocs\config\additional_environment.rb
↑に↓を追記

config.log_level = :info

ログレベルとしてはdebug/info/warnあたり

RedmineでLDAP認証

タイトル通り。LDAP認証やる。設定は↓。Redmineの環境としてはWindowsServer2012R2上にBitnamiRedmineでRedmine構築。バージョンは3.3。

管理者でログインして、管理→LDAP認証→新しい認証方式。 sample01

そしたら↓の感じで設定。 sample02

検索範囲は「DC=domain,DC=hoge,DC=co,DC=jp」みたいにする。これはつなぎ先のLDAP次第。

で、アカウント使う場合は「user@domain.hoge.co.jp」みたいに@の後ろもつけないと上手くいかなかった。

アカウントをLDAPをもとに作る場合は属性を指定しておく。空欄にしてると、新規ユーザ来たときは入力画面に飛ばされる。

属性はココのサイトが見やすい。

Redmine ナレッジベースのエラー

Redmineのプラグインで「ナレッジベース(Knowledgebase)」を使ってる際に、稀にエラー(internal error)になる事がある。

これの理由が記事のカテゴリがなくなった場合。こうなると裏でデータ補正するしかない。

bitnamiのRedmineを使ってる場合は「use_redmine.bat」でコンソール上げる。そしたらMySQLにつなげる。

MySQLにつなげる
mysql -u root -p

redmineのDBに切り替え
use bitnami_redmine;

カテゴリーのテーブルに存在しないIDを使ってる記事がないかチェック
select * from kb_articles where project_id = 1
and category_id not in (select id from kb_categories where project_id = 1);

↑で出てきたらarticlesのcategory_idを存在するidに適当にupdateしてあげる

記事を消す前にカテゴリー消すとダメになるかも。

エラーチェックかかってたような気もするけど。。。

PostgreSQL テーブルと列の一覧をとるクエリ

タイトル通り。とりあえず版。


select * from (
	select 
	relname as TABLE_NAME 
	from pg_stat_user_tables
) as X
inner join (
	select 
	* 
	from information_schema.columns 
	where table_catalog='DB名' 
	and table_schema = 'スキーマ名'
) as Y
on X.TABLE_NAME = Y.table_name
left join (

	select
	tc.table_name as TABLE_NAME
	,ccu.column_name as COLUMN_NAME
	from information_schema.table_constraints tc,information_schema.constraint_column_usage ccu
	where tc.table_catalog='DB名'
	and tc.constraint_type='PRIMARY KEY'
	and tc.table_catalog=ccu.table_catalog
	and tc.table_schema=ccu.table_schema
	and tc.table_name=ccu.table_name
	and tc.constraint_name=ccu.constraint_name

) as Z
on X.TABLE_NAME = Z.TABLE_NAME
and X.TABLE_NAME = Z.table_name
and Y.table_name = Z.TABLE_NAME
and Y.column_name = Z.COLUMN_NAME

BitnamiRedmineのバージョンアップ

2.6⇒3.3に更新する。ついでにサーバも変えた。

とりあえず、最新のBitnamiRedmineを新しいサーバに入れる。ここから先のコマンド使うものは、「use_redmine.bat」を使ってコンソールを上げる。ここが一番わかりにくい。

必要なプラグインもとりあえずcloneしておく。

そしたら古いRedmineのDBをバックアップして新しい方に復元

バックアップ
mysqldump -u root -p[rootのpass] bitnami_redmine > C:\****

復元
mysqldump -u root -p[rootのpass] bitnami_redmine < C:\****

古い方の「apps\redmine\htdocs\files」を丸ごとコピーして新しい方の同じ場所に移す。

そしたら最初にbundle installをやる

cd apps\redmine\htdocs
bundle install --without xapian

そしたらマイグレーション。

まず本体
bundle exec rake db:migrate RAILS_ENV=production

プラグイン
bundle exec rake redmine:plugins:migrate RAILS_ENV=production

色々クリア
bundle exec rake tmp:cache:clear tmp:sessions:clear

で、多分最初のRedmine本体のマイグレーションでエラーが出ると思う。一部のテーブル追加で、もーあるよっていうエラーが出る。エラーになったファイルの中身をコメントアウトして再実行を繰り返し。

PostgreSQLに他のサーバ(端末)からつなげる

ローカル以外からPostgreにつなげようとすると「SSL無効用のエントリがありません」っていうエラーが出る。

Postgreの設定で許可するIPを指定しないとダメらしい。微妙じゃね?

設定するのは↓

PostgreSQL\9.6\data\pg_hba.conf
↓の感じで繋げたい端末のIPをいれておく。
host    all             all             123.456.789.012/32            md5

まー、アプリサーバを入れておく感じになると思うんだけど、pgAdminとか保守的な事をする端末すらもやっておかないとダメってことよね?

絶対他にやり方があるはず。

SQLServerExpressのインストール

Expressインストールしたらはまったので記載。インストールしたのは「SQLServerExpress 2014」

インスタンス名つけてインストールするとTCPが無効になるらしい。

参考はココ。ポート番号とか色々指定しないとダメっぽ。

つか、インスタンス名つけると最初の一個はインスタンス名なしの名前でつながないとポートの指定が必要になるっぽい。なんだろね。。。

Postgreのシリアル列のMAX値更新

SQLServer→Postgreの移行してる。

シリアルの値の更新を忘れてた。。。

日本語のテーブル名と列名だとややこしい。↓の感じ。

select setval('schema."日本語テーブル_日本語列名_seq"',(select max("日本語列名") from shcema.”日本語テーブル”));

.net MVC でNpgsql(PostgreSQL)を使う

タイトル通りなんだけど、普通にNugetからインストールだけだと現状動かない。

Nugetから「EntityFramework」と「Npgsql.EntityFramework」を入れる。入れると「Npgsql」も勝手に入る。あとは普通に書くんだけど、動かしてみると↓のエラーが出る。

要求された .Net Framework データ プロバイダが見つかりません。これは、インストールされていない可能性があります。

インストールしたんですけど。。。

とりあえず、WebConfigに↓を追記しないとダメ。

  <system.data>
    <DbProviderFactories>
      <add name="Npgsql Data Provider" invariant="Npgsql" description="Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" />
    </DbProviderFactories>
  </system.data>

ホントは、Machine.configとかGACをいじっておく必要があるらしい。めんどー。

問合せ