2010-03-09 2 views
10

WMI를 사용하고 네트워크 공유에 액세스해야하는 C# exe가 있습니다. 그러나 공유에 액세스하면 UnauthorizedAccessException이 발생합니다. exe를 직접 실행하면 공유에 액세스 할 수 있습니다. 두 경우 모두 동일한 사용자 계정을 사용하고 있습니다.WMI에서 exe를 실행할 때 네트워크 인증

내 응용 프로그램에는 로컬 PC에서 실행되는 GUI 클라이언트와 원격 PC에서 실행되는 백엔드 프로세스의 두 부분이 있습니다. 클라이언트가 백엔드에 연결해야하는 경우 먼저 WMI (아래에 재현 된 코드)를 사용하여 원격 프로세스를 시작합니다. 원격 프로세스는 Directory.GetDirectories()를 사용하여 네트워크 공유에 액세스하는 등 여러 가지 작업을 수행하고 클라이언트에 다시보고합니다.

WMI를 사용하는 클라이언트가 원격 프로세스를 자동으로 시작하면 네트워크 공유에 액세스 할 수 없습니다. 그러나 원격 데스크톱을 사용하여 원격 컴퓨터에 연결하고 수동으로 백 엔드 프로세스를 시작하면 네트워크 공유에 대한 액세스가 성공합니다.

WMI 호출에서 지정한 사용자와 원격 데스크톱 세션에 로그인 한 사용자가 동일하므로 사용 권한이 동일해야합니까? 그렇지 않아야합니까? 이 상태 내가 Directory.Exists()에 대한 MSDN 항목에서 볼

"는이 방법은 네트워크 인증을 수행하지 않습니다 존재합니다. 사전 인증없이 기존 네트워크 공유를 조회하는 경우,이 메소드는 false를 돌려줍니다 존재한다." 이게 관련이 있다고 생각 하나? WMI 세션에서 사용자가 올바르게 인증되도록하려면 어떻게해야합니까?

ConnectionOptions opts = new ConnectionOptions(); 

opts.Username = username; 
opts.Password = password; 

ManagementPath path = new ManagementPath(string.Format("\\\\{0}\\root\\cimv2:Win32_Process", remoteHost)); 

ManagementScope scope = new ManagementScope(path, opts); 

scope.Connect(); 

ObjectGetOptions getOpts = new ObjectGetOptions(); 
using (ManagementClass mngClass = new ManagementClass(scope, path, getOpts)) 
{ 
    ManagementBaseObject inParams = mngClass.GetMethodParameters("Create"); 
    inParams["CommandLine"] = commandLine; 
    ManagementBaseObject outParams = mngClass.InvokeMethod("Create", inParams, null); 
} 
+1

비슷한 문제 http://stackoverflow.com/questions/2291921/c-wmi-runs-an-exe-on-a-remote-computer-that-then-runs-another-exe-on-the- same-co/2291991 # 2291991 – lsalamon

+0

고마워, 내 검색 결과가 표시되지 않았다. 나는 그것을 읽었을 것이고 그것이 도움이되는지 알 것이다. – Andy

+0

사용자를 추가하고 풀 퍼미션을 제공했지만 차이는 없습니다. ( – Andy

답변

2

대신 WMI의 나는 Jestro에의 조언을 따라 (http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx에서 다운로드 할 수 있습니다) psexec.exe를 사용하여 다시 작성했다 (감사) 위의 Isalamon에 의해 제안 된 링크를 따라 가졌어요. 이런 식으로하는 것은 다소 괴롭다는 느낌이 들지만 작동하는 것 같습니다. 비슷한 문제를 경험하는 사람에 대한

새로운 코드 : 액세스 네트워크 제공하지 않습니다 원격 프로세스를 실행할 때

Process proc = new Process(); 
proc.StartInfo.FileName = "PsExec.exe"; 
proc.StartInfo.Arguments = string.Format("\\\\{0} -d -u {1}\\{2} -p {3} {4}", 
             remoteHost, 
             domain, 
             username, 
             password, 
             commandLine); 
proc.StartInfo.CreateNoWindow = true; 
proc.StartInfo.UseShellExecute = false; 
proc.Start(); 
1

WMI는 가장을 사용합니다. 관리 코드 외부로 이동하는 경우 원격 프로세스에서 UNC 경로를 매핑하면 원하는 자격 증명을 사용하여 WMI가 시작될 수 있습니다. 그런 다음 원하는 네트워크 액세스 권한이 있습니다. netapi32.dll에서 NetUseAdd 및 NetUseDel을 사용하여 UNC 경로를 매핑합니다. API 사용에 대한 자세한 내용은 http://pinvoke.net/을 참조하십시오.

0

인증을 위해 net use (드라이브 문자를 사용할 필요가 없음)가 포함 된 원격 컴퓨터에 모든 명령을 배치 파일에 쓸 수 있습니다. 그렇게 잘 작동합니다. 나는 아직도 대안을 연구 중이다.

+0

실제로 다음과 같은 작업을 수행하는 경우 그것도 작동합니다 : – Will

+0

OOps 여기에 있습니다 : inParams [ "CommandLine"] = "cmd/c \" "net use \\\\ 서버 \\ c $ password/user : domain \\ username && <\\ server \ share \ whatever.bat> "+"\ "> c : \\ temp \\ r_output.txt" 내 코드에서 나중에 출력을 검색하기 위해 로그합니다. 그것은 배치 파일을 실행하는 것을 명령하지 않습니다. – Will

1

난 당신이 환상적인 프로그램입니다 psexec에를 사용하여 정렬 한 알고 있지만 다시 WMI에 가고 싶어 않은 경우, 당신은 당신의 ConnectionOptions에서 다음 수 있도록 시도 :

  • 플래그 EnablePrivileges
  • 가장을 가장 수준으로 설정하십시오.다음 않는

로 가장 :

http://msdn.microsoft.com/en-us/library/system.management.connectionoptions.enableprivileges.aspx

http://msdn.microsoft.com/en-us/library/system.management.connectionoptions.impersonation.aspx

내가 실제로 프로그램이 올바른 자격 증명을 가질 수 있도록하기 위해 WMI에게있어 네트워크 공유에 액세스해야한다고 생각