我只想获取位于其他域中的文件夹名称。尝试在本地获取文件夹名称时,我可以获取文件夹名称。
这是我的代码
[WebMethod]
public void getAllRootDirectoryNames(string path)
{
string userName = "Domain\\Admin";
string password = "Password";
NetworkCredential theNetworkCredential = new NetworkCredential(userName, password);
CredentialCache theNetcache = new CredentialCache();
theNetcache.Add(new Uri(@"\\192.168.x.x"), "Basic", theNetworkCredential);
List<GetFolderDetails> details = new List<GetFolderDetails>();
Debug.WriteLine("GET All Root Directory Names START");
foreach (var directoryName in new DirectoryInfo(path).GetDirectories())
{
GetFolderDetails fd = new GetFolderDetails();
fd.fullFolder = directoryName.Parent.Name;
fd.folderName = directoryName.Name;
fd.urlPath = path + directoryName.Name;
fd.subFolderExists = 0;
details.Add(fd);
}
JavaScriptSerializer js = new JavaScriptSerializer();
Context.Response.Write(js.Serialize(details));
}
错误消息:
System.IO.IOException:用户名或密码不正确。
更新
我尝试了以下代码。
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[WebMethod]
public void getAllRootDirectoryNames(string path)
{
IntPtr tokenHandle = new IntPtr(0);
tokenHandle = IntPtr.Zero;
bool returnValue = LogonUser("USerName", "DomainName", "password", 2, 0, ref tokenHandle);
WindowsIdentity ImpersonatedIdentity = new WindowsIdentity(tokenHandle);
WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate();
List<GetFolderDetails> details = new List<GetFolderDetails>();
foreach (var directoryName in new DirectoryInfo(path).GetDirectories())
{
GetFolderDetails fd = new GetFolderDetails();
fd.fullFolder = directoryName.Parent.Name;
fd.folderName = directoryName.Name;
//fd.urlPath = directoryName.FullName;
fd.urlPath = path + directoryName.Name;
fd.subFolderExists = 0;
foreach (var insideDirName in new DirectoryInfo(path + "/" + directoryName.Name + "/").GetDirectories())
{
fd.subFolderExists = 1;
}
details.Add(fd);
}
JavaScriptSerializer js = new JavaScriptSerializer();
Context.Response.Write(js.Serialize(details));
MyImpersonation.Undo();
}
它引发以下错误
'System.UnauthorizedAccessException' occurred in mscorlib.dll but was not handled in user code
答案 0 :(得分:1)
我想您的主机和目标计算机基于Windows。我以前做过,但是我的代码看起来有些不同。将尝试提出一些方案(简而言之)。 首先导入该dll。检查参数并使用输入格式。我真的不记得他们应该怎么看。
[System.Runtime.InteropServices.DllImport("advapi32.dll", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
public class TestClass
{
public void TestMethod()
{
IntPtr admin_token = default(IntPtr);
WindowsIdentity wid_current = WindowsIdentity.GetCurrent();
WindowsIdentity wid_admin = null;
WindowsImpersonationContext wic = null;
try
{
if (LogonUser(User, userDomain, Password, DwLogonType, DwLogonProvider, ref admin_token))
{
wid_admin = new WindowsIdentity(admin_token);
wic = wid_admin.Impersonate();
if (!Directory.Exists(@"C:\TempFiles")) Directory.CreateDirectory(@"C:\TempFiles");
file.SaveAs(@"C:\TempFiles\" + fileName
//+ GUID
+ "");
}
}
catch (Exception ex)
{
...
}
}
我在这里将文件保存到另一个域中,但是您可以检查代码以获取如何对其进行授权。
答案 1 :(得分:0)
谢谢它的工作。
iStream = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read);