Active Directoryにリンクするためにリンクサーバー(ADSI)を使用するストアドプロシージャがあります。これは文字列/ varchar guidを取り込み、ユーザーのthumbnailPhoto属性をアクティブディレクトリから返します。私はC#コードからこのプロシージャを呼び出そうとしていますが、nullを返し続けます。私はguidが渡されていることを確認しようとしましたが、デバッグからは、GUIDをパラメータに渡してから、管理スタジオでsprocを実行するようにしました。結果はうまく戻ってきましたが、私がアプリケーションからそれを実行すると、nullになります。ここでは、コードです:ストアドプロシージャの戻り値はC#コードではありません
SPROC:
ALTER PROC [dbo].[sp_GetPhotoFromADSI]
@GUID varchar(100)
AS
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRAN
DECLARE @sql NVARCHAR(600)
SET @sql=N'SELECT thumbnailPhoto FROM OPENQUERY(ADSI,
''SELECT thumbnailPhoto
FROM ''''LDAP://<GUID=' + @GUID + '>''''
WHERE objectCategory = ''''Person'''' AND objectClass = ''''user'''''')'
EXEC SP_EXECUTESQL @sql
COMMIT
のC#:
private byte[] GetUserPhotoByGuid(Guid userNativeGuid)
{
//dont judge me for not abstracting this
var connString = "connectionStringCrap;";
byte[] photo = null;
using (var conn = new SqlConnection(connString))
{
try
{
string guidString = userNativeGuid.ToString();
//var realGuid = Guid.Parse(userNativeGuid);
using (var comm = new SqlCommand("sp_GetPhotoFromADSI", conn))
{
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.AddWithValue("@GUID", guidString);
var returnParameter = comm.Parameters.Add("@Output", SqlDbType.Binary);
returnParameter.Direction = ParameterDirection.ReturnValue;
conn.Open();
comm.ExecuteScalar();
photo = returnParameter.Value as byte[];
return photo;
}
}
catch (Exception)
{
throw;
}
finally
{
conn.Close();
}
}
return null;
}
このストアドプロシージャには出力パラメータがないようです。 – ebutusov
ちょっと考えてみると、SQL Serverを迂回する代わりに、C#コードからADに直接アクセスする方がはるかに簡単です**例えば、 [これは同じトピックに関するこのような質問](http://stackoverflow.com/questions/1978717/how-to-upload-an-image-file-to-active-directory-user-profile-in-c)ポインタ –
実際にはいといいえ。私の元のコードはDirectoryServicesを使って簡単に実行できますが、SQLを使用する方がはるかに高速です。 – Sinaesthetic