PDA

View Full Version : سوال: کار با پوشه های تحت شبکه



cerezaei65
چهارشنبه 03 خرداد 1391, 07:53 صبح
با سلام
توی برنامم یه قسمتش میره توی پوشه شیر شده روی سرور و محتویاتش رو توی listbox نشون میده
جال اینجاست که با اجرای برنامه هیچ اروری نمیده و همچنین هیچی هم add نمیکنه!!!
اما اگه یه بار از تو سیستم شیر رو باز کنیم دفعه بعد قشنگ همه کارا رو درست انجام میده


CommonFunctions.UNCAccess unc = new CommonFunctions.UNCAccess(address ,user_name
, "",password);
list_parvandeh.Items.Clear();
masire_ax = address+ _path;
foreach (string r in System.IO.Directory.GetFiles(masire_ax))
list_parvandeh.Items.Add
(System.IO.Path.GetFileNameWithoutExtension(r));

paolo2003
چهارشنبه 03 خرداد 1391, 08:23 صبح
سلام.
فکر کنم علتش اینه که شما وارد دامین نمی شین.
احتمالا جزء کاربرانی هستید که بصورت مهمان وارد شبکه شده اید و این ارتباطی به برنامه شما نداره.

cerezaei65
چهارشنبه 03 خرداد 1391, 08:42 صبح
ممنون
اما من با user name و password ادمین سیستم وصل میشم
همون که باش شیر رو باز میکنم

vof.ir
چهارشنبه 03 خرداد 1391, 11:03 صبح
نمیدونم این کار راه انداز هست یا نه

وقتی که شما اولین بار توسط خود ویندوز اکسپلورر به سیستم طرف مقابل که پوشه به اشتراک گذاشته شده داره وصل میشید
یک حالتی مثل اینکه شما ویزا گرفته باشید اتفاق میفته
و دیگه در دفعات بعد از شما یوزر نیم و پسور نمی خواد
حالا، نکته این هست که برنامه شما باید طوری باشه که وقتی که خودش برای بار اول وصل میشه، طوری رفتار کنه که باعث صدور اون ویزا، مجوز، سرتیفیکیت، بشه

cerezaei65
پنج شنبه 04 خرداد 1391, 07:31 صبح
ممنون
بله درسته
اگه اولین بار وارد بشید توی قسمت windows credentials اضافه میشه و دیگه نمیخواد
حالا باید چجوری کاری کنم که خوده برنامه این کارو کنه نه خودمون!!!

vof.ir
جمعه 05 خرداد 1391, 14:29 عصر
این لیست سرچ را بررسی کنید
شاید مفید باشد
https://www.google.com/search?q=how+to+get+windows+credential+through+C%2 3+app+when+trying+to+access+shared+folder&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a&channel=fflb

cerezaei65
شنبه 06 خرداد 1391, 11:23 صبح
دمت گرم یه کلاس پیدا کردم که فعلا کار میکنه

http://lookfwd.doitforme.gr/blog/media/PinvokeWindowsNetworking.cs

vof.ir
شنبه 06 خرداد 1391, 15:40 عصر
خواهش میکنم
خوشحال شدم
ممنون میشم شرح کاملش که کمکتون کرد را به اشتراک بگذارید

cerezaei65
یک شنبه 07 خرداد 1391, 07:46 صبح
شرمنده امروزم رفتم ادامه بدم دوباره با مشکل برخورد
حتما باید یه بار share folder رو باز کنی که کار کنه
نمیدونم دیگه مشکل از کجاست!!!!!!!!!!!!!

cerezaei65
یک شنبه 07 خرداد 1391, 08:04 صبح
حالا من شرح کلی رو مینویسم شاید کمک کرد
ما روی سرور یه پوشه اشتراک گزاری شده داریم که داخلش پوشه ها با یه نام مشخص ذخیره شده و توشون عکس هست
کاربر مشخصات رو وارد میکنه و نرم افزار اون پوشه رو پیدا میکنه و محتویاتشو توی لیست باکس نشون میده و کاربر با انتخاب هر کدوم عکس مورد نظرش توی picture box نشون داده میشه
این کلیات بود
واسه وصل شدن به سرور یعنی باز کردن شیر من کلاس زیرو add کردم و توی برنامه اینجوری فراخونی کردم


ExtremeMirror.PinvokeWindowsNetworking.connectToRe mote(network_path, user_name, password);

کد کلاس هم :


using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace ExtremeMirror
{
public class PinvokeWindowsNetworking
{
#region Consts
const int RESOURCE_CONNECTED = 0x00000001;
const int RESOURCE_GLOBALNET = 0x00000002;
const int RESOURCE_REMEMBERED = 0x00000003;

const int RESOURCETYPE_ANY = 0x00000000;
const int RESOURCETYPE_DISK = 0x00000001;
const int RESOURCETYPE_PRINT = 0x00000002;

const int RESOURCEDISPLAYTYPE_GENERIC = 0x00000000;
const int RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001;
const int RESOURCEDISPLAYTYPE_SERVER = 0x00000002;
const int RESOURCEDISPLAYTYPE_SHARE = 0x00000003;
const int RESOURCEDISPLAYTYPE_FILE = 0x00000004;
const int RESOURCEDISPLAYTYPE_GROUP = 0x00000005;

const int RESOURCEUSAGE_CONNECTABLE = 0x00000001;
const int RESOURCEUSAGE_CONTAINER = 0x00000002;


const int CONNECT_INTERACTIVE = 0x00000008;
const int CONNECT_PROMPT = 0x00000010;
const int CONNECT_REDIRECT = 0x00000080;
const int CONNECT_UPDATE_PROFILE = 0x00000001;
const int CONNECT_COMMANDLINE = 0x00000800;
const int CONNECT_CMD_SAVECRED = 0x00001000;

const int CONNECT_LOCALDRIVE = 0x00000100;
#endregion

#region Errors
const int NO_ERROR = 0;

const int ERROR_ACCESS_DENIED = 5;
const int ERROR_ALREADY_ASSIGNED = 85;
const int ERROR_BAD_DEVICE = 1200;
const int ERROR_BAD_NET_NAME = 67;
const int ERROR_BAD_PROVIDER = 1204;
const int ERROR_CANCELLED = 1223;
const int ERROR_EXTENDED_ERROR = 1208;
const int ERROR_INVALID_ADDRESS = 487;
const int ERROR_INVALID_PARAMETER = 87;
const int ERROR_INVALID_PASSWORD = 1216;
const int ERROR_MORE_DATA = 234;
const int ERROR_NO_MORE_ITEMS = 259;
const int ERROR_NO_NET_OR_BAD_PATH = 1203;
const int ERROR_NO_NETWORK = 1222;

const int ERROR_BAD_PROFILE = 1206;
const int ERROR_CANNOT_OPEN_PROFILE = 1205;
const int ERROR_DEVICE_IN_USE = 2404;
const int ERROR_NOT_CONNECTED = 2250;
const int ERROR_OPEN_FILES = 2401;

private struct ErrorClass
{
public int num;
public string message;
public ErrorClass(int num, string message)
{
this.num = num;
this.message = message;
}
}


// Created with excel formula:
// ="new ErrorClass("&A1&", """&PROPER(SUBSTITUTE(MID(A1,7,LEN(A1)-6), "_", " "))&"""), "
private static ErrorClass[] ERROR_LIST = new ErrorClass[] {
new ErrorClass(ERROR_ACCESS_DENIED, "Error: Access Denied"),
new ErrorClass(ERROR_ALREADY_ASSIGNED, "Error: Already Assigned"),
new ErrorClass(ERROR_BAD_DEVICE, "Error: Bad Device"),
new ErrorClass(ERROR_BAD_NET_NAME, "Error: Bad Net Name"),
new ErrorClass(ERROR_BAD_PROVIDER, "Error: Bad Provider"),
new ErrorClass(ERROR_CANCELLED, "Error: Cancelled"),
new ErrorClass(ERROR_EXTENDED_ERROR, "Error: Extended Error"),
new ErrorClass(ERROR_INVALID_ADDRESS, "Error: Invalid Address"),
new ErrorClass(ERROR_INVALID_PARAMETER, "Error: Invalid Parameter"),
new ErrorClass(ERROR_INVALID_PASSWORD, "Error: Invalid Password"),
new ErrorClass(ERROR_MORE_DATA, "Error: More Data"),
new ErrorClass(ERROR_NO_MORE_ITEMS, "Error: No More Items"),
new ErrorClass(ERROR_NO_NET_OR_BAD_PATH, "Error: No Net Or Bad Path"),
new ErrorClass(ERROR_NO_NETWORK, "Error: No Network"),
new ErrorClass(ERROR_BAD_PROFILE, "Error: Bad Profile"),
new ErrorClass(ERROR_CANNOT_OPEN_PROFILE, "Error: Cannot Open Profile"),
new ErrorClass(ERROR_DEVICE_IN_USE, "Error: Device In Use"),
new ErrorClass(ERROR_EXTENDED_ERROR, "Error: Extended Error"),
new ErrorClass(ERROR_NOT_CONNECTED, "Error: Not Connected"),
new ErrorClass(ERROR_OPEN_FILES, "Error: Open Files"),
};

private static string getErrorForNumber(int errNum)
{
foreach (ErrorClass er in ERROR_LIST)
{
if (er.num == errNum) return er.message;
}
return "Error: Unknown, " + errNum;
}
#endregion

[DllImport("Mpr.dll")]
private static extern int WNetUseConnection(
IntPtr hwndOwner,
NETRESOURCE lpNetResource,
string lpPassword,
string lpUserID,
int dwFlags,
string lpAccessName,
string lpBufferSize,
string lpResult
);

[DllImport("Mpr.dll")]
private static extern int WNetCancelConnection2(
string lpName,
int dwFlags,
bool fForce
);

[StructLayout(LayoutKind.Sequential)]
private class NETRESOURCE
{
public int dwScope = 0;
public int dwType = 0;
public int dwDisplayType = 0;
public int dwUsage = 0;
public string lpLocalName = "";
public string lpRemoteName = "";
public string lpComment = "";
public string lpProvider = "";
}


public static string connectToRemote(string remoteUNC, string username, string password)
{
return connectToRemote(remoteUNC, username, password, false);
}

public static string connectToRemote(string remoteUNC, string username, string password, bool promptUser)
{
NETRESOURCE nr = new NETRESOURCE();
nr.dwType = RESOURCETYPE_DISK;
nr.lpRemoteName = remoteUNC;
// nr.lpLocalName = "F:";

int ret;
if (promptUser)
ret = WNetUseConnection(IntPtr.Zero, nr, "", "", CONNECT_INTERACTIVE | CONNECT_PROMPT, null, null, null);
else
ret = WNetUseConnection(IntPtr.Zero, nr, password, username, 0, null, null, null);

if (ret == NO_ERROR) return null;
return getErrorForNumber(ret);
}

public static string disconnectRemote(string remoteUNC)
{
int ret = WNetCancelConnection2(remoteUNC, CONNECT_UPDATE_PROFILE, false);
if (ret == NO_ERROR) return null;
return getErrorForNumber(ret);
}
}
}


