|
I have a website with member login feature. I need to authenticate the users against both the site's database and the Microsoft Active Directory. I'd like to this authentication without sending the password through the network that means i'd like using digest authentication. If i activate the digest authentication support in IIS then i'll not be able to authenticate against the database and if i write and HttpModule to handle the digest authentication process then i'll need the password of each user from AD.
The question is, is there any solution to retrieve the user's password or at least an MD5 hash of it from AD?
Osama Askari
programmer.askari@gmail.com
|
|
|
|
|
How can I launch the file properties window (i.e. the window launched by right clicking in windows explorer -> properties) from a win forms app (I have the filename).
Jim
-- modified at 7:20 Tuesday 13th December, 2005
|
|
|
|
|
First, declare the following in your class.
private const int SEE_MASK_INVOKELIST = 0xC;
public struct SHELLEXECUTEINFO
{
public int cbSize;
public int fMask;
public IntPtr hwnd;
[MarshalAs(UnmanagedType.LPTStr)] public string lpVerb;
[MarshalAs(UnmanagedType.LPTStr)] public string lpFile;
[MarshalAs(UnmanagedType.LPTStr)] public string lpParameters;
[MarshalAs(UnmanagedType.LPTStr)] public string lpDirectory;
public int nShow;
public IntPtr hInstApp;
public IntPtr lpIDList;
[MarshalAs(UnmanagedType.LPTStr)] public string lpClass;
public IntPtr hkeyClass;
public int dwHotKey;
public IntPtr hIcon;
public IntPtr hProcess;
}
[DllImport( "shell32.dll", CharSet=CharSet.Auto )]
static extern bool ShellExecuteEx( ref SHELLEXECUTEINFO lpExecInfo ); Then, in your code, invoke it with the following.
SHELLEXECUTEINFO info = new SHELLEXECUTEINFO();
info.cbSize = System.Runtime.InteropServices.Marshal.SizeOf( info );
info.lpVerb = "properties";
info.lpFile = @"THE\PATH\TO\YOUR\FILE\HERE";
info.hwnd = Handle;
info.fMask = SEE_MASK_INVOKELIST;
ShellExecuteEx( ref info ); .Now, more importantly, I had no idea how to do this until you asked. Here's how I figured it out.- I Googled for: C# "file properties" dialog. This led me to learn about using ShellExecuteEx.
- Go to http://www.pinvoke.net to learn about ShellExecuteEx.
- Copied the code from the Web page to my project and BAM! it worked.
Now, you have an immediate and long-term answer. <smile />
|
|
|
|
|
Thanks, I did search on Google but not with quite the right phrase it seems. Thats another site for the bookmarks
Jim
|
|
|
|
|
Jim,
Glad I could help. I understand the "not with quite the right phrase" deal. I have done some interesting research into Information Retrieval and understand that Google is powerful for pretty simple searches, but not the contextual stuff.
I hope that last section didn't sound too pedantic. I don't want to insult your intelligence. Just thought I'd give you an insight into my problem solving steps.
"we must lose precision to make significant statements about complex systems."
-deKorvin on uncertainty
|
|
|
|
|
Hi, i'm just about to start quite a large project that i'd like to use the Enterprise Library blocks for. I can see massive benefits of using the library but have come across a huge problem, for me at least.
I use DataRows / DataTables to pass to and from my Dal, all the Business objects have a ToDataRow, FromDataRow that maps DataRow columns to Business attributes. This allows me to contruct classes from Datatables (Collections) or from a single DataRow. I did things this way specifically because using the old Data Access application block I could get a list of SqlParameters (SqlHelperParameterCache.GetSpParameterSet) from a stored procedure then map these to the DataRow columns using sproc param name and column name and not have to worry about providing specific mappings for every stored procedure, and I could just write a BaseClass that did most of the functionality for me, all the DalcClasses did was specify a sproc name, and pass on the DataRow produced from the Business object, e.g.
User Business Class
DalcUser.Update(this.ToDataRow());
User DALC:
public static void Update(DataRow drUser)
{
BaseUpdate("UpdateUser", drUser);
}
I don't see anyway of doing this in the Enterprise Library anyone any ideas. Should I just change to using DataSets I just find them overkill considering most of the time all you want is a DataRow, even then i don't think this is solved.
Many Thanks
Tim
|
|
|
|
|
Using AOP you can save and load data without using any of that
You can use reflection to automatically populate a class based on the fields from a reader
I'm not an expert yet, but I play one at work. Yeah and here too.
|
|
|
|
|
How can I check if a int is NaN?
|
|
|
|
|
|
my application does some math calculations, but sometimes the result is NaN as caused by sqrt(-2) for example, I would not want to display such results
|
|
|
|
|
An int can't be NaN. NaN is only available in the floating point numeric formats (float.IsNaN(myNumber) ).
You are probably looking for nullable types which are newly available in .Net 2.0.
|
|
|
|
|
float.IsNaN(myNumber) seems to be useful, thanks!
|
|
|
|
|
if you uses an object with a variable int, and that object is populate in an api, and not pass a value to variable int, then the value can by null, that way you can obtain a value not int
|
|
|
|
|
Hi.
How can I determine when a length-prefixed string is prefixed with a byte (1 byte) or word (2 bytes) value?
Furthermore in what format is the length-value? (fyi: it's not just the length)
I stumbled upon this question when describing the format of a file. I've tested around a lot but didn't get the clue of what format the length-prefix is.
Thanks for advice.
|
|
|
|
|
Is this a file or structure?
.NET doesn't have fixed length strings
Nick
I'm not an expert yet, but I play one at work. Yeah and here too.
|
|
|
|
|
You could use the underlying stream's position property to find the length.
Normally you would just use BinaryReader.ReadString to read the value, I don't know why you need the exact format. I suppose that the value of the first byte determines how many bytes are used for the length - a first byte of 0 to 127 means just one byte, 128 to x means 2 bytes etc... just a guess.
MSDN does not seem to explain this, so the easiest way would be to look at the implementation (use Reflector or look at the Rotor or Mono code)...
OK, I've looked at it myself, here's the code (Rotor):
389: protected void Write7BitEncodedInt(int value) {
390: // Write out an int 7 bits at a time. The high bit of the byte,
391: // when on, tells reader to continue reading more bytes.
392: uint v = (uint) value; // support negative numbers
393: while (value >= 0x80) {
394: Write((byte) (value | 0x80));
395: value >>= 7;
396: }
397: Write((byte)value);
398: }
|
|
|
|
|
For .NET users, they can simply use BinaryReader.ReadString(), that's correct. But I wanted to describe the file format for non-.NET users. I don't think they know a thing about it if I say "it's .NET prefixed". I haven't found any information on MSDN, too.
If I just write a 127 characters string, the hex code looks like:
7F 78 78 78 78... (where 78 is 'x'), 7F = 127
For 128 characters it's: 80 01 78 78 78 78... 80 = 128, 01 = ?.
For 256 characers it's: 80 02 78 78 78 78...
For 300 characters it's: AC 02 78 78 78 78...
For 512 characters it's: 80 04 78 78 78 78...
For 32768 characters it's: 80 80 02 78 78 78...
Now ok.. the 127 (and below) version looks quite simple.. but compared to the 128+ version, how can one determine if the second byte does not belong to the string but to the length prefix? I don't get the clue of this length prefixing thing
-- modified at 12:34 Wednesday 14th December, 2005
[quote]393: while (value >= 0x80) {
394: Write((byte) (value | 0x80));
395: value >>= 7;
396: }[/quote]
Hm so.. this means, while the byte value is >= 0x80 (128) there is a following byte, as long at it's value is < 0x80. But what about the 300 characters prefix? AC 02? AC is just 172 in decimal but the string length is 300.
-- modified at 12:38 Wednesday 14th December, 2005
Ah hell... wait... this prefix thing is very confusing. So.. AC means 0x80 + 0xAC = 300. Why needs that damn technique to be so complicated?
It makes it even more difficult to describe the length prefix
|
|
|
|
|
The comment in the rotor code is quite clear:
// Write out an int 7 bits at a time. The high bit of the byte,
// when on, tells reader to continue reading more bytes.
A length prefix consists of zero or more bytes in the 128-255 range and one byte in the 0-127 range.
The binary number zzyy.yyyy.yxxx.xxxx is encoded as 1xxxxxxx 1yyyyyyy 000000zz
The rotor code for reading:
474: protected int Read7BitEncodedInt() {
475: // Read out an int 7 bits at a time. The high bit
476: // of the byte when on means to continue reading more bytes.
477: int count = 0;
478: int shift = 0;
479: byte b;
480: do {
481: b = ReadByte();
482: count |= (b & 0x7F) << shift;
483: shift += 7;
484: } while ((b & 0x80) != 0);
485: return count;
486: }
|
|
|
|
|
If you visit ‘Add Counter’ window in (WinXP) perfmon and select the ‘Memory’ performance object, you see several counters in the list below. Available bytes, Cache bytes and so on.
But for some reason my machine (WinXP) shows only one counter in this section. It happens to be ‘Available Mbytes’, only one entry. I have no idea where the others have gone.
I need to restore the default counters for ‘Memory’ performance object because I am working on a project which reads values of some of the counters I mentioned above. The code always fails on machine throwing an exception ‘instance name xxx is not valid for this counter category’
Can somebody help regarding what I can do to restore default performance counters?
Salil Khedkar [^]
|
|
|
|
|
Assuming you're missing counters specific to .NET, does running lodctr %WINDIR%\Microsoft.NET\Framework\v1.0.3705\CORPerfMonSymbols.ini at the command prompt help?
Regards
Senthil
_____________________________
My Blog | My Articles | WinMacro
|
|
|
|
|
No these were Windows performance counters (not specific to .NET) The CORPerfMonSymbols are all there.
Anyways, thanks man.
Salil Khedkar [^]
|
|
|
|
|
Hi,
I am developing the Date Access Tier. Can soem one help me with a stand alone SqlDataReader. I have created a connection class and would like to then open the connection in the Data Access class, but I am stuck. Every piece of material that I read, just implements code in the same class. I Know that i can drag and drop the connection and all but i don't want to do that. I am new to coding.
<code>
public class Connectivity
{
private string ServerName = "";
//private string prvWINNTAuth = "";
//private string sDBInfo = "";
//private string sStaticDataConnectionString = "";
private string DatabaseName = "";
public Connectivity()
{
DatabaseName = "(Local)";
ServerName = "DataBase";
}
public SqlConnection SetConnection()
{
return GetConnection();
}
private string UserName
{
get{return prvUserName;}
set{prvUserName = value;}
}
private string Password
{
get{return prvPassword;}
set{prvPassword = value;}
}
private string DatabaseName
{
get{return prvDatabaseName;}
set{prvDatabaseName = value;}
}
private string ServerName
{
get{return sServerName;}
set{sServerName = value;}
}
<code>
private int WinNTAuth
{
get{return bUseWinSecurity;}
set{bUseWinSecurity = value;}
}
private int UserAccessLevel
{
get{return iAccessLevel;}
set{iAccessLevel = value;}
}
private string ConnectionString()
{
string connStr = "";
string sMsg = "";
try
{
connStr = "server=" + ServerName + ";" +
"integrated security=SSPI;" +
"database=" + DatabaseName;
}
catch (Exception ex)
{
connStr = "";
sMsg = "DataAccess: ConnectionString: " + ex.Message.ToString();
throw new Exception(sMsg);
}
try
{
if (WinNTAuth == Convert.ToInt16(vbWINNTAuth.vbUseApplication))
{
connStr = connStr + "user id=" + UserName + ";";
connStr = connStr + "PWD=" + Password + ";";
}
else
{
connStr = connStr + "persist security info=True;";
connStr = connStr + "integrated security=sspi;";
}
}
catch (Exception ex)
{
connStr = "";
sMsg = "DataAccess: ConnectionString: " + ex.Message.ToString();
throw new Exception(sMsg);
}
return connStr;
}</code>
private SqlConnection GetConnection()
{
<code>string sMsg = "";
SqlConnection conn = new SqlConnection(ConnectionString());
try</code>
{
conn.Open();
return conn;
}
catch (Exception ex)
{
conn.Close();
if(conn != null)
{
conn = null;
}
sMsg = "DataAccess: GetConnection: " + ex.Message.ToString();
throw new Exception(sMsg);
}
}
public void CloseConnection(SqlConnection conn)
{
string sMsg = "";
try
{
if (conn.State != ConnectionState.Open)
{
conn.Close();
if(conn != null)
{
conn = null;
}
}
}
catch (Exception ex)
{
sMsg = "DataAccess: Login: " + ex.Message.ToString();
throw new Exception(sMsg);
}
}
public bool Login()
{
string sMsg = "";
bool ret = true;
SqlConnection cn = new SqlConnection(ConnectionString());
try
{
cn.Open();
if (cn.State != ConnectionState.Closed)
{
ret = true;
cn.Close();
}
else
{
ret = Convert.ToBoolean(ConnectionState.Closed);
}
}
catch (Exception ex)
{
if (cn.State != ConnectionState.Closed)
{
cn.Close();
if(cn != null)
{
cn = null;
}
}
sMsg = "DataAccess: Login: " + ex.Message.ToString();
throw new Exception(sMsg);
}
return ret;
}
<code></code><code></code></code></code>
|
|
|
|
|
just do a command object and return if
SqlCommand cmd = new SqlCommand( "<stroed procedure name>", conn);
cmd.CommandType = CommandType.StoredProcedure;
return cmd.ExecuteDataReader();
while to read:
while( myReader.Read() )
{}
I'm not an expert yet, but I play one at work. Yeah and here too.
|
|
|
|
|
Thanks Ista.
|
|
|
|
|
You can use Relection to populate the class also
Get the name of the field. Get the Name of the Property into a PropertyInfo object then call set value.
Then you wont have and hunky stored proc code for getting and saving.
Use CommandBuilder.DeriveParameters to get all the parameters dynamically
use the reader to step through
I'm not an expert yet, but I play one at work. Yeah and here too.
|
|
|
|