2011-08-29 22 views
7

Tôi đang cố gắng để có được các giá trị thực tế của biến môi trường.
Đây là những gì tôi có cho đến nay:Nhận giá trị thực của biến môi trường trên máy từ xa trong .NET

đó làm việc, nhưng đây là vấn đề: đi 'windir' như tên được '% SystemRoot%' là giá trị. Những gì tôi thực sự muốnđường dẫn thực tế, tức là 'C: \ Windows'.

tôi thử sử dụng đệ quy để nhận được giá trị của 'SystemRoot' nhưng không trận được tìm thấy.

Làm cách nào để đảm bảo rằng giá trị thực được trả lại?
Thx!

+2

Tại sao% SystemRoot% không được chấp nhận? Nếu bạn đặt nó trong một cửa sổ thám hiểm, bạn sẽ đi đến thư mục cài đặt của cửa sổ. Bởi vì% SystemRoot% có thể là D: \ Windows \ trong lý thuyết. –

+0

có thể trùng lặp của [Cách mở rộng các biến môi trường từ xa với .NET?] (Http://stackoverflow.com/questions/5031111/how-to-expand-environment-variables-remotely-with-net) – VVS

+0

@ Ramhound: I đang viết một phương thức ** chạy lệnh ** trên máy từ xa bằng cách sử dụng ** Win32_Process.Create **. ** Các biến môi trường không ** dường như ** được nhận diện **, vì vậy tôi đang tìm cách thay thế chúng **. Nếu có cách để ** khiến chúng tự động nhận diện **, điều đó cũng sẽ ** giải quyết vấn đề của tôi **. – David

Trả lời

-2

sử dụng Environment.GetFolderPath(Environment.SpecialFolder.System)

+2

Tiêu đề câu hỏi nói trên máy từ xa. – TheCodeKing

0

Bạn không thể sử dụng Win32_Environment cho điều này, nhưng bạn có thể sử dụng đăng ký từ xa.

RegistryKey environmentKey = RegistryKey.OpenRemoteBaseKey(
     RegistryHive.LocalMachine, "\\server"); 
RegistryKey key = environmentKey.OpenSubKey(
     @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment", false); 
string value = (string)key.GetValue("System"); 
2

Đối với system path variables (như %SystemRoot%) không có cách thuận tiện.

Bạn phải tự tìm các giá trị này bằng cách đọc các giá trị đăng ký tương ứng. Heres' một (không đầy đủ) danh sách một số các biến hệ thống:

  • % SystemRoot%:

    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRoot
    hoặc

    select windowsdirectory from Win32_OperatingSystem
  • % SystemDrive% thể được xác định bằng cách kiểm tra% SystemRoot %

Các biến số như % AppData% là người dùng phụ thuộc và được tìm thấy dưới

HKEY_USERS\<user SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\AppData

+0

Điều đó sẽ nhận được% SystemRoot% cho tôi, nhưng không phải là **% ProgramFiles% ** hoặc những người khác. Tôi cho rằng tôi đang tìm phiên bản từ xa của Environment.GetEnvironmentVariable – David

+1

@David: Không có phiên bản từ xa. Một giải pháp thay thế sẽ là thực thi từ xa 'Environment.GetEnvironmentVariable', ví dụ: bằng cách bắt đầu một chương trình trên máy từ xa. – VVS

1

Tôi biết nó sáng tạo nhất nhưng đây có vẻ là giải pháp đơn giản nhất:
Quá nhiều tiền trên có thể?

 using (var process = new Process()) 
     { 
      process.StartInfo.FileName = @"C:\PsTools\PsExec.exe"; 
      process.StartInfo.Arguments = @"\\machineName cmd /c echo " + environmentVar; 
      process.StartInfo.UseShellExecute = false; 
      process.StartInfo.CreateNoWindow = true; 
      process.StartInfo.RedirectStandardOutput = true; 
      process.Start(); 
      return process.StandardOutput.ReadToEnd(); 
     } 
+0

'Quá nhiều chi phí có lẽ? 'Không hề. Đặc biệt là khi thiết lập chống lại các chi phí trên đuổi theo con đường mòn thỏ cố gắng giải quyết các biến đệ quy: '% ComSpec% =% SystemRoot% \ System32 \ cmd.exe'. Thật là một cơn ác mộng. Tôi đã từ bỏ khi tôi phát hiện ra câu trả lời của bạn. Bí quyết đẹp. – InteXX

Các vấn đề liên quan