ولی همچنان تا ما شیر رو باز نکنیم کار نمیکنه
البته قبل از این کلاس زیر رو هم امتحان کردم


using System;
using System.Runtime.InteropServices;
using BOOL = System.Boolean;
using DWORD = System.UInt32;
using LPWSTR = System.String;
using NET_API_STATUS = System.UInt32;

namespace CommonFunctions
{
public class UNCAccess
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
internal struct USE_INFO_2
{
internal LPWSTR ui2_local;
internal LPWSTR ui2_remote;
internal LPWSTR ui2_password;
internal DWORD ui2_status;
internal DWORD ui2_asg_type;
internal DWORD ui2_refcount;
internal DWORD ui2_usecount;
internal LPWSTR ui2_username;
internal LPWSTR ui2_domainname;
}

[DllImport("NetApi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern NET_API_STATUS NetUseAdd(
LPWSTR UncServerName,
DWORD Level,
ref USE_INFO_2 Buf,
out DWORD ParmError);

[DllImport("NetApi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern NET_API_STATUS NetUseDel(
LPWSTR UncServerName,
LPWSTR UseName,
DWORD ForceCond);

private string sUNCPath;
private string sUser;
private string sPassword;
private string sDomain;
private int iLastError;
public UNCAccess()
{
}
public UNCAccess(string UNCPath, string User, string Domain, string Password)
{
login(UNCPath, User, Domain, Password);
}
public int LastError
{
get { return iLastError; }
}

/// <summary>
/// Connects to a UNC share folder with credentials
/// </summary>
/// <param name="UNCPath">UNC share path</param>
/// <param name="User">Username</param>
/// <param name="Domain">Domain</param>
/// <param name="Password">Password</param>
/// <returns>True if login was successful</returns>
public bool login(string UNCPath, string User, string Domain, string Password)
{
sUNCPath = UNCPath;
sUser = User;
sPassword = Password;
sDomain = Domain;
return NetUseWithCredentials();
}
private bool NetUseWithCredentials()
{
uint returncode;
try
{
USE_INFO_2 useinfo = new USE_INFO_2();

useinfo.ui2_remote = sUNCPath;
useinfo.ui2_username = sUser;
useinfo.ui2_domainname = sDomain;
useinfo.ui2_password = sPassword;
useinfo.ui2_asg_type = 0;
useinfo.ui2_usecount = 1;
uint paramErrorIndex;
returncode = NetUseAdd(null, 2, ref useinfo, out paramErrorIndex);
iLastError = (int)returncode;
return returncode == 0;
}
catch
{
iLastError = Marshal.GetLastWin32Error();
return false;
}
}

/// <summary>
/// Closes the UNC share
/// </summary>
/// <returns>True if closing was successful</returns>
public bool NetUseDelete()
{
uint returncode;
try
{
returncode = NetUseDel(null, sUNCPath, 2);
iLastError = (int)returncode;
return (returncode == 0);
}
catch
{
iLastError = Marshal.GetLastWin32Error();
return false;
}
}

}


}


توی برنامم اینو نوشتم


CommonFunctions.UNCAccess unc = new CommonFunctions.UNCAccess(network_path, user_name, "", password);
unc.login(network_path, user_name, "", password);

cerezaei65
یک شنبه 07 خرداد 1391, 11:06 صبح
کسی تا به حال به این مشکل برنخورده؟؟؟؟؟
کمک

cerezaei65
سه شنبه 09 خرداد 1391, 08:24 صبح
ببخشید مجدد سوال میپرسم
اخه یه پروژه حیاتیه نیاز شدید بش دارم
مشکلم اینه که چجوری کاری کنم که دفعه اول هم نخواسته باشیم user و pass رو وارد کنیم

vof.ir
چهارشنبه 10 خرداد 1391, 02:15 صبح
https://www.google.com/search?q=how+to+use+windows+credential+for+accessi ng+share+folder+in+C%23&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a&channel=fflb