Запустите скрипт .ps1 как другой пользователь [дубликат]

Симон Моурир дал этот пример :

object o = null;
DateTime d = (DateTime)o;  // NullReferenceException

, где unboxing преобразование (литье) из object (или из одного из классов System.ValueType или System.Enum или из типа интерфейса) - тип значения (кроме Nullable<>) сам по себе дает NullReferenceException.

В другом направлении конверсия бокса из a Nullable<>, которая имеет HasValue, равную false , на ссылочный тип, может дать ссылку null, которая затем может привести к NullReferenceException. Классический пример:

DateTime? d = null;
var s = d.ToString();  // OK, no exception (no boxing), returns ""
var t = d.GetType();   // Bang! d is boxed, NullReferenceException

Иногда бокс происходит по-другому. Например, с помощью этого не общего метода расширения:

public static void MyExtension(this object x)
{
  x.ToString();
}

следующий код будет проблематичным:

DateTime? d = null;
d.MyExtension();  // Leads to boxing, NullReferenceException occurs inside the body of the called method, not here.

Эти случаи возникают из-за специальных правил, используемых во время выполнения при боксе Nullable<> экземпляров.

11
задан chris 6 September 2011 в 13:45
поделиться

6 ответов

Наилучшее объяснение проблемы похоронено в комментарии Nathan Hartley , поэтому позвольте мне суммировать его здесь:

Проблема связана исключительно с разрешениями файловой системы и имеет (консоль и ISE):

  • Когда вы используете Start-Process без указания целевого каталога с -WorkingDirectory, текущее местоположение (каталог) PowerShell используется для
  • Поскольку вы используете -Credential для запуска в качестве другого пользователя - без повышения в этой точке - у целевого пользователя может отсутствовать разрешение на доступ к текущему каталогу, что происходит, если текущий Например, каталог находится внутри поддерева домашнего каталога текущего пользователя. К сожалению, сообщение об ошибке PowerShell скрывает эту причину, вводя в заблуждение сообщение: The directory name is invalid.

Fix:

  • Либо убедитесь, что текущее местоположение является доступным для целевого пользователя,
  • или, предпочтительно, использовать параметр -WorkingDirectory для явного задания текущей директории целевого процесса.

Для Например, чтобы запустить целевой процесс из каталога, в котором находится целевой скрипт , вы можете использовать что-то вроде:

$script = 'c:\path\to\your\script.ps1'
Start-Process -WorkingDirectory (Split-Path $script) -Credential ...
3
ответ дан Community 4 September 2018 в 09:45
поделиться

Это странно, но я воссоздал ошибку, и это исправило ее ...

http://support.microsoft.com/kb/832434

В принципе, измените начальную директорию Powershell_ISE (или PowerGUI!) на общесистемное значение.

4
ответ дан nimizen 4 September 2018 в 09:45
поделиться

Все еще проблема с установкой -WorkingDirectory в каталог exe ... обнаружил, что параметр -WorkingDirectory для C: \ Windows \ System32 и используемый путь fq для работы exe.

-1
ответ дан Ryan 4 September 2018 в 09:45
поделиться

У меня такая же ошибка.

Эта функция в порядке с PowerShell ISE, но не работает с PowerGUI

Start-Process -FilePath "C:\WINDOWS\System32\cmd.exe" -Credential $credential -ArgumentList ("/c $sFileExecutable")

Она работает с параметром WorkingDirectory

Start-Process -FilePath 'cmd.exe' -Credential $credential -ArgumentList ("/c $sFileExecutable") -WorkingDirectory 'C:\Windows\System32'
9
ответ дан TheIncorrigible1 4 September 2018 в 09:45
поделиться

Я знаю, что это может быть немного запоздалым, но выполняете ли вы эту команду, когда текущий каталог является сетевым путем? Я испытал это как проблему, и если я запустил ту же команду с системного диска, это сработает.

1
ответ дан TroyBramley 4 September 2018 в 09:45
поделиться

Я знаю, что это довольно поздно, но нить помогла мне (в частности, предложение от @Dionysoos ), и надеюсь, что мой ответ может помочь другим.

У меня был тот же error ...

Start-Process : This command cannot be executed due to the error: The directory name is invalid.

... при запуске скрипта без присмотра, пока он работал в ISE.

Неавтоматический скрипт использовал пользовательский $env:TEMP в качестве рабочего каталога, что означало, что новый процесс не имел к нему доступа. Указание -WorkingDirectory $env:windir в команде Start-Process разрешило проблему.

3
ответ дан Community 4 September 2018 в 09:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